Программно отображать блок в шаблоне веточки

Мне нужно визуализировать блок views в моем шаблоне page.html.twig. В D7 я бы сделал следующее:

  & л;? PHP
  $ block = module_invoke ('module_name', 'block_view', 'block_delta');
  print render ($ block ['content']);
? & GT;
 

В Drupal 8 module_invoke устарел и рекомендуется использовать это: (Я добавил имя блока в качестве второго параметра)

  Drupal :: moduleHandler () -> invoke ($ block, 'views_block__blog_block_1', $ args = array ());
 

Я пробовал несколько вещей. Сначала я попытался сделать это в шаблоне ветви, но я не знаю, как вызвать php-функции в шаблоне ветки, чтобы это не получилось слишком хорошо.

Затем я вызвал функцию в функции preprocess_page () в файле .theme, но прежде чем я смог ее запустить, я попробовал что-то более простое, чтобы попытаться заставить переменную работать внутри шаблона ветки, которая тоже не работала, для пример:

В функции template_preprocess_page (& amp; $ vars) в файле .theme:

  $ test = 'Hello World';
$ vars ['$ my_var'] = $ test;
 

Я попытался вызвать my_var внутри шаблона twig, но это не сработало, и у меня появилось сообщение об ошибке «У сайта есть ошибка, обратитесь к администратору»

Итак, подведем итоги, вот мои вопросы:

  1. Как сделать переменные доступными внутри шаблонов ветви?
  2. Как мне вызвать функции внутри шаблонов ветви?
  3. Я выполняю блокирование внутри файла .theme или шаблона ветви?
26 голосов | спросил Rick Bergmann 29 MarpmSun, 29 Mar 2015 16:41:06 +03002015-03-29T16:41:06+03:0004 2015, 16:41:06

3 ответа


46

У вас неправильный трек с module_invoke (). Это просто причудливый способ вызова функции {$ module_name} _block_view ().

Тот факт, что он изменился, не имеет значения, дело в том, что блок-система полностью изменилась в 8.x и теперь использует плагины и объекты конфигурации, эти функции больше не существуют.

У вас есть несколько вариантов.

a) Повторно используйте существующий объект конфигурации блока и просмотрите его. Очень просто, но требует, чтобы конфигурация существовала, например. как заблокированный блок.

  $ block = \ Drupal \ block \ Entity \ Block :: load ('your_block_id');
$ variables ['block_output'] = \ Drupal :: entityTypeManager ()
  - & GT; getViewBuilder ( 'блок')
  - & GT; вид ($ блок);
 

b) Создайте экземпляр блока плагинов напрямую, передайте ему конфигурацию (вы можете легко найти идентификатор блока плагина и конфигурацию в экспортированном объекте конфигурации блока). Недостатком является то, что вы не получаете кэширование рендеринга, но если вы покажете его где-то, что уже кэшировано (например, шаблон узла), это не имеет особого значения.

  $ variables ['block_output'] = \ Drupal :: service ('plugin.manager.block')
  -> createInstance ($ plugin, $ configuration)
  - & GT; построить ();
 

c) В случае просмотра вы также можете загрузить изображение прямо и отобразить его.

d) Вы также можете полностью пересмотреть свой подход и использовать области блоков или Диспетчер страниц (в котором используются стандартные плагины блоков в 8.x).

ответил Berdir 29 MarpmSun, 29 Mar 2015 21:30:19 +03002015-03-29T21:30:19+03:0009 2015, 21:30:19
10

В Drupal 8 это работает для рендеринга блочного плагина (то есть того, который вы создали в пользовательском модуле) в preprocess_hook:

  function mymodule_preprocess_something (array & amp; $ variables) {
  $ customblock = \ Drupal :: service ('plugin.manager.block') -> createInstance ('my_custom_block', []);
  $ variables ['content'] ['custom_block_output'] = $ customblock-> build ();
}
 

Затем вы можете отобразить его в своем шаблоне ветки:

  {{content.custom_block_output}}
 

Примечание. Это приведет к загрузке общей версии вашего блока. Если вы хотите загрузить экземпляр вашего блока с помощью переменных (после того, как вы создали его в /admin /structure /block), вы должны загрузить его следующим образом:

  //Загрузка экземпляра настраиваемого блока с переменными
    $ example_block = \ Drupal :: entityManager () -> getStorage ('block') -> load ('example_block_machine_name');
    if (! empty ($ example_block)) {
      $ example_block_content = \ Drupal :: entityManager ()
        - & GT; getViewBuilder ( 'блок')
        - & GT; вид ($ example_block);
      if ($ example_block_content) {
        //Добавление блочного содержимого для построения массива
        $ variables ['content'] ['custom_block_output'] = $ example_block_content;
      }
    }
 
ответил oknate 20 PMpWed, 20 Apr 2016 22:33:24 +030033Wednesday 2016, 22:33:24
3

Вы можете использовать Twig tweak модуль для этого, затем вы можете использовать следующий синтаксис:

  <dd> {{drupal_block ('myblock')}} </dd>
 

Связано: Как программно разместить блок?

ответил kenorb 22 J000000Saturday17 2017, 22:34:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132