Надо было вставить блок в произвольное место страницы. Нашел статью, перевел. Решил, может, кому еще понадобится. Автор: Aaron Hawkins
Источник: http://www.pixelclever.com/node/36
Существует несколько способов вставить блоки в страницу сайта на Друпале. Можно использовать панели, можно добавить область (регион) к теме или можно сделать это программно на php. Хотя это и не очевидно с первого взгляда, бывают ситуации, когда вставить блок программно намного легче, чем использовать другие методы.
Хорошим примером этого является случай, когда вы хотите добавить свой блок в необычное положение (например, в правый верхний угол страницы), что нельзя сделать при помощи панелей. Добавление новой области нарушит всю разметку, и здесь на помощь приходит php. Я покажу вам короткий сниппет, который позволяет вставить блок в любое место системы, а затем объясню, как это работает.
<?php
$block = module_invoke('jquerymenu', 'block', 'view', 0);
print $block['content'];
?>
Для использования вышеприведенного кода нужно понимать, как вы можете настроить его для своего сайта или расширить его использование (модуль module_invoke может использоваться гораздо шире, чем просто для вызова блоков). module_invoke позволяет вызвать специальную процедуру из конкретного модуля Drupal и использования ее возвращаемое значение. Процедура, которую в данном случае мы будем использовать, будет hook_block (). module_invoke принимает следующие аргументы:
- Модуль: Имя модуля, так как оно записано для его каталога. В нашем случае мы вызываем модуль jquerymenu для того чтобы получить один из его блоков. (обратите внимание, что если вы запишите имя с пробелами или разметкой html, отличающейся от нижнего подчеркивания, то вы используете неправильное имя).
- Элемент: Функция элемента, который вы хотите вставлять, такая как hook_block, hook_menu, hook_cron и т.д. Аргумент должен быть записан без “hook_”.
- Аргументы, которые будут засылаться в эту функцию: Их может быть несколько, разделенных запятой. В нашем случае мы вызываем hook_block и посылаем аргумент “view” для аргумента “$op” и “0” для аргумента “$delta”.
Где мне получить информацию о блоке, который я пытаюсь вызвать?
Проще всего пойти на страницу блоков и навести мышь на ссылку на конфигурацию. Не нажимая на нее, посмотрите в левый нижний угол своего броузера (по крайней мере в Firefox). Самыми важными элементами являются два последних в URL. Так, если URL ссылки admin/build/block/configure/jquerymenu/0, это значит, что модуль, создавший этот блок, jquerymenu и его номер «0».
Таким образом, пример кода вызывает module_invoke со следующими элементами: 'jquerymenu', 'block', 'view', 0. С его помощью вызывается модуль 'jquerymenu', затем его hook_block, ему сообщается, что нужна информация под $op = ‘view’ от блока с $delta = 0.
Получив переменную $block (которая является массивом) нам нужно получить содержимое, вызвав $block[‘content’]. Вы можете также вызвать заголовок, используя $block[‘title’].
Я надеюсь, что этот код имеет для вас смысл. Больше информации о module_invoke можно получить из http://api.drupal.org/api/function/module_invoke.
Все вышесказанное было от имени автора статьи. Некоторые другие переводы есть на моем сайте.
Комментарии
print theme('block', $block);
это что бы кошерно было, по друпаловски -)
А вот и не работает такой кошерный вариант.
Подскажите пожалуйста - как вывести таким образом блок созданный views (Exposed Filters) ?
РЕШЕНО
<?php
$block = module_invoke('views', 'block', 'view', '-exp-tst-block_1');
echo $block['subject'];
echo $block['content'];
?>
-exp-tst-block_1 имя блока views, как написано выше имя блока можно узнать наведением на ссылку (на странице блоков)
хм, а если так всегда программно выводить, выходит, что блок всегда заново будет подгружаться? тогда никакой кэш не поможет сдержать затраты памяти и времени.
что на счет этого?
+5
Полезно-спасибо.