欢迎莅临阿Q的项目

专业WP商业设计开发销售中心

[手册]Drupal 7 主题模板制作指南

Drupal是一个开源的内容管理系统(CMS) 平台,它是用PHP写成的。主要用于构造提供多种功能和服务的动态网站,这些功能包括用户管理(UserAdministration)、发布工作流 (Publishing Workflow)、讨论、新闻聚合(NewsAggregation)、元数据(Metadata)操作和用于内容共享的XML发布。Drupal有一个优秀的模块化结构,提供了许多模块,包括短消息、个性化书签、网站管理、Blog、日记、电子商务、电子出版、留言簿、Job、网上电影院、论坛、投票 等模块。并且Drupal模块的下载、安装、定制非常方便。

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模块展示了“页面”模板的可用的模板建议。

devel_suggestions

内核的所有建议的列表可参看“内核模板和建议”。

这些命名建议是在预处理函数中设置的。内核已经提供了大量的建议。如果你需要进一步的扩展它,你需要在你的主题下面的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]
有两种方式添加这些建议。

  1. 键'template_file'接收一个单独的建议,并具有优先级。如果条件满足,并且文件存在的话,将会使用这个建议,忽略其它的建议。
  2. 键'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可以自动识别建议的。
如果喜欢本文,请分享给朋友们