Существует два типа блоков, и метод их рендеринга немного отличается:
Блоки контента
Блоки контента - это блоки, которые вы создаете в интерфейсе. Они очень похожи на настраиваемые узлами структуры данных, с полями и т. Д. Если вы хотите визуализировать одну из них, вы можете делать то, что вы обычно делаете с сущностями, загружать их и визуализировать их с помощью построителя представлений:
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
Блоки плагинов
Блоки также могут быть плагинами, определенными в различных модулях. Примером может служить блок с хлебными крошками. Если вы хотите отрендерить их, вам нужно будет использовать менеджер блочных плагинов.
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
Конфигурация сущностей
Для этих двух типов общими являются блоки, которые, как только вы вставите их в область, создадут объект конфигурации, который имеет все настройки для блока. В некоторых случаях будет более полезной обработка конфигурационных объектов. Поскольку один и тот же блок может быть размещен в нескольких регионах с различной конфигурацией, он может стать более сложным, если использовать объекты конфигурации блока. Приятно то, что вам может потребоваться визуализировать блок с определенной конфигурацией, но плохо то, что идентификаторы конфигурации могут измениться, связавшись с интерфейсом, поэтому код может не работать после того, как пользователь сможет использовать интерфейс блока.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
Для отображения только вашего блока в ваших шаблонах с предварительной обработкой лучше всего
И в вашей
page.html.twig
илиnode.html.twig
илиxxx.html.twig
используйте вашу переменную My_region, как это:И в рендеринг массив (пользовательский модуль), например, в контроллер, пользовательский в content ():
С помощью
бесполезен, поскольку Drupal уже предполагает рендеринг в D8, и это устарело . Вы должны использоватьdrupal_render
\Drupal::service('renderer')->renderRoot()
вместо этого.Это немного тяжело, лучше использовать систему максимальной площади и не добавлять блок загрузки из препроцесса. В случае использования контроллера в ваших модулях это кажется оправданным.
источник
element-content
свойствах в массиве рендеринга. Вы знаете, где это задокументировано?\Drupal\block\Entity\Block::load
не возвращает блок все время. Он возвращает что-то, только если загруженный блок помещается в представление в макете блока . Если это не помещено, это возвращает нуль.\Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
В дополнение к верхнему ответу ... Если вы хотите визуализировать блок из представления, вам, возможно, придется сделать что-то немного по-другому.
(отображаемое имя, например -> block_1)
Так как мы собираемся передать его ветке, нам не нужно рендерить (используя сервис рендеринга).
Таким образом, вы можете просто передать его как переменную twig (для этого примера это возврат контроллера):
в вашем модуле вам нужна hook_theme () для вашей переменной:
И, наконец, в вашем шаблоне ветки:
источник
Мне нужно было получить HTML-код пользовательского блока и получить его с помощью:
источник
__toString()
.источник
drupal_render
или оказания услуг.drupal_render
ограничен, но получение рендеринга массива с визуализированным содержимым довольно плохо, вы должны$block_content
вместо этого вернуть , массив рендеринга может быть изменен перед фактическим рендерингом, и вы должны позволить Drupal делать рендеринг настолько, насколько это возможно, или делать это самостоятельно.В основном, есть два типа рендеров.
Когда в макете есть существующий экземпляр блока. блок может быть обработан в ветке, используя препроцесс как
$ block = Block :: load ('BLOCK_ID'); $ variable ['social_links'] = \ Drupal :: entityTypeManager () -> getViewBuilder ('block') -> view ($ block);
Там нет экземпляра или конфигурации для блока. Затем в препроцессоре нам нужно создать экземпляр, построить блок и затем отобразить его.
$ block_manager = \ Drupal :: service ('plugin.manager.block'); $ config = []; $ plugin_block = $ block_manager-> createInstance ('farmjournal_social_sharing', $ config); $ render = $ plugin_block-> build (); $ variable ['farmjournal_social_sharing'] = render ($ render);
источник
Кажется, это работает для плагинов блоков.
источник
Вы получаете блок вывода:
И тогда вы можете вернуть вывод разными способами:
или:
источник
\Drupal::service ('renderer')->render ($block_content)
может быть сделано какdrupal_render ($block_content)
Однако последний устарел в Drupal 8.drupal_render
или оказания услуг.drupal_render
ограничен, но получение рендеринга массива с визуализированным содержимым довольно плохо, вы должны$block_content
вместо этого вернуть , массив рендеринга может быть изменен перед фактическим рендерингом, и вы должны позволить Drupal делать рендеринг настолько, насколько это возможно, или делать это самостоятельно. То, что вы возвращаете, должно быть снова обработано, что делает бессмысленным рендерингОсновываясь на моих исследованиях, вы можете основать код из Как программно визуализировать блок в Drupal 8 . Вы также можете изменить
в нечто такое простое, как:
прикрепить его, например, в переменную возврата страницы.
источник
drupal_render
или оказания услуг.drupal_render
ограничен, но получение рендеринга массива с визуализированным содержимым довольно плохо, вы должны$block_content
вместо этого вернуть , массив рендеринга может быть изменен перед фактическим рендерингом, и вы должны позволить Drupal делать рендеринг настолько, насколько это возможно, или делать это самостоятельно.