Программный вывод блоков в Drupal. Drupal 7 программный вывод блока
Как программно вывести блок в Друпале
Вывод блока формы поиска.
$module_name = 'search';$block_delta = 'form';$block = module_invoke($module_name, 'block_view', $block_delta);print render($block['content']);
$module_name - имя модуля, который создает блок.$block_delta - это значение можно узнать, изучив путь в адресной строке браузера при редактировании блока в админке Drupal.Вывод блока главное меню, с заголовком и контекстными ссылками.
$module_name = 'system';$block_delta = 'main-menu';$block = block_load($module_name, $block_delta);$block = _block_render_blocks(array($block));$block_build = _block_get_renderable_array($block);print drupal_render($block_build);
Вывод блока последние материалы созданный views.$module_name = 'views';$block_delta = 'last' . '-block';$block = module_invoke($module_name, 'block_view', $block_delta);print render($block['content']);
Вывод дополнительного блока последние материалы созданный views.print views_embed_view('last', $display_id = 'block_1');
// еще один вариант вывода views$view = views_get_view('last');print $view->preview('block_1');
Вывод дополнительного блока последние материалы с помощью функции views_embed_view() с аргументами. В этом примере аргумент это id ноды.$node_id = 74;print views_embed_view('last', $display_id = 'block_1' , $node_id);
$user_id = 1;$term_id =1;print views_embed_view('views_name', 'display_id', $user_id, $term_id);>
vdrupale.com
Выводим блок программно в Drupal
Задача – вывести любой блок в шаблоне 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 указанный выше код примет вид:
Второй способ – выводим только содержимое блока
Нам не всегда нужно выводить обертку и заголовок блока. Например, для формы поиска мы вполне можем обойтись без них. В этом случае используем функцию Drupal API module_invoke():
<?php$block = module_invoke('search', 'block_view');print render($block['content']);?>
Оба способа можно применять, не помещая код в шаблон напрямую, а предварительно добавив переменную с html блока в page.tpl.php с помощью функции template_preprocess_page. О том, как добавить в этой функции переменную, можно прочитать, например, здесь.
Анализ быстродействия описанных в статье способов программного вывода блока я не проводил, буду благодарен, если кто-то из уважаемых читателей данной статьи поделится своим опытом в комментариях.
Программный вывод блоков в Drupal
Необходимость вывода блока в нештатном месте возникает в друпал не очень часто. Системных возможностей и настроек вывода блоков в регионы, а также нескольких модулей для работы с ними в теле нод хватает для подавляющего большинства случаев. Но иногда надо организовать и программный вывод одного или нескольких блоков там, где Макар телят ещё не гонял.
К моему удивлению в API Drupal отсутствует функция block_load(), которая бы позволяла получить нужный блок целиком без лишних телодвижений. Этому, видимо, есть какая-то причина (историческая или функциональная), но мне как-то лень копаться в предыстории вопроса. Поэтому принимаю как данность, что программно, произвольный блок можно получить только прямым вызовом хука hook_block().
В качестве примера выведем содержимое блока «Последние комментарии»:
$module = 'comment'; // Системное имя модуля комментариев$delta = 0; // Идентификатор блока в модуле// Хук возвращает массив. Поскольку функция темизации требует объекта, то его требуется преобразовать.$block = (object) module_invoke($module, 'block', 'view', $delta);$block->module = $module;$block->delta = $delta;// Выводим блок полностьюprint theme('block', $block);// Если требуется только содержимое блока, то оно находится в $block->content// или в $block['content'] без приведения типаИсточники
Программный вывод блоков в DrupalФункция block_list()
drupal.ru
Программное создание блока в Drupal 7
В этой заметке мы рассмотрим процесс программного создания блока с помощью хуков hook_block_info(), hook_block_view(), hook_block_configure() и hook_block_save() на примере блока содержащего слоган сайта так как по умолчанию такого блока в Drupal 7 нету.
Для этой цели мы напишем небольшой модуль Slogan block (машинное имя sb).
Первым делом создадим файл sb.info:
name = Slogan block description = Add block with site slogan. core = 7.x package = CustomТакже создадим пустой файл sb.module и включим наш новый модуль.
Для того чтобы объявить новый блок добавим в файл sb.module хук hook_block_info():
/** * Implements hook_block_info(). */ function sb_block_info() { $blocks['site_slogan'] = array( 'info' => t('Site slogan'), 'cache' => DRUPAL_CACHE_GLOBAL, ); return $blocks; } hook_block_info() - объявляет блоки предоставляемые модулем и устанавливает для них настройки по умолчанию.Теперь зададим нашему сайту тестовый слоган в разделе Site information:
Следующим шагом очистим кэш и разместим блок Site slogan в регион First sidebar:
На данном этапе блок размещен в регион и слоган сайта задан, но ничего отображается не будет так как Drupal не знает что нужно выводить в этот блок. Для этой цели мы используем hook_block_view().
Добавим в файл sb.module следующий код:
/** * Implements hook_block_view(). */ function sb_block_view($delta = '') { $block = array(); switch ($delta) { case 'site_slogan': $block['subject'] = t('Site slogan'); $block['content'] = variable_get('site_slogan', ''); break; } return $block; } hook_block_view() - возвращает содержимое блока. Параметр $delta - уникальный индентификатор блока предоставляемый hook_block_info() (в нашем случае это site_slogan).После очередной очистки кэша видим отображение нашего блока на сайте:
По умолчанию программно созданные блоки имеют те же самые настройки что и любой другой блок: настройки видимости, заголовок блока и т.д., но мы можем добавлять свои дополнительные настройки. В данном случае будет удобно если мы будем иметь возможность редактировать слоган сайта прямо на форме редактирования этого блока.
Для этой цели мы используем хуки hook_block_configure() и hook_block_save.
Добавим в файл sb.module следующий код:
/** * Implements hook_block_configure(). */ function sb_block_configure($delta = '') { $form = array(); if ($delta == 'site_slogan') { $form['site_slogan'] = array( '#type' => 'textfield', '#title' => t('Site slogan'), '#default_value' => variable_get('site_slogan', ''), ); } return $form; } /** * Implements hook_block_save(). */ function sb_block_save($delta = '', $edit = array()) { if ($delta == 'site_slogan') { variable_set('site_slogan', $edit['site_slogan']); } } hook_block_configure() - объявляет форму настройки блока. Параметр $delta - тоже что и для hook_block_view(). hook_block_save() - предоставляет обработчик данных пришедших с формы объявленной в hook_block_configure(). Параметры: $delta - тоже что и для hook_block_view(), $edit - содержит данные пришедшие с формы конфигурации блока.Как видим на форме присутствует добавленное поле Site slogan. Далее изменим его значение и сохраним форму.
Слоган обновился, значит форма работает правильно.
Полный листинг файла sb.module:
<?php /** * Implements hook_block_info(). */ function sb_block_info() { $blocks['site_slogan'] = array( 'info' => t('Site slogan'), 'cache' => DRUPAL_CACHE_GLOBAL, ); return $blocks; } /** * Implements hook_block_view(). */ function sb_block_view($delta = '') { $block = array(); switch ($delta) { case 'site_slogan': $block['subject'] = t('Site slogan'); $block['content'] = variable_get('site_slogan', ''); break; } return $block; } /** * Implements hook_block_configure(). */ function sb_block_configure($delta = '') { $form = array(); if ($delta == 'site_slogan') { $form['site_slogan'] = array( '#type' => 'textfield', '#title' => t('Site slogan'), '#default_value' => variable_get('site_slogan', ''), ); } return $form; } /** * Implements hook_block_save(). */ function sb_block_save($delta = '', $edit = array()) { if ($delta == 'site_slogan') { variable_set('site_slogan', $edit['site_slogan']); } }