Как вставить блок в узел или шаблон в Drupal 7?
в Drupal 6 было легко вставить блок в шаблон со следующим кодом:
$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];
однако использование тех же инструкций в Drupal 7, похоже, не работает. Я осмотрелся и не могу найти новый метод.
есть ли у Drupal 7 процедура, которая позволяет программно вставлять блок в шаблон или узел?
15 ответов
С ответом wrburgess вы можете получить сообщение об ошибке, если ваш сервер использует более новую версию 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;
?>
D7:
<?php
$block = module_invoke('module_name', 'block_view', 'block_delta');
print render($block['content']);
?>
'имя модуля' = имя компьютера модуля (т. е. имя папки модуля). Это верно и для основных модулей, поэтому, например, "поиск", "пользователь" и "комментарий" будут работать здесь.
'block_delta' = имя машины блока. Вы можете определить, что это такое, посетив страницу администрирования блока и отредактировав блок. Например, URL-адрес для редактирования блока webform будет что-то вроде:
Drupal 7: администратор / структура / блок / управление/webform/клиент-блок-11/настроить
в этом примере 'webform' - имя модуля, 'клиент-блок-11' - Дельта блока.
пользовательские блоки будут иметь имя модуля "block" и номер для Дельты, который вы также можете найти, отредактировав блок.
больше информации: http://drupal.org/node/26502
это, по-видимому, решение для вставки блоков в шаблоны для Drupal 7, но это кажется немного неуклюжим, и я понятия не имею о влиянии на производительность:
$block = block_load('views', 'block_name');
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
Если у кого-то есть лучшая процедура, пожалуйста, добавьте.
эта работа для меня:
98-идентификатор блока
$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
просто протестировал это в drupal 7, и он работает:
$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);
удачи!
на 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
почему-то render()
не работает для меня, но это:
<?php
$block = module_invoke('block', 'block_view', '1');
echo $block['content'];
?>
в моем поиске, чтобы включить блок в шаблон, я наткнулся на этот пост.
в качестве дополнения, если вы хотите включить пользовательский блок (который вы добавили через интерфейс блока), вы должны использовать (вместо block_load();
в drupal 7)
$block = block_get_custom_block($bid);
$content = $block['body'];
улучшение ответа 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'))))); ?>
это сработало для моего Drupal 7 , URL: admin / структура / блок / управление/addthis/addthis_block/настроить Примечание: Дельта и имя модуля присутствуют в самом url
$addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);
больше информации можно найти дальше http://technarco.com/drupal/insert-block-node-or-template-drupal-7
$block = module_invoke('menu_block', 'block_view', '6');
echo render ($block['content']);
это работает для меня для печати блока меню.
есть модуль под названием insert_block для тех, кто хочет вставить блок "Drupal way" (ничего не программировать, просто включите модуль). здеськак его настроить.
Примечание: Я знаю, что этот вопрос касается "программной вставки блока в шаблон или узел", но Google отправляет сюда людей, даже если они ищут не программистское решение, как я.
посмотрите, как Drupal делает это в _block_render_blocks. Результат этой функции передается в drupal_render.
недавно я столкнулся с той же проблемой, и я наткнулся на хорошее решение, которое описывает решение в drupal как путь drupal.
вы можете печатать области внутри любого шаблона, но они недоступны из коробки в узле.ТПЛ.PHP-шаблон. Чтобы сделать их доступными, вы создадите новую переменную для использования в вашем узле.ТПЛ.шаблон php, который будет содержать все содержимое региона.
создание новых переменных шаблона выполняется с помощью функции предварительной обработки. В вашей теме шаблон.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();
}
}
}
затем, в узле вашей темы.ТПЛ.php шаблон, вы можете отобразить любой регион, выполнив следующие действия:
<?php print render($region['sidebar_first']); ?>
где sidebar_first-это имя области, которую вы хотите отобразить.
прочитайте полную статью здесь: https://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template
module_invoke отлично работает для блока рендеринга в файле шаблона, но он не работает на многоязычных сайтах.