Печать регионов в html.tpl.php

10

Мне нужно вывести некоторые регионы в шаблоне html.tpl.php, поскольку они не меняются между page.tpl.php и page-front.tpl.php (просто чтобы назвать два). В основном я хочу избежать дублирования кода.

Однако в html.tpl.php, похоже, нет ничего связанного с регионами, и я не могу получить что-либо, используя drupal_get_region_content (как с параметрами, так и без параметров, он просто возвращает пустой массив).

Идеи?

Morpheu5
источник
Вы использовали drupal_set_region_content()для установки контента региона?
kiamlaluno
2
Там нет такой функции. Возможно, вы имели в виду, drupal_add_region_content()но я не вижу в этом смысла: я устанавливаю содержимое регионов через интерфейс администратора блоков.
Morpheu5
1
Да, я имел в виду drupal_add_region_content().
kiamlaluno

Ответы:

18

Я решил так:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

и тогда я мог бы сделать

<?php print render($region_name) ?>
Morpheu5
источник
Зачем использовать эхо? Конечно, это работает.
SDMulroy
Конечно, если бы я реализовывал модуль или публичную тему, я был бы вынужден следовать стандартам сообщества. Это была пользовательская тема, которая использовалась исключительно моим клиентом.
Morpheu5
Я знаю, что это очень старый пост, но я думаю, что он не может принять ответ, когда автор ответа лениво отвечает на вопрос. Например, вы предоставляете функцию для добавления, но предполагаете, что все читатели будут волшебным образом знать, где этот код должен жить. Это ленивая часть, и я отказываюсь голосовать, поскольку она не предоставляет ничего начинающим пользователям / разработчикам drupal.
Кегли
Я ценю ваш вклад и тот факт, что новички могут не получить полного объяснения. Тем не менее, учтите, что: а) кормление с ложки делает ленивых новичков и б) тем, кто даже быстро прочитал документы (как это должно быть у любого не ленивого новичка), расположение этой функции должно быть относительно очевидным. Если это не так, то есть руководство по уважительной причине. Мой вопрос (и ответ) имеет дело с проблемой на уровне, на котором можно предположить определенные базовые знания по тематике Drupal. Кроме того, это сайт вопросов и ответов, сайт Docs находится по соседству.
Morpheu5
1
@Skitties Мы не можем продублировать здесь документацию только потому, что новые пользователи не могут знать, что представляют собой функции предварительной обработки, подобные показанной в вопросе. Это даже не часть вопроса. Если у пользователей есть определенный вопрос о функциях предварительной обработки, они зададут новый вопрос.
kiamlaluno
2

drupal_get_region_content()возвращает содержимое, которое было установлено с предыдущими вызовами drupal_add_region_content(), но оно не включает в себя содержимое блоков, которые отображаются на странице с помощью block_page_build () .

Если вы ищете «drupal_add_region_content» в исходном коде Drupal, вы заметите, что функция вызывается:

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

То, что вы устанавливаете для блоков на странице администрирования, это то, в каких регионах блоки будут отображаться, но их содержимое не добавляется drupal_add_region_content(); фактически ни одна из функций, перечисленных выше (которые являются единственными вызывающими функциями drupal_add_region_content(), кроме кода для тестирования установки Drupal), не предназначена для рендеринга / добавления содержимого блока.

Если вам нужно визуализировать блоки в вашем собственном коде, вы должны проверить код, используемый в block_page_build(). В частности, этот код, вероятно, более полезен для вас:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

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

Если вам нужно визуализировать блоки другим способом, более вероятно, что вы заинтересованы в переопределении theme_block () в своей теме или (что еще более вероятно) создании пользовательского файла шаблона block.tpl.php. Другой способ изменить способ визуализации блоков - использовать функцию препроцессора для блоков ( hook_preprocess_block () ).

киамлалуно
источник