2011-01-19 2 views
34

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

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

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

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

+0

Там это ошибка сейчас появляются, связанные с более новой версией PHP. См. Ответ для @canintex ниже. – wrburgess

+0

Указанная выше практика не рекомендуется. См. [Загрузить блок в шаблоне?] (Https://drupal.stackexchange.com/questions/46489/load-a-block-in-template) для получения дополнительной информации. – colan

+0

Вышеупомянутая практика * больше не рекомендуется * в 2014 году. Нам было не так много, чтобы вернуться в 2011 году. – wrburgess

ответ

17

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

Спасибо, что добавили это. Я укусил этот вопрос два дня назад и не был уверен в причине. – wrburgess

+0

Может кто-нибудь сказать мне, в чем разница между drupal_render() и рендерингом(), и где я должен использовать каждую функцию? 'Спасибо!' – Stphane

+0

@Stphane: http://drupal.stackexchange.com/questions/66302/what-is-the-difference-between-render-and-drupal- рендеринга # ответ-66304 – canintex

27

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

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

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

+1

Это решение, на котором я остановился - поскольку это единственный способ, который я нашел, включая заголовок блока и контекстные ссылки. Благодарю. – jackocnr

+0

Этот метод будет тему содержимого блока с правильным файлом шаблона. Ответ Клоуэра даст вам тело блока незатронутым. – Segfault

+1

с php 5.4, вы можете вызвать drupal_render только для переменной ..., что означает, что вы должны получить свой $ output до _block_get_renderable_array(), затем распечатать drupal_render ($ output) – PatrickS

7

Просто проверили это в Drupal 7 и это работает:

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

Удачи!

84

D7:

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

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

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

Drupal 7: администратор/структура/блок/управления/Webform/клиент-блок-11/настроить

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

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

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

+1

не имеет названия или контекстных ссылок :( – jackocnr

+2

Это не сработало для меня. Мне пришлось использовать 'print $ block ['content'];' в Drupal 7. – bcosynot

+5

Это не сработало для меня в узле. используйте 'print render ($ block);' для блока views и 'print render ($ block ['content']);' для настраиваемого блока в Drupal 7. –

3

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

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

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

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

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

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

11

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

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

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

вам понадобится это при рендеринге блока, созданного при администрировании/struct/block/manage/block/98/configure – augusto

3

Это работал для моего Drupal 7, URL: администратор/структура/блок/управление/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

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

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

3

Улучшение ответ 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'))))); ?> 
1

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

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

0

Недавно я столкнулся с той же проблемой, и натолкнулся на приятное решение, которое описывает решение в 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

Смежные вопросы