Можно ли печатать регионы внутри шаблона узла?

25

Можно ли печатать регионы внутри шаблона узла или регионы строго ограничены шаблонами страниц?

tim76
источник

Ответы:

48

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

Создание новых переменных шаблона выполняется с помощью функции предварительной обработки. В template.phpфайле вашей темы создайте функцию, которая выглядит следующим образом:

function mytheme_preprocess_node(&$variables) {
}

Замена mythemeкоротким названием вашей темы. Теперь, чтобы Drupal распознал эту новую функцию предварительной обработки, вам необходимо перестроить реестр тем вашего сайта. Это так же просто, как перейти к КонфигурацияРазработкаПроизводительность и нажать кнопку «Очистить все кеши» вверху.

Теперь способ работы функций предварительной обработки состоит в том, что он $variablesсодержит массив, соответствующий доступным переменным вашего шаблона. Например, в node.tpl.php, $submittedсодержит автора автора byline. В приведенной выше функции предварительной обработки он находится в $variables['submitted'].

Чтобы имитировать то, что у вас есть page.tpl.php, где у вас есть массив с именем, $pageкоторый содержит все регионы, вы хотите заполнить $variables['page'].

Проблема в том, что $pagein node.tpl.phpуже заполнен значением true / false, которое позволяет вам узнать, смотрите ли вы на узел самостоятельно или в листинге.

Поэтому, чтобы избежать конфликта имен, заполните $regionвместо:

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название региона, который вы хотите визуализировать.


источник
1
Наконец-то рабочее решение для Drupal 7 :)
Эдуард Лука
4
Есть также быстрое и грязное решение, которое сработало для меня <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Отсюда: webomelette.com/add-region-node-template
Дарра Энрайт,
Это решение изящно. Не могли бы вы привести примеры того, когда он наиболее применим к областям печати в файле node.tpl.php вместо того, чтобы указывать его в файле page.tpl.php?
Рэнделл
Это зависит от вашего дизайна. Иногда компоновка может поместить боковую панель в такое место, где ее тема будет гораздо проще, если она будет внутри узла div, а не снаружи.
Роби
Не забывайте о соответствующих региональных упаковщиках! Смотрите system_page_alter () для справки. Помните, что block_get_blocks_by_region()возвращается только массив блоков, и если вы хотите отобразить его как регион, вам нужно добавить обертку региона.
SiliconMind