Как программно ввести блок в файл tpl или в контент сайта

Главные вкладки

Аватар пользователя yustos.com yustos.com 3 сентября 2009 в 13:03

Надо было вставить блок в произвольное место страницы. Нашел статью, перевел. Решил, может, кому еще понадобится. Автор: 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 принимает следующие аргументы:

  1. Модуль: Имя модуля, так как оно записано для его каталога. В нашем случае мы вызываем модуль jquerymenu для того чтобы получить один из его блоков. (обратите внимание, что если вы запишите имя с пробелами или разметкой html, отличающейся от нижнего подчеркивания, то вы используете неправильное имя).
  2. Элемент: Функция элемента, который вы хотите вставлять, такая как hook_block, hook_menu, hook_cron и т.д. Аргумент должен быть записан без “hook_”.
  3. Аргументы, которые будут засылаться в эту функцию: Их может быть несколько, разделенных запятой. В нашем случае мы вызываем 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.
Все вышесказанное было от имени автора статьи. Некоторые другие переводы есть на моем сайте.

Комментарии

Аватар пользователя MITSUFAN MITSUFAN 17 ноября 2009 в 12:45

kosilko wrote:
print theme('block', $block);
это что бы кошерно было, по друпаловски -)

А вот и не работает такой кошерный вариант.

Аватар пользователя Clarion Clarion 3 марта 2010 в 1:52

Подскажите пожалуйста - как вывести таким образом блок созданный 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, как написано выше имя блока можно узнать наведением на ссылку (на странице блоков)

Аватар пользователя aksernar aksernar 13 марта 2011 в 0:24

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