Как вставить блок в node или шаблон в Drupal 7?
В Drupal 6 было легко вставить блок в шаблон со следующим кодом:
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
Однако использование тех же инструкций в Drupal 7 не работает. Я огляделся и не могу найти новый метод.
Есть ли в Drupal 7 подпрограмма, которая позволяет программно вставлять блок в шаблон или node?
Ответы
Ответ 1
С wrurgess ответом вы можете получить сообщение об ошибке, если ваш сервер использует более новую версию PHP.
Strict warning: Only variables should be passed by reference in include()...
Это то, что я сделал, чтобы не вызывать/не избавляться от ошибки.
<?php
$blockObject = block_load('views', 'block_name');
$block = _block_get_renderable_array(_block_render_blocks(array($blockObject)));
$output = drupal_render($block);
print $output;
?>
Ответ 2
D7:
<?php
$block = module_invoke('module_name', 'block_view', 'block_delta');
print render($block['content']);
?>
'module_name'= имя машины модуля (то есть имя папки модуля). Это справедливо и для базовых модулей, поэтому, например, "поиск", "пользователь" и "комментарий" будут работать здесь.
'block_delta'= Имя машины для блока. Вы можете определить, что это такое, посетив страницу администрирования блока и отредактировав блок. Например, URL-адрес для редактирования блока веб-формы будет выглядеть примерно так:
Drupal 7: admin/structure/block/manage/ веб-форма/ клиент-блок-11/configure
В этом примере 'webform' - это имя модуля, "client-block-11" - это дельта блока.
Пользовательские блоки будут иметь имя модуля "block" и число для дельта, которое вы также можете найти, отредактировав блок.
Дополнительная информация: http://drupal.org/node/26502
Ответ 3
Это, по-видимому, решение для вставки блоков в шаблоны для Drupal 7, но это кажется немного неуклюжим, и я понятия не имею о влиянии на производительность:
$block = block_load('views', 'block_name');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
Если у кого-то есть более эффективная процедура, добавьте.
Ответ 4
Эта работа для меня:
98 - это идентификатор блока
$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
Ответ 5
Просто проверил это в drupal 7, и он работает:
$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
Удачи!
Ответ 6
По какой-то причине render()
не работает для меня, но это делает:
<?php
$block = module_invoke('block', 'block_view', '1');
echo $block['content'];
?>
Ответ 7
Работает функция module_invoke()
. Однако я обнаружил, что рендеринг блока таким образом, по-видимому, не будет использовать настраиваемый шаблон для этого блока. Это может быть в порядке в зависимости от ваших потребностей.
Как уже отмечалось в других ответах, это работает, а также использует пользовательские шаблоны:
$raw_block = block_load('your-module', 'delta');
$rendered_block = drupal_render(_block_get_renderable_array(_block_render_blocks(array($raw_block))));
print $rendered_block;
Итак, если у вас есть пользовательский файл шаблона block--your-module--delta.tpl.php
, он будет использоваться для форматирования блока.
Источник: http://api.drupal.org/api/drupal/includes!module.inc/function/module_invoke/7
Ответ 8
В моем поиске, чтобы включить блок в шаблон, я столкнулся с этим сообщением.
В качестве дополнения, если вы хотите включить настраиваемый блок (который вы добавили через интерфейс блока), вы должны использовать (вместо block_load();
в drupal 7)
$block = block_get_custom_block($bid);
$content = $block['body'];
Ответ 9
Это работало на моем Drupal 7,
URL: admin/structure/block/manage/ addthis/** addthis_block **/configure
ПРИМЕЧАНИЕ: имя дельта и модуля присутствует в самом URL-адресе
$addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);
Более подробную информацию можно найти на
http://www.ultechspot.com/drupal/insert-block-node-or-template-drupal-7
Ответ 10
Улучшая ответ wrburgess, вы можете сделать это в одной строке...
<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('module_name', 'block_delta'))))); ?>
Так, например, я использую номер блока 6...
<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('block', '6'))))); ?>
Ответ 11
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
Это работает для меня для печати блока меню.
Ответ 12
Там модуль, называемый insert_block для тех, кто хочет вставить блок "Drupal way" (не программировать ничего, просто включите модуль). Здесь, как настроить его.
ПРИМЕЧАНИЕ.. Я знаю, что этот вопрос касается "программной вставки блока в шаблон или node", но Google отправляет сюда людей, даже если они ищут не-программное решение, такое как я.
Ответ 13
Посмотрите, как Drupal делает это в _block_render_blocks. Результат этой функции передается drupal_render.
Ответ 14
Недавно я столкнулся с одной и той же проблемой, и я нашел хорошее решение, которое описывает решение в drupal как drupal.
Вы можете печатать регионы внутри любого шаблона, но они недоступны из коробки в шаблоне node.tpl.php. Чтобы сделать их доступными, вы создадите новую переменную для использования в вашем шаблоне node.tpl.php, который будет содержать весь контент региона.
Создание новых переменных шаблона выполняется с помощью функции препроцессора. В файле theme.php темы создайте функцию, которая выглядит так:
function mytheme_preprocess_node(&$variables) {
// Get a list of all the regions for this theme
foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {
// Get the content for each region and add it to the $region variable
if ($blocks = block_get_blocks_by_region($region_key)) {
$variables['region'][$region_key] = $blocks;
}
else {
$variables['region'][$region_key] = array();
}
}
}
Затем в вашем шаблоне node.tpl.php вы можете отобразить любой регион, выполнив следующие действия:
<?php print render($region['sidebar_first']); ?>
Где sidebar_first - это название области, которую вы хотите отобразить.
Прочитайте полную статью здесь: https://drupal.stackexchange.com/info/20054/can-regions-be-printed-within-a-node-template