聚焦:高级覆盖

想要做到真正的修改动态部分,你需要离开HTML和CSS,开始使用PHP。只有PHP才能修改到Drupal
最深层次的内容。下面的两个部分将讨论如何覆盖template.php文件中的变量和函数。你应该对
php的变量和函数有一定得了解,你才能对本章的大多数部分有有所掌握。要等到更多关于覆盖的
更多信息可以到http://drupal.org/node/173880查看。

模板变量

使用模板文件中的这些动态内容小块已经够用的,但如果这些输出的内容不适合你的要求的时候
你就麻烦了。这些变量是Drupal默认生成的,如$site_name 和$submitted,它们似乎可以满足大
多数人的需求。就像Drupal中的其他内容一样,你可以找到并修改他们。不但可以覆盖已经存在
的变量,而且你可以创建你新的变量。

所有的变量都是从template.php 里来的,是通过一种特殊的函数,叫做预处理函数。你可以添加你自己的预处理
函数到你自己的template.php 文件中。为了整齐,你可以再每个函数中只使用一个预处理函数,例如
你可以创建一个 mytheme_preprocess_page函数来影响page.tpl.php 文件。用这个函数,你可以定义,或重新
定义任何函数。例如,如果你想要创建一个新的变量,输出从1到100的随机数,你可以把它添加到template.php中。

function mytheme_preprocess_page(&$vars) {
$vars['random_number'] = rand(1, 100);
}

然后(在清除了drupal的缓存之后),你可以输出这个变量到page.tpl.php 文件中。

<?php print $random_number; ?>

你可以用相同的办法来覆盖已经存在的变量。当你定义一个Drupal中已经使用的变量同名的函数。
,这样你自己的将被使用。我们将更进一步,展示一下如何覆盖$submitted部分。

模板函数

很多Drupal输出的HTML在模板文件中都很容易修改。页面中的”网站浏览路线“,显示这个页面在网站
中的位置。这个地方可以修改吗?不幸的是,这里没有breadcrumb.tpl.php文件。在这种情况下,你需要
研究的再深一点,我们到Drupal的初始化定义的地方去:theme函数。
Theme函数是一个规则的php函数,位于Drupal的代码中,以theme_开头。页面中在模板文件中不存在的元素
都来自这样一个Theme函数。例如theme_breadcrumb()函数

function theme_breadcrumb($breadcrumb) {
if (!empty($breadcrumb)) {
return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';
}
}

在这种情形下,这个函数将输出”网站浏览路线“到页面中去,
例如Home ? Administer ? Site building ? Themes.但是我们现在将输入为
Home::Administer::Site building::Themes。我们打开theme.inc文件区修改它,对吗?不对。

合适的方法是覆盖主题函数,复制这个函数到template.php文件中去。这里一定要按照Drupal的命名
规则来命名,这样才能被识别到。然后你就可以随便修改了。图11-17说明了Drupal在显示某个元素
时调用函数的逻辑。drupal通过一个名字的继承关系来决定最终使用哪个函数。
它检查函数名开始的标识符。有三个可能性,按升序是,theme,
enginename, 和themename,enginename 是模板系统使用的名字(Drupal主题大多数使用PHPTemplate)
而 themename 从字面上时我们在.info文件中自定义的主题本身的名字。drupal会先寻找最合适的名字
(themename),如果没有找到,就继续向下寻找。

图11-17. Drupal是如何决定调用哪个主题函数的。

它将使用它找到的第一个函数,你只需要正确的命名函数,Drupal就会调用它而忽略原来的。
所有,在这个例子中,theme_breadcrumb()就是newmarine_breadcrumb()。我们在下一部分
就会实践这个例子。如果你想得到更多主题的函数请访问http://drupal.org/node/11811.

 

                                   Drupal的theme()函数

有一个很重要的事必须注意,theme 函数是不会被直接调用的。它们都是通过一个核准的函数来调用
theme()。所有即使一个在需要输入代码时模块定义了一个例如 theme_username()的函数,他将调用
theme('username')。theme()的存在,使系统可以被覆盖。

 

Comments

Post new comment

The content of this field is kept private and will not be shown publicly.
By submitting this form, you accept the Mollom privacy policy.