drupal主题默认的基本变量
原文:http://drupal.org/theme-guide
译者:葛红儒,Think in Drupal
下面是在所有的drupal模板文件(http://drupal.org/node/190815)中都可以使用的基本变量。它们是通过预处理器函数(http://drupal.org/node/223430),template_preprocess生成的。特定于模板文件的变量,其相关说明位于模板文件中。
$id
模板的编码。模板每被调用一次,它增1。
$zebra
"odd" 或者 "even"。两者随着模板的适用交替改变。
$directory
主题的相对路径,相对于安装路径。例如:"sites/all/themes/myTheme"
$is_admin
布尔值。当访问者为站点管理员(user 1)时返回TRUE;
$is_front
布尔值。当当前页面为首页时,返回TRUE;
$logged_in
布尔值。访问者为drupal站点会员,登陆并通过验证时,返回TRUE;
$db_is_active
布尔值。当数据库可用时,返回TRUE。这只在“维护模式下的drupal主题化”(http://drupal.org/node/195435)中有用,此时站点可能会遇到数据库问题。
$user
当前访问者的用户对象。把数据放到这里可能不大安全。对于可疑字符串,一定要用check_plain。
特殊情况下的drupal主题注册表
在继续阅读本节以前,你首先要熟悉主题注册表的目的(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"。
[syntaxHighLighter brush="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', ), ... ); }
[/syntaxHighLighter]
表单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:
[syntaxHighLighter brush="php"]
function drop_theme() { return array( 'search_form' => array( 'arguments' => array('form' => NULL), ), ); }
[/syntaxHighLighter]
主题化过的表单都有一个参数"form"。由于这里没有声明模板(template),那么钩子将作为主题函数的形式存在,而不是一个模板。主题函数必须使用它的主题名作为前缀。这里不能使用phptemplate_*。所以,根据上面的信息,那么主题函数应该是这样的:
[syntaxHighLighter brush="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; }
[/syntaxHighLighter]
这里所做的唯一修改就是高级搜索表单的位置。
- 子主题中覆写了一个表单,如果这个表单在基表单中已经注册过的话,那么就不需要手动的再为这个表单进行注册了。记住,底层注册过了的,上层都不需要再注册了,对于基主题来说,子主题就是它上面的一层。
- 在将来的版本中,这将会更加自动化。开发者知道主题者(themers)的负担。
手动操作
主题注册表的手动操作,使一个高级特性。如果你安装了devel模块的话,点击区块中的"Theme registry"(主题注册表)可阅读进一步的详细信息。也可参看http://api.drupal.org/api/function/theme_get_registry/6。
待续。。。
原文:http://drupal.org/node/223463
译者:葛红儒, Think in Drupal
使用drupal模板建议(template suggestions)
原文:http://drupal.org/node/223440
译者:葛红儒, Think in Drupal
drupal模板建议是基于已有.tpl.php文件的可选模板文件。当满足特定的条件,并且相应的文件存在时,就使用这些建议。每一层次,包括内核、模块、主题引擎、主题,都可以提供相应的建议。你可以把它们当作“命名提示”(naming hints),来告诉系统根据合适的环境选择合适的模板。这种想法很简单,但是这一特性却非常强大,它使得在模板层上也能进行定制。
Devel模块展示了“页面”模板的可用的模板建议。
内核的所有建议的列表可参看“内核模板和建议”。
这些命名建议是在预处理函数中设置的。内核已经提供了大量的建议。如果你需要进一步的扩展它,你需要在你的主题下面的template.php文件中为相应的钩子添加一个预处理器。本例中,我们为"page"主题钩子添加了扩展建议。这里的钩子可以为任何模板钩子。
前缀"drop"应改为你主题的名字。
[syntaxHighLighter brush="php"]
function drop_preprocess_page(&$variables) { global $user; // Add a single suggestion. if (module_invoke('throttle', 'status') && isset($user->roles[1])) { $variables['template_file'] = 'page-busy'; } // Add multiple suggestions. if (!empty($user->roles)) { foreach ($user->roles as $role) { $filter = '![^abcdefghijklmnopqrstuvwxyz0-9-_]+!s'; $string_clean = preg_replace($filter, '-', drupal_strtolower($role)); $variables['template_files'][] = 'page-'. $string_clean; } } }
[/syntaxHighLighter]
有两种方式添加这些建议。
- 键'template_file'接收一个单独的建议,并具有优先级。如果条件满足,并且文件存在的话,将会使用这个建议,忽略其它的建议。
- 键'template_files' (复数)可以接受一个建议数组。它们按照先进后出的顺序进行处理。所以,首先应该向里面添加最一般的,然后逐步添加相对特殊一些的,这样就可以根据特殊性选择相应的建议了。
在上面的例子中,当达到了节流上限时,并且访问用户为匿名时,Drupal将尝试使用名为"page-busy.tpl.php"的文件。而其它代码,则告诉Drupal根据当前用户角色选择相应的模板,比如"page-authenticated-user.tpl.php"。如果找不到的话,就使用基模板"page.tpl.php"。这是非常简单的例子。你可以根据你可用的数据来自己设置上下文。
一些注意点:
- 当向'template_files'也就是数组中添加建议时。不要对其进行重置,因为变量是使用饮用传递的。如果重置的话,所有在内核和模块中进行的设置将全部丢失。
[syntaxHighLighter brush="php"]
// Do not do this:
$variables['template_files'] = array('hook-suggestion');
// Instead do this:
$variables['template_files'][] = 'hook-suggestion';
[/syntaxHighLighter]
- 建议前面使用与之相连的钩子作为前缀。这样更加干净,并将文件聚到了一块。同时还减小了Drupal将该模板注册为其它钩子的风险。
- 使用连字符来代替下划线。主模板都不使用下划线的。
- 建议只有和基模板放在一块时,才起作用。模板可以放在主题下面的恶任意子目录下,但是必须将其放到一块。
- 建议的修改添加删除,不需要清空主题注册表。只有基模板注册时才需要。而Drupal可以自动识别建议的。