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



我正在使用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 属性的呈现方式不会影响定位。

谢谢

渲染

数组中的显示顺序是使用 #weight 属性设置的,具有较高#weight的元素将在具有较低值的元素之后渲染。

如果要强制在内容区域顶部呈现hook_page_alter()中添加的内容,请按如下方式声明:

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

或在内容区域的底部:

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

您还可以调整传递给函数的 $page 数组中已存在的其他元素的#weight,以便完全控制显示顺序。

最新更新