Drupal → Как программно вывести блок

08.06.2010

Drupal 7

Вывести блок полностью с заголовком и контекстными ссылками:

$block = block_load($module_name, $block_delta);
$blocks = _block_render_blocks(array($block));
$blocks_build = _block_get_renderable_array($blocks);
echo drupal_render($blocks_build);

Вывести только контент блока:

$block = block_load($module_name, $block_delta);
$blocks = _block_render_blocks(array($block));
$blocks_build = _block_get_renderable_array($blocks);
unset($blocks_build[$module_name . '_' . $block_delta]['#theme_wrappers']);
echo drupal_render($blocks_build);

Подробнее на drupal.org.

Drupal 6

$block = module_invoke($module_name, 'block', 'view', $block_delta);
echo $block['content'];

Где $module_name это имя модуля, в котором определён блок, а $block_delta — номер блока. Эти параметры можно посмотреть в адресной строке при настройке блока (скриншот).

Пример вывода содержимого блока с идентификатором 6, созданного из админки (admin/build/block/add):

$block = module_invoke('block', 'block', 'view', 6);
echo $block['content'];

Вывод блока "Сейчас на сайте":

$block = module_invoke('user', 'block', 'view', 3);
echo $block['content'];

Вывод блока "Основное меню":

$block = module_invoke('menu', 'block', 'view', 'primary-links');
echo $block['content'];
Написанное актуально для
Drupal 6, Drupal 7
Похожие записи

Комментарии

Славик
06.04.2011, 09:07

Почему-то все модули отличный от block возвращают помимо содержимого блока и заголовок, а block - нет (может только у меня, но в недрах кода самого модуля вроде тоже упоминается только содержимое)

$block = module_invoke('block', 'block', 'view', 5);
Гость
14.09.2011, 01:11

Добавлю от себя капельку света:
Для того, чтобы вывести программно блок, созданный модулем, код будет таким:

$block = module_invoke('название_модуля', 'block', 'view', 'название_блока'); ?>
    print $block['content'];

К примеру, выводя блок, созданный модулем views - similar by terms, пишем такой код:

$block = module_invoke('views', 'block', 'view', 'Similarterms_viewname-block_1'); ?>
    print $block['content'];

(название блока смотрим таким же образом

Татьяна
11.01.2012, 20:01

Может вы сможете дать мне совет.
Сделала блок программно: выборка из базы данных изображений ноды и столкнулась с такой проблемой - на части страниц блок работает, на части только альтернативный текст изображений. Код следующий:
<?php
while ($date = db_fetch_object($query_result)) {
$imgpath = $date->filepath;
$img_tag = "";
$block_content.=$img_tag;
}// end while
?>
Права доступа проверила, фильтры тоже, а в чем проблема, не пойму.

Гость
15.04.2013, 02:43

Стоит модуль "Popup" который показывает блок с "webform".
если я задаю:
<?php $block = module_invoke('webform', 'block_view', 'client-block-999');
echo render($block['content']); ?>
то выводится сама форма а не ссылка при нажатии на которую должна появиться форма.
Подскажите что прописать чтобы отображалась именно ссылка модуля "Popup".
з.ы. Блок с формой настроен именно на отображение с помощью Popup.

А кэширование при программном выводе работает?

webpavilion
11.10.2013, 15:33

Мне кажется вот так "правильнее" в D7 блоки выводить:

  $block = block_load('search', 'form');
  $block_content = _block_render_blocks(array($block));
  $build = _block_get_renderable_array($block_content);
  print drupal_render($build);

он и с кэшем будет и с Contextual links

Сергей
13.02.2014, 10:03

А можно ли в D7 подобным образом вывести в содержимом блоком форму добавления ноды? /node/add/blog к примеру

Игорь
28.04.2015, 13:41

Хотел бы рассказать про модуль context - пользуются им многие аж 184 тыс. У вас на сайте про него я ни чего не нашел, может плохо искал ;-)
Пишу про него на этой странице, так как он, например, может вывести блок в разных местах в зависимости от условий. Мне вот понадобилось вывести блок в левой колонке на всех страницах, кроме главной, а на главной в нём написал быстро условие и вывел в другой области. Без php и удобно.

По поводу модуля "Popup" который показывает блок с "webform".
вывел вот так:

<?php 
$block = block_load('webform', 'client-block-5');
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
print drupal_render($build); 
?>

Спасибо webpavilion!
Коммент http://xandeadx.ru/blog/drupal/133#comment-9210

Мне кажется вот так "правильнее" в D7 блоки выводить:

$block = block_load('search', 'form');
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
print drupal_render($build);
он и с кэшем будет и с Contextual links

никак не мог вывести стандартный блок search так, как выводит сам Drupal при добавлении блока в регион через UI

Спасибо Krio.in выручил, знать бы как работает?

<?php 
$block = block_load('webform', 'client-block-5');
$block_content = _block_render_blocks(array($block));
$build = _block_get_renderable_array($block_content);
print drupal_render($build); 
?>

Ребята а как в 8 версии это сделать?

Михаил
21.02.2021, 15:09

Может кто подскажет по 8-9.
Не могу найти как рендерить блок в my_theme.theme ? Уже закипел :(

В Твиге понятно:
ставим модуль twig tweak и
- без подхватывания файла темы - {{ drupal_entity('block_content', 1) }}
- чтобы через файл темы прогнать {{ drupal_block('block_content:UUID') }}

В файле .theme
- без подхватывания

$block = Drupal\block_content\Entity\BlockContent::load(5);
$block_view  = Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);
$block_render = render($block_view);

- через файл ....???

Михаил
21.02.2021, 21:40

https://git.drupalcode.org/project/twig_tweak/-/blob/3.x/src/View/BlockV...

Спасибо за наводку!
Если правильно понял, минимальный "набор" для вывода выглядит так:

$build = [];
$block = Drupal\block_content\Entity\BlockContent::load(5);
$block_view  = Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);
$build['content'] = $block_view;
$build += [
   '#theme' => 'block',
   '#configuration' => ['provider'=>'block_content'],
   '#plugin_id' => 'block_content:' . $block->uuid(),
   '#base_plugin_id' => 'block_content',
   '#derivative_plugin_id' => $block->uuid(),
];
$post_top_text = render($build);
Кирилл
11.04.2021, 20:42

кто-нибудь подскажет как вывести блок с раскрытым фильтром views с аргументами?
без самого представления. вывести нужно только сам фильтр. Заранее спасибо.

Добавить комментарий