在继续阅读本节以前,你首先要熟悉主题注册表的目的(http://drupal.org/node/173880#theme-registry)。这里的指导,将覆盖如何手动的注册一个主题钩子,并解释如何才能手动操作。
大部分需要手动注册主题的情景,是与表单相关联的。表单元素可以主题化,但是它们的主题化是以另一种方式进行的。对于基本元素,比如复选框,单选框,提交按钮,下拉菜单,等等。这些元素都是可以主题化的,对它们的覆写不需要手动的去注册与之相关联的钩子。对于一些定制表单,每个元素都以非常特别的方式来放置,这时就需要手动的去注册了。对于那些,已经设计好,主体化过的,并且注册过的表单,就不需要手动注册了。对于那些没有主题化的表单将使用默认方式显示它们(http://api.drupal.org/api/file/developer/topics/forms_api.html/6)。
表单注册例子:
在下面这个例子中,search.module注册了两个搜索表单,搜索框和搜索区块。每个表单都有一个唯一的Id与之相关联。即可充当注册编号,又可充当主题钩子。在这里,它是"search_theme_form" 和"search_block_form"。
<?php
function search_theme() {
return array(
'search_theme_form' => array(
'arguments' => array('form' => NULL),
'template' => 'search-theme-form',
),
'search_block_form' => array(
'arguments' => array('form' => NULL),
'template' => 'search-block-form',
),
...
);
}
?>
表单API将它的显示控制权交给了注册钩子的处理器。在这个例子中,它注册了默认参数('arguments')和模板类型('template')。只有当主题层(see image)下面的层次中已注册了主题钩子时,Drupal才能自动找到钩子。
注册一个未被注册的表单:
另一个搜索表单还没有被注册过。它的id为"search_form",用在主搜索页面。表单的数据是在一个函数中构建的(http://api.drupal.org/api/function/search_form/6),这和其它表单一样,但它需要表单API根据它的数据结构来处理它的显示。我们可通过覆写来对其进行扩展,你需要在你的主题中使用hook_theme对其进行注册。将下面的代码放到你主题的template.php文件中,将"drop"前缀改为你主题的名字。主题钩子就是表单的id:
<?php
function drop_theme() {
return array(
'search_form' => array(
'arguments' => array('form' => NULL),
),
);
}
?>
主题化过的表单都有一个参数"form"。由于这里没有声明模板(template),那么钩子将作为主题函数的形式存在,而不是一个模板。主题函数必须使用它的主题名作为前缀。这里不能使用phptemplate_*。所以,根据上面的信息,那么主题函数应该是这样的:
<?php
function drop_search_form($form) {
$simple = '';
foreach (element_children($form) as $element) {
if ($element == 'advanced') {
$advanced = drupal_render($form[$element]);
}
else {
$simple .= drupal_render($form[$element]);
}
}
return $advanced . $simple;
}
?>
这里所做的唯一修改就是高级搜索表单的位置。
-
子主题中覆写了一个表单,如果这个表单在基表单中已经注册过的话,那么就不需要手动的再为这个表单进行注册了。记住,底层注册过了的,上层都不需要再注册了,对于基主题来说,子主题就是它上面的一层。
- 在将来的版本中,这将会更加自动化。开发者知道主题者(themers)的负担。
手动操作
主题注册表的手动操作,使一个高级特性。如果你安装了devel模块的话,点击区块中的"Theme registry"(主题注册表)可阅读进一步的详细信息。也可参看http://api.drupal.org/api/function/theme_get_registry/6。
待续。。。
原文:http://drupal.org/node/223463
译者:葛红儒, Think in Drupal