Программный вывод блоков в Drupal

Необходимость вывода блока в нештатном месте возникает в друпал не очень часто. Системных возможностей и настроек вывода блоков в регионы, а также нескольких модулей для работы с ними в теле нод хватает для подавляющего большинства случаев. Но иногда надо организовать и программный вывод одного или нескольких блоков там, где Макар телят ещё не гонял.

К моему удивлению в API Drupal отсутствует функция block_load(), которая бы позволяла получить нужный блок целиком без лишних телодвижений. Этому, видимо, есть какая-то причина (историческая или функциональная), но мне как-то лень копаться в предыстории вопроса. Поэтому принимаю как данность, что программно, произвольный блок можно получить только прямым вызовом хука hook_block().

В качестве примера выведем содержимое блока «Последние комментарии»:

$module = 'comment'; // Системное имя модуля комментариев
$delta = 0; // Идентификатор блока в модуле
// Хук возвращает массив. Поскольку функция темизации требует объекта, то его требуется преобразовать.
$block = (object) module_invoke($module, 'block', 'view', $delta);
// Выводим блок полностью
print theme('block', $block);
// Если требуется только содержимое блока, то оно находится в $block->content
// или в $block['content'] без приведения типа

У этого кода есть один недостаток – он выводит блок всегда, безотносительно его настроек на странице управления блоками. Настройки видимости блока по страницам сайта можно не учитывать, как и вывод блока в системные регионы, поскольку мы выводим его точечно, в нужном нам месте, но вот видимость блока для ролей пользователей учесть стоит. Для этого придётся получить дополнительную информацию из таблицы blocks_roles.

$module = 'comment'; // Системное имя модуля комментариев
$delta = 0; // Идентификатор блока в модуле
// Вытаскиваем пользователя и получаем его роли и тему сайта
global $user;
$block = NULL;
$rids = array_keys($user->roles);
$theme = $user->theme;
// Делаем запрос к таблицам, где есть данные о доступности блока по ролям
$result = db_query("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.module = '%s' AND b.delta = '%s' AND (r.rid IN (%s) OR r.rid IS NULL)", $theme, $module, $delta, implode(',', $rids));
// Если в таблице указана доступность блока роли текущего пользователя, то получаем блок.
if(db_fetch_array($result)) $block = (object) module_invoke($module, 'block', 'view', $delta);
// Выводим блок
print theme('block', $block);

Оба варианта можно использовать везде на сайте, где допустим PHP-код. Это могут быть PHP-сниппеты в страницах сайта, перекрытые вами функции темизации, файлы шаблонов темы, их препроцесс-функции, а также код вашего модуля. Имя модуля и $delta для нужного блока указывается прямо в коде. Чтобы определить значения этих переменных для нужного вам блока найдите его на странице admin/build/block, нажмите ссылку «настроить» и посмотрите в адресную строку браузера. Сразу после admin/build/block/configure через слеш идёт имя модуля, через следующий слеш $delta блока.

Источники

Функция block_list()

Это всего лишь часть задуманной статьи о работе с блоками в Drupal. Программная часть... To bo continued.

картинка очень хорошо

картинка очень хорошо сочитается с кодом :)

:) Еще надо башенный кран и

:) Еще надо башенный кран и бадью с бетоном.

Спасибо что поведали эту

Спасибо что поведали эту информацию

Не понял как вывести Если

Не понял как вывести Если требуется только содержимое блока?
на примере вывод блока модуля google cse, поиск..

 <?php
$module = 'google_cse'; // Системное имя модуля
$delta = 0; // Идентификатор блока в модуле
// Хук возвращает массив. Поскольку функция темизации требует объекта, то его требуется преобразовать.
$block = (object) module_invoke($module, 'block', 'view', $delta);
// Выводим блок полностью
print theme ('block', $block);
// Если требуется только содержимое блока, то оно находится в $block->content
// или в $block['content'] без приведения типа
    ?>

разобрался  <?php $module =

разобрался

 <?php
$module = 'google_cse'; // Системное имя модуля
$delta = 0; // Идентификатор блока в модуле
// Хук возвращает массив. Поскольку функция темизации требует объекта, то его требуется преобразовать.
$block = (object) module_invoke($module, 'block', 'view', $delta);
// Выводим блок полностью
$print = print $block->content
// Если требуется только содержимое блока, то оно находится в $block->content
// или в $block['content'] без приведения типа
    ?>

брана

Очень понравился ваш сайт набором интересной информации, которая присутствует на нём. Если кому-то понадобилась услуга аренда крана, то пусть смело обращается на этот ресурс, здесь есть много нового. Остался очень доволен. Цена практичная, качество выполнения работы на высоте.

Огромное спасибо за ваш

Огромное спасибо за ваш спамерский коммент...

ничего не спам))) сами

ничего не спам))) сами пожелали башенный кран и бадью с бетоном)

а если блок создан при помощи

а если блок создан при помощи views: */admin/build/block/configure/views/views1-block_1
$module - views, а $delta - views1-block_1
Результата нет

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <s> <u> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. Beside the tag style "<foo>" it is also possible to use "[foo]".
  • Images can be added to this post.

Подробнее о форматировании

CAPTCHA
Защита от спама: ответьте на вопрос.
Image CAPTCHA
Введите символы с картинки. Только заглавные буквы английского алфавита.