Програматично візуалізуйте блок у шаблоні гілочок


28

Мені потрібно надати блок перегляду в моєму шаблоні page.html.twig. У D7 я би зробив це:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

У Drupal 8 модуль_invoke застарілий і рекомендується використовувати це: (Я додав ім'я блоку як другий параметр)

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

Я спробував кілька речей. Спочатку спробував це зробити в шаблоні гілочок, але я не знаю, як викликати функції php у шаблоні гілочок, щоб це не вийшло занадто добре.

Тоді я зателефонував у функції .predme_page () у файлі .theme, але, перш ніж я міг змусити його працювати, я спробував щось простіше просто спробувати зробити змінну роботу всередині шаблону гілочки, який не працював, наприклад:

У функції template_preprocess_page (& $ vars) у файлі .theme:

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

Я спробував зателефонувати до my_var всередині шаблону гілочки, але це не спрацювало, і мені надійшло повідомлення про помилку із записом "На сайті є помилка. Зверніться до адміністратора"

Отже, підсумовуючи, ось мої запитання:

  1. Як зробити доступні змінні всередині шаблонів гілочок?
  2. Як викликати функції всередині шаблонів гілочок?
  3. Чи візуалізую блоки всередині .theme-файлу або шаблону гілочок?

Відповіді:


47

Ви знаходитесь на неправильному шляху з module_invoke (). Це просто фантазійний спосіб викликати функцію {$ module_name} _block_view ().

Те, що він змінився, не має значення, справа в тому, що блокова система повністю змінилася в 8.x і тепер використовує плагіни та конфігураційні об'єкти, цих функцій більше не існує.

У вас є кілька варіантів.

a) Повторне використання існуючого об'єкта конфігурації блоку та перегляд його. Дуже просто, але вимагає, щоб ця конфігурація існувала, наприклад, як відключений блок.

$block = \Drupal\block\Entity\Block::load('your_block_id');
$variables['block_output'] = \Drupal::entityTypeManager()
  ->getViewBuilder('block')
  ->view($block);

b) Створіть екземпляр плагіну блоку безпосередньо, передайте йому конфігурацію (ідентифікатор модуля блоку та конфігурацію можна легко знайти в експортованому об'єкті конфігурації блоку). Мінус полягає в тому, що ви не отримуєте кешування візуалізації, але якщо ви відображаєте його де-небудь, що вже є кешованим (як шаблон вузла), це насправді не має значення.

$variables['block_output'] = \Drupal::service('plugin.manager.block')
  ->createInstance($plugin, $configuration)
  ->build();

c) У випадку перегляду ви також можете завантажити його безпосередньо та відобразити.

г) Ви також можете повністю переосмислити свій підхід та використати блоки блоків або Менеджер сторінки (який використовує стандартні модулі блоків у 8.x).


Спасибі за вашу відповідь. Я хотів би поїхати з A або B. Регіон буде працювати, але я хочу уникати використання регіону. Єдина проблема, яка виникає у мене, коли я викликаю block_output у шаблоні гілочок, у мене є помилка - "Несподіване ім'я тегу" block_output ", тому я не знаю, як зробити цю змінну доступною, хоча я створив її у функції prepcess_page. Я спробую розібратися.
Rick Bergmann,

Здається, ви використовуєте {%? Використовуйте {{block_output}}.
Бердір

Так, це було! Ще намагаються дістати звисання гілочки. Спасибі.
Рік Бергманн

Оскільки Drupal 8.0.0 entitManager застарілий. Замість цього використовуйте entitTypeManager .
Філіп Майкл

куди я кладу цей код? $ block = \ Drupal \ block \ Entity \ Block :: load ('your_block_id'); $ змінних ['block_output'] = \ Drupal :: entitManager () -> getViewBuilder ('блок') -> перегляд ($ блок); Дякую!

11

У Drupal 8 це працює для надання блочного модуля (тобто такого, який ви створили у користувацькому модулі) у препроцессі_уку:

function mymodule_preprocess_something(array &$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), вам потрібно завантажити його таким чином:

    // Load Instance of custom block with variables
    $example_block = \Drupal::entityManager()->getStorage('block')->load('example_block_machine_name');
    if (!empty($example_block)){
      $example_block_content = \Drupal::entityManager()
        ->getViewBuilder('block')
        ->view($example_block);
      if ($example_block_content) {
        // Add block content to build array
        $variables['content']['custom_block_output'] = $example_block_content;
      }
    }

1
Це було рішенням для мене і, безумовно, найпростішим.
Гійом Буа

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.