我正在使用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
属性不会影响定位。
谢谢,
答案 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
,这样您就可以完全控制显示顺序。