Выводим блок программно в Drupal

01 февраля 2014 - 12:52

Задача – вывести любой блок в шаблоне page.tpl.php, не помещая его в регион

В большинстве случаев при создании сайта на Drupal достаточно стандартного функционала, позволяющего создать блок и назначить ему регион в разделе admin/structure/block. Однако иногда возникает задача вывести один и тот же блок в различных областях макета сайта, например, в шапке главной страницы и в боковой колонке или подвале внутренних страниц. Конечно можно создать несколько одинаковых блоков и назначить им разные регионы и настройки отображения на тех или иных страницах. Но если контент в этих блоках предполагается изменять, то это влечет за собой необходимость редактирования не одного, а двух и более блоков.

Решение

Первый способ – выводим блок вместе с оберткой и заголовком

Данный способ позволяет получить и вывести в шаблоне полный html-код блока (в соответствии с шаблоном block.tpl.php). В том месте page.tpl.php, где необходимо вывести блок, помещаем код:

<?php
$block = block_load('MODULE_NAME', 'DELTA');
print drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
?>

Вместо MODULE_NAME подставляем название модуля, с помощью которого создан блок – если вы добавили блок в разделе «Структура – Блоки», то это block. Далее необходимо узнать параметр delta блока. Если вы проинспектируете код блока, например в Firebug, то найдете его id вида block-block-1. В данном случае delta блока равна 1. Параметр delta далеко не всегда является числом, если модуль был создан, например, с помощью модуля views, то его delta будет вида «news-block»). Итак, для блока с id block-block-1 указанный выше код примет вид:

<?php
$block = block_load('block', '1');
print drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
?>

Второй способ – выводим только содержимое блока

Нам не всегда нужно выводить обертку и заголовок блока. Например, для формы поиска мы вполне можем обойтись без них. В этом случае используем функцию Drupal API module_invoke():

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

Оба способа можно применять, не помещая код в шаблон напрямую, а предварительно добавив переменную с html блока в page.tpl.php с помощью функции template_preprocess_page. О том, как добавить в этой функции переменную, можно прочитать, например, здесь.

Анализ быстродействия описанных в статье способов программного вывода блока я не проводил, буду благодарен, если кто-то из уважаемых читателей данной статьи поделится своим опытом в комментариях.

Комментарии

Ваш вариант $block = block_load('block', '1'); дает ошибку Strict warning: Only variables should be passed by reference в функции include() немного переделал вывод
$block = block_load('MODULE_NAME', 'DELTA');
$block_var = _block_get_renderable_array(_block_render_blocks(array($block)));
print render ($block_var);
ошибка ушла.
Спасибо за статью помогло