Чи можна надрукувати регіони в шаблоні вузла?


25

Чи можуть бути надруковані регіони в шаблоні вузла, або ж регіони суворо обмежені шаблонами сторінок?

Відповіді:


48

Ви можете друкувати регіони всередині будь-якого шаблону, але вони недоступні у вікні node.tpl.phpшаблону. Щоб зробити їх доступними, ви створите нову змінну для використання у своєму node.tpl.phpшаблоні, яка буде містити весь вміст регіону.

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

function mytheme_preprocess_node(&$variables) {
}

Заміна mythemeкороткою назвою вашої теми. Тепер, щоб Drupal розпізнав цю нову функцію попередньої обробки, вам потрібно відновити реєстр тем вашого сайту. Це так само просто, як перейти до конфігураціїрозробкапродуктивність та натискання кнопки «Очистити всі кеші» вгорі.

Тепер спосіб функціонування попередньої обробки полягає в тому, що $variablesмістить масив, який відповідає доступним змінним вашого шаблону. Наприклад, в node.tpl.php, $submittedмістить авторський рядок. У функції попередньої обробки, що знаходиться вище $variables['submitted'].

Щоб наслідувати те, що у вас є, і у page.tpl.phpвас є масив, що називається, $pageякий містить усі регіони, ви хочете заселити $variables['page'].

Проблема полягає $pageв тому, що в 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
Darragh

Цей розчин витончений. Чи можете ви навести приклади того, коли це найбільш застосовно для друку регіонів у node.tpl.php, а не розміщення у page.tpl.php?
Ренделл

Це залежить від вашого дизайну. Іноді макет може розміщувати бічну панель у місці, де набагато простіше тематизувати, якби він знаходився всередині вузла діва, а не поза ним.
рубік

Не забувайте про відповідні обгортки регіону! Довідково дивіться system_page_alter () . Пам'ятайте, що block_get_blocks_by_region()повертає лише масив блоків, і якщо ви хочете відобразити його як регіон, вам потрібно додати обгортку регіону.
SiliconMind
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.