デフォルトの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がどこにも表示されませんでした
ここに私が行った実際のプロジェクトの例があります:
/**
* 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
関数を使用するように努力する必要があります。それを回避する方法がない限り、ハードコードされたアンカーではありません。
メニューの名前に注意してください。たとえば、新しい変数をメインメニューに割り当てる場合は、次のようにする必要があります。
function mytheme_theme_registry_alter(&$theme_registry) {
$theme_registry['menu__main']['variables']['top_parent'] = [];
}