Порядок рендеринга Drupal - как определить порядок рендеринга? - PullRequest
1 голос
/ 08 декабря 2011

Я создаю сайт с помощью Drupal, и у меня небольшая проблема. Я рендеринг формы с использованием hook_menu. Форма хорошо, и все хорошо. Затем я добавляю еще немного разметки на страницу с помощью hook_page_alter (). Hook_page_alter выглядит так:

function renderer_page_alter(&$page) {
  if(drupal_is_front_page()) { 
    $q = db_query('SELECT name, mname, number_of_instances FROM {event_type} ORDER BY number_of_instances DESC');
    foreach($q as $event) {
      $options['name'][] = $event->name;
      $options['mname'][] = $event->mname;
    }  
    $tri = array(
      '#theme' => 'frontpage_canvas',
      '#options' => $options
    );
    return $page['content']['triangles'] = $tri;
  }
}

Итак, в моей локальной установке MAMP содержимое отображается сначала с результатами hook_page_alter (), а затем с формой. Однако при удаленной установке порядок меняется (с кнопкой «Отправить» для формы вверху страницы и остальным содержимым под ней). Единственное различие между установками (о которых я могу думать) состоит в том, что удаленная установка - это Drupal 7.8, а локальная - Drupal 7.9.

Я бы хотел, чтобы удаленная установка выполнялась так же, как и локальная. Кто-нибудь сталкивался с подобной проблемой раньше?

Основная структура визуализированного HTML выглядит следующим образом:

<div class=content>
   //all the form information is in here
</div>
<div class=rendered>
   //all the output from hook_page_alter() is here
</div>

РЕДАКТИРОВАТЬ: Проблема в том, что по какой-то причине, block.tpl.php добавляет два div:

<div id="block-system-main" class="block block-system first last odd">
  <div class="content"> 
     //My form markup is in here
  </div>
</div>
//The hook_page_alter markup is in here.

Итак, есть ли способ заставить Drupal добавить разметку hook_page_alter к тому же div, в котором отображается форма? Поскольку способ визуализации в данный момент, свойство #weight не влияет на позиционирование.

Спасибо

1 Ответ

3 голосов
/ 08 декабря 2011

Порядок отображения в массивах рендеринга устанавливается с помощью атрибута #weight, элементы с более высоким #weight будут отображаться после элементов с более низким значением.

Если вы хотите принудительно добавить содержимое вhook_page_alter() для отображения в верхней части области содержимого объявите его следующим образом:

$tri = array(
  '#theme' => 'frontpage_canvas',
  '#options' => $options,
  '#weight' => -1000
);

или в нижней части области содержимого:

$tri = array(
  '#theme' => 'frontpage_canvas',
  '#options' => $options,
  '#weight' => 1000
);

Вы также можете настроить#weight для других элементов, которые уже существуют в массиве $page, переданных в функцию, поэтому вы можете полностью контролировать порядок отображения.

...