|
|
|
|
|
|
Всякое |
Программный вывод блоков в 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 блока. Источники Это всего лишь часть задуманной статьи о работе с блоками в Drupal. Программная часть... To bo continued. |
|
Direqtor Home Page by ASIADATA. |
|
Отправить комментарий