Как передать значение переменной php в twig

Аватар пользователя strengerst strengerst 13 мая в 11:14

Всем привет ситуация такая. Вот функция с помощью которой я передаю значение переменной в page.html.twig это функция находится в stark.theme

<?php
function stark_preprocess_page (&$varia){

    

$varia['test_varia']= 'Test';
}
?>

А вот прописываю в page.html.twig

{{test_varia}}

Тут все работает. А как все сделать тоже самое но для файла 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}}; и не чего не выходит. Как быть.

Комментарии

Аватар пользователя OldWarrior OldWarrior 13 мая в 11:37
<?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)
    ];
  }
}
...
?>
{# Twig #}
  {% 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...

Аватар пользователя strengerst strengerst 13 мая в 11:46

все что я понял это то что я должен поставить два нижних подчеркивания:
для файла menu--mein.html.page

<?php
function stark_preprocess_menu__mein (&$varia){

$varia['test_varia']= 'Test';
}
?>
Но это не помогает. Мне сложно разбираться в чужих примерах я со своими ладу дать не могу вы бы мой код подправили указав на ошибку.

Аватар пользователя OldWarrior OldWarrior 13 мая в 21:26

<?php hook_preprocess_HOOK() ?>

Собственно, вы с него начали. Но в случае с меню он не канает для передачи переменных в Twig без альтеринга реестра темы.

UPD. Вспомнил. В случае с сущностями можно добавить виртуальное поле (произвольные данные) из хука <?php hook_entity_view() ?>

Аватар пользователя charOFF charOFF 14 мая в 11:01

OldWarrior wrote: Но в случае с меню он не канает для передачи переменных в Twig без альтеринга реестра темы.

А в каких случаях не передается? Добавленные через MYTHEME_preprocess_menu() доступны в menu.html.twig (и в других производных шаблонах) без манипуляций с реестром темы. Или речь о чем-то другом?

Аватар пользователя OldWarrior OldWarrior 14 мая в 13:02

charOFF wrote: А в каких случаях не передается?

Я выше дал ссылку на https://drupal.stackexchange.com/questions/203571/able-to-use-custom-var... . Там довольно подробно описана проблема и потенциальное решение:

The menu theme is declared using the variables key (see doc).

That means that only the keys present in the variables array can be passed to the template.

Any custom variable needs to be first added using hook_theme_registery_alter

Т.е. видимо в случае с меню причина в несколько ином механизме/слое обработки. Переменные предварительно должны быть объявлены в registry_info.

Аватар пользователя charOFF charOFF 14 мая в 13:22

Странно. Может какой-то специфический случай. Объявление через ключ 'variables' один из двух стандартных способов, используется во многих, если не в большинстве хуков тем. Я даже специально сейчас проверил на 8.9 и на 9,1 THEME_preprocess_menu + menu.html.twig работает без проблем.

Аватар пользователя OldWarrior OldWarrior 14 мая в 13:46

Я не знаю, что тут добавить. Как бы тоже считал hook_preprocess_HOOK универсальным способом.

Приведите ваше решение, возможно поможет ТС.

Аватар пользователя charOFF charOFF 14 мая в 14:33

Собственно стандартное решение должно работать

<?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

{{ my_var }}

Можно вместо MYTHEME_preprocess_menu() использовать хук-специфичную MYTHEME_preprocess_menu__main() (два подчеркивание перед main), тогда можно не проверять $variables['menu_name']
Ну и не забыть перестроить кэш