Всем привет ситуация такая. Вот функция с помощью которой я передаю значение переменной в page.html.twig это функция находится в stark.theme
<?php
function stark_preprocess_page (&$varia){
$varia['test_varia']= 'Test';
}
?>
А вот прописываю в page.html.twig
Тут все работает. А как все сделать тоже самое но для файла menu--mein.html.page
Пробовал так но не работает
<?php
function stark_preprocess_menu_mein (&$varia){
$varia['test_varia']= 'Test';
}
?>
И еще вопросик как сделать все то же но через render у меня не получается. Делал так:
<?php
function page()
{
$tmp ="Тест";
return $this->render('templates/page/page.html.twig', [
'key' => $tmp
]);
}
?>
В page прописываю {{key}}; и не чего не выходит. Как быть.
Комментарии
<?php
//mytheme or mymodule
...
/**
* 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'])) {
$variables['content']['#top_parent'] = [
'title' => $menu_content->getTitle(),
'url' => $menu_content->getUrlObject(),
'is_current' => ($current_path == $item_path)
];
}
}
...
?>
{% 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 %}
@see https://drupal.stackexchange.com/questions/247187/adding-more-variables-...
@see https://drupal.stackexchange.com/questions/203571/able-to-use-custom-var...
все что я понял это то что я должен поставить два нижних подчеркивания:
для файла menu--mein.html.page
<?php
function stark_preprocess_menu__mein (&$varia){
$varia['test_varia']= 'Test';
}
?>
Но это не помогает. Мне сложно разбираться в чужих примерах я со своими ладу дать не могу вы бы мой код подправили указав на ошибку.
Спасибо все сработало. а какие еще есть альтернативы передачи данных из php в twig .
<?php hook_preprocess_HOOK() ?>
Собственно, вы с него начали. Но в случае с меню он не канает для передачи переменных в Twig без альтеринга реестра темы.
UPD. Вспомнил. В случае с сущностями можно добавить виртуальное поле (произвольные данные) из хука
<?php hook_entity_view() ?>
А в каких случаях не передается? Добавленные через
MYTHEME_preprocess_menu()
доступны вmenu.html.twig
(и в других производных шаблонах) без манипуляций с реестром темы. Или речь о чем-то другом?Я выше дал ссылку на https://drupal.stackexchange.com/questions/203571/able-to-use-custom-var... . Там довольно подробно описана проблема и потенциальное решение:
Т.е. видимо в случае с меню причина в несколько ином механизме/слое обработки. Переменные предварительно должны быть объявлены в registry_info.
Странно. Может какой-то специфический случай. Объявление через ключ 'variables' один из двух стандартных способов, используется во многих, если не в большинстве хуков тем. Я даже специально сейчас проверил на 8.9 и на 9,1 THEME_preprocess_menu + menu.html.twig работает без проблем.
Я не знаю, что тут добавить. Как бы тоже считал hook_preprocess_HOOK универсальным способом.
Приведите ваше решение, возможно поможет ТС.
Собственно стандартное решение должно работать
<?php
/**
* Implements hook_preprocess_HOOK().
*/
function MYTHEME_preprocess_menu(&$variables) {
if ($variables['menu_name'] === 'main') {
$variables['my_var'] = 'Custom text here';
}
}
?>
и в шаблоне menu--main.html.twig
Можно вместо
MYTHEME_preprocess_menu()
использовать хук-специфичнуюMYTHEME_preprocess_menu__main()
(два подчеркивание перед main), тогда можно не проверять$variables['menu_name']
Ну и не забыть перестроить кэш
Спасибо буду разбераться