Drupal theme-4 主题高级特性(1) 第八章

来源:互联网 发布:sql server go 的作用 编辑:程序博客网 时间:2024/04/30 19:35

Drupal主题高级特性

 

在前面的部分,你学到了Drupal使用的各种不同模板文件,当Drupal要将你的主题合并到一起时就会查找这些模板。你学到了如何创建页面模板文件,如何创建特定节点类型的节点模板文件,甚至特定区块的区块模板文件。换句话说,对于定制主题的知识,你已经掌握了80%。

 

那么剩下的20%呢?如何主题化Drupal的表单?如何修改一些简单的东西比如面包屑的外观?在这一部分,我们将回答这些问题并帮你成为Drupal主题化的高手。你将从主题化高手的基本武器之一template.php文件开始学起。

 

template.php文件是整合定制的模板文件的地方:定义新的区块区域,覆写Drupal的默认主题函数,拦截传递给模板文件的变量并创建定制的变量。

 

覆写主题函数

Drupal的主题系统背后的核心哲理和钩子系统的类似。通过遵循命名规范,就可以标识出哪些函数是主体相关的函数,它们负责格式化并返回你站点的内容。主题函数由它们函数名的前缀“theme_”来标识。这一命名规范使得Drupal能够为所有的主题函数创建一个函数覆写机制。设计者就可以命令Drupal执行一个具有更高优先级的定制的函数,从而代替开发者在模块中给出的默认的主题函数。例如,让我们检查一下当构建站点的面包屑时该流程是怎么工作的。

 

打开includes/theme.inc并检查文件中的函数。几乎所有的函数都以theme_开头,这就告诉人们它是可以被覆写的。特别的,我们检查theme_breadcrumb():

 

 

/**

* Return a themed breadcrumb trail.

*

* @param $breadcrumb

* An array containing the breadcrumb links.

* @return a string containing the breadcrumb output.

*/

function theme_breadcrumb($breadcrumb) {

if (!empty($breadcrumb)) {

return '<div class="breadcrumb">'. implode(' è ', $breadcrumb) .'</div>';

}

}

 

这个函数控制着Drupal中面包屑导航条的HTML输出。当前,它在面包屑的每一项之间添加了一个指向右边的双箭头分隔符(>>)。假定你想将div标签改为span标签,并使用星号(*)来代替双箭头(>>)。那么你该怎么办呢?一种方式是在theme.inc中修改这个函数,保存,并调用。这样也能达到目的。(不!不!千万不要这样做!)。我们有一些更好的方式。

 

你见过Drupal内核中是怎么调用这些主题函数么?你永远都不会看到直接调用theme_breadcrumb()的情况。替代的,它通常包装在助手函数theme()中。

 

你期望函数这样调用:

theme_breadcrumb($breadcrumb)

 

但实际不是这样。替代的,你将看到开发者这样调用:

theme('breadcrumb', $breadcrumb);

 

这个通用的theme()函数负责初始化主题层并将函数调用分发到合适的位置,这使得我们能够以更优雅的方案来解决我们的问题。图8-5展示了通过调用theme(),命令Drupal按照下面的次序查找相应的面包屑函数。

 

假定你使用的主题为bluemarine,它是基于PHPTemplate的主题,那么Drupal将会查找下面的函数:

 

bluemarine_breadcrumb()

phptemplate_breadcrumb()

theme_breadcrumb()

 

为了修改Drupal的面包屑,在当前主题的文件夹下创建一个空的template.php文件,并将theme.inc中的theme_breadcrumb()函数复制并粘贴到该文件里面。记住要包含<?php标签。还有对函数进行重命名,将theme_breadcrumb改为mytheme_breadcrumb。

 

<?php

/**

* Return a themed breadcrumb trail.

*

* @param $breadcrumb

* An array containing the breadcrumb links.

* @return a string containing the breadcrumb output.

*/

function mytheme_breadcrumb($breadcrumb) {

if (!empty($breadcrumb)) {

return '<span class="breadcrumb">'. implode(' * ', $breadcrumb) .'</span>';

}

}

 

8-5 覆写主题的工作原理

 

当下一次Drupal需要生成面包屑时,它就会先找到你的函数并使用它来代替默认的theme_breadcrumb ()函数,这样面包屑中就会包含你的星号了,而不再包含默认的双箭头了。很漂亮,不是么?你没有修改一行核心代码。通过theme()函数来管理所有的主 题函数调用,如果当前主题覆写了任何一个theme_ 函数,Drupal都可以检查到这些覆写的函数并使用它们来代替默认的主题函数。开发者,请注意:在你的模块中任何需要输出HTML或者XML的部分都应 该使用以“theme_”开头的主题函数,这样s设计者就可以覆写它们了。拿user.module来说(参看图8-6)

 

8-6 可以在主题层覆写由模块暴露的主题函数。定制的主题函数mytheme_user_picture()覆写了默认的theme_user_picture(),接下来将会使用mytheme_user_picture()代替theme_user_picture()。

 
原创粉丝点击