it-roy-ru.com

Как вставить блок в узел или шаблон в Drupal 7?

В Drupal 6 было легко вставить блок в шаблон с помощью следующего кода:

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];

Однако использование тех же инструкций в Drupal 7, похоже, не работает. Я посмотрел вокруг и не могу найти новый метод.

Есть ли в Drupal 7 подпрограмма, которая позволяет программно вставлять блок в шаблон или узел?

35
Randy Burgess

С ответом 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;
  ?>
19
canintex

D7:

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

'module_name' = Имя компьютера модуля (то есть имя папки модуля). Это верно и для основных модулей, так что, например, «поиск», «пользователь» и «комментарий» будут работать здесь.

'block_delta' = Имя машины блока. Вы можете определить, что это, посетив страницу администрирования блока и отредактировав блок. Например, URL для редактирования блока веб-формы будет выглядеть примерно так:

Drupal 7: администратор/структура/блок/управление/веб-форма/client-block-11/настройка

В этом примере 'webform' - это имя модуля, 'client-block-11' - это дельта блока.

Пользовательские блоки будут иметь имя модуля «блок» и номер дельты, которые вы также можете найти, отредактировав блок.

Дополнительная информация: http://drupal.org/node/26502

85
kloewer

Похоже, это решение для вставки блоков в шаблоны для Drupal 7, но это кажется немного неуклюжим, и я понятия не имею о влиянии на производительность:

$block = block_load('views', 'block_name');      
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));        
print $output;

Если у кого-то есть лучшая процедура, пожалуйста, добавьте.

27
Randy Burgess

Эта работа для меня:

98 - это идентификатор блока

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
11
CaDyMaN

Только что проверил это в Drupal 7, и это работает:

$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);

Удачи!

7
DanyAlejandro

Функция 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

5
cafonso

По какой-то причине render() не работает для меня, но это делает: 

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
5
user1253382

Совершенствуя ответ 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'))))); ?>
3
Santiago Bendavid

В моем поиске включить блок в шаблон я наткнулся на этот пост. 

Кроме того, если вы хотите включить пользовательский блок (который вы добавили через интерфейс блока), вы должны использовать (вместо block_load(); в drupal 7)

$block = block_get_custom_block($bid);
$content = $block['body'];
3
michaelmol

Это работает для моего 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://technarco.com/drupal/insert-block-node-or-template-drupal-7

3
Umesh Patil
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

Это работает для меня для печати меню блока.

1
MilanG

Есть модуль под названием insert_block для тех, кто хочет вставить блок «Drupal way» (чтобы ничего не программировать, просто включите модуль). Здесь как это настроить.

ПРИМЕЧАНИЕ: Я знаю, что этот вопрос касается "программной вставки блока в шаблон или узел", но Google отправляет сюда людей, даже если они ищут не программистское решение, как я.

1
Jasom Dotnet

Посмотрите, как это делает Drupal в _block_render_blocks . Результат этой функции передается в drupal_render .

0
Oswald

module_invoke Работает нормально для блока рендеринга в файле шаблона, но он не работает на многоязычных сайтах.

0
Sohan Jangid

Недавно я столкнулся с той же проблемой и наткнулся на решение Nice, которое описывает решение в drupal как путь drupal.

Вы можете распечатать регионы внутри любого шаблона, но они не доступны из коробки в шаблоне node.tpl.php. Чтобы сделать их доступными, вы создадите новую переменную для использования в шаблоне node.tpl.php, которая будет содержать весь контент региона.

Создание новых переменных шаблона выполняется с помощью функции предварительной обработки. В файле template.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/questions/20054/can-regions-be-printed-within-a-node-template

0
Prabhat Ranjan