Drupal渲染顺序 - 如何定义渲染顺序?

时间:2011-12-08 01:02:31

标签: php drupal drupal-7 rendering

我正在使用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 个答案:

答案 0 :(得分:3)

渲染数组中的显示顺序是使用#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,这样您就可以完全控制显示顺序。