Программный вывод блоков в 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.

$module_name = 'views';$block_delta = 'last' . '-block_1';$block = module_invoke($module_name, 'block_view', $block_delta);print render($block['content']);

Вывод дополнительного блока последние материалы с помощью функции views_embed_view().

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 указанный выше код примет вид:

<?php$block = block_load('block', '1');print drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));?>

Второй способ – выводим только содержимое блока

Нам не всегда нужно выводить обертку и заголовок блока. Например, для формы поиска мы вполне можем обойтись без них. В этом случае используем функцию Drupal API module_invoke():

<?php$block = module_invoke('search', 'block_view');print render($block['content']);?>

Оба способа можно применять, не помещая код в шаблон напрямую, а предварительно добавив переменную с html блока в page.tpl.php с помощью функции template_preprocess_page. О том, как добавить в этой функции переменную, можно прочитать, например, здесь.

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

sergeybelyaev.name

Программный вывод блоков в 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'] без приведения типа

У этого кода есть один недостаток – он выводит блок всегда, безотносительно его настроек на странице управления блоками. Настройки видимости блока по страницам сайта можно не учитывать, как и вывод блока в системные регионы, поскольку мы выводим его точечно, в нужном нам месте, но вот видимость блока для ролей пользователей учесть стоит. Для этого придётся получить дополнительную информацию из таблицы 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);$block->module = $module;$block->delta = $delta;// Выводим блокprint theme('block', $block);

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

Источники

Программный вывод блоков в 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 и включим наш новый модуль.

Включение модуля Slogan block

Для того чтобы объявить новый блок добавим в файл 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:

Настройка слогана сайта в Drupal 7

Следующим шагом очистим кэш и разместим блок Site slogan в регион First sidebar:

Установка блока 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).

После очередной очистки кэша видим отображение нашего блока на сайте:

Отображение блока 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:

Редактирование блока Site slogan

Как видим на форме присутствует добавленное поле 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']); } }

drupal-learning.com


Prostoy-Site | Все права защищены © 2018 | Карта сайта