Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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