Как вставить блок в узел или шаблон в 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 отлично работает для блока рендеринга в файле шаблона, но он не работает на многоязычных сайтах.