Как вставить блок в узел или шаблон в Drupal 7? - PullRequest
36 голосов
/ 19 января 2011

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

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

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

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

Ответы [ 15 ]

85 голосов
/ 20 октября 2011

D7:

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

'имя_модуля' = Имя машины модуля (то есть имя папки модуля).Это верно и для основных модулей, поэтому, например, здесь будут работать «search», «user» и «comment».

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

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

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

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

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

27 голосов
/ 19 января 2011

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

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

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

19 голосов
/ 10 марта 2014

С ответом 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;
  ?>
11 голосов
/ 27 ноября 2012

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

98 является идентификатором блока

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
7 голосов
/ 20 июля 2011

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

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

Удачи!

5 голосов
/ 06 августа 2012

Функция 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 голосов
/ 21 мая 2012

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

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
3 голосов
/ 05 января 2015

Улучшая ответ Вурбургса, вы можете сделать это в одну строку ...

<?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 голосов
/ 04 июня 2013

Это сработало для моего 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 голосов
/ 29 октября 2011

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

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

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