web-dev-qa-db-ja.com

menu.html.twigで使用するメニューに変数を追加する

デフォルトのmenu_name、items、およびattributesの他に、操作する変数をメニューに与えようとしています。これは、プリプロセスメニューフックで変数を作成すると、menu.html.twigテンプレートで変数にアクセスできないためです。

私の最終的な目標は、パスにユーザーIDを含むメニュー項目を追加できるようにすることです。

Hook_theme_registry_alterを使用してメニューにvarを追加し、 https://api.drupal.org/api/drupal/core%21includes%21theme.inc/function/drupal_common_theme/8.2)の形式に従う必要があると思います。 x

だから私は私のように私のテーマのメニューに変数を追加しようとしました

function mytheme_theme_registry_alter(&$theme_registry){
    $theme_registry['menu']['variables']['test_var'] = 'testing theme registry alter';
}

しかし、そうすると、menu.html.twigをそのように変更しても何も表示されません

<nav {{ attributes.addClass(navClasses) }} aria-label="MyWPT Menu Mobile" role="navigation" style="display:none;">
    {{ menus.menu_links(items, attributes, 0) }}
{#     {% macro menu_links(items, attributes, menu_level) %} #}
    {% macro menu_links(items, attributes, menu_level) %}
    {% import _self as menus %}
    {% if items %}
    {% if menu_level == 0 %}
    <ul class="vertical menu" data-drilldown>
        {% else %}
        <ul class="vertical menu">
            {% endif %}
            {% for item in items %}
                {% if item.below %}
                    <li class="is-dropdown-submenu-parents">
                {% else %}
                    <li{{ item.attributes }}>
                {% endif %}
                {{ link(item.title, item.url) }}
                {% if item.below %}
                    {{ menus.menu_links(item.below, attributes, menu_level + 1) }}
                {% endif %}
                </li>
            {% endfor %}

            <li><a href="/">{{ test_var }}</a></li>
        </ul>
        {% endif %}
        {% endmacro %}

Menu.html.twigで使用するメニュー変数をさらに追加するにはどうすればよいですか?

更新:私も{{menus.test_var}}を試しましたが、ページを壊しました

更新2:{{kint()}}を使用すると、test_varがどこにも表示されませんでした

1
Matt

ここに私が行った実際のプロジェクトの例があります:

mytheme.theme:

/**
 * Implements hook_theme_registry_alter().
 * @param $theme_registry
 */
function mytheme_theme_registry_alter(&$theme_registry) {
  $theme_registry['menu']['variables']['top_parent'] = [];
}

/**
 * Implements hook_preprocess_block__menu_block().
 * @param $variables
 */
function mytheme_preprocess_block__menu_block(&$variables) {
  // set the top parent on the left nav
  if ($variables['elements']['#id'] == 'left_navigation' && !empty($variables['elements']['content']['#items'])) {
    // code removed

    $variables['content']['#top_parent'] = [
      'title' => $menu_content->getTitle(),
      'url' => $menu_content->getUrlObject(),
      'is_current' => ($current_path == $item_path)
    ];
  }

  // code removed
  }
}

小枝で:

  {% if menu_level == 0 %}
    <li class="left-nav__item active-trail is-active {% if top_parent.is_current %}is-current{% endif %}">
      {{ link(top_parent.title, top_parent.url) }}
    </li>
  {% endif %}

追加する部分が不足している可能性がありますtest_varコンテンツ配列へのキー:

$variables['content']['#test_var'] = "whatever";

フラグを付けることを除いてis-current、あなたは私と同じことをやろうとしているようです。 Twigでlink関数を使用するように努力する必要があります。それを回避する方法がない限り、ハードコードされたアンカーではありません。

2
Kevin

メニューの名前に注意してください。たとえば、新しい変数をメインメニューに割り当てる場合は、次のようにする必要があります。

function mytheme_theme_registry_alter(&$theme_registry) {
  $theme_registry['menu__main']['variables']['top_parent'] = [];
}
0
moeb