聚焦:高级覆盖
想要做到真正的修改动态部分,你需要离开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 函数是不会被直接调用的。它们都是通过一个核准的函数来调用 |

Comments
Post new comment