这一节,我们以字段为例,再更进一步的讲述覆写的概念,覆写字段的方法不止一种,但是我将重点讲述普遍推荐的方式——使用theme_field()函数。
Drupal通过theme_field()函数来输出字段的值。如果你要改变这个值的输出,你可以在你的template.php文件中覆写theme_field()函数。另一个选择是,你可以从Field模块文件夹拷贝field.tpl.php文件到你自己的主题中,并覆写它。
需要注意的是,对于一个有较多字段的页面,覆写模版文件并不是推荐的方式,这样做会导致性能上的损失。
在drupal中,处理模版文件的时间比运行php函数的时间要长,所以当一个页面有很多字段,并且这些字段的模版文件都被覆写过的话,就会拖慢页面的渲染速度。而这个时候,覆写主题函数的作用就显得非常有用了。
当你覆写主题函数的时候,你需要把这个函数名的前半部分,换成你自己主题的机器名。比如你的主题叫做qingkong,那么你覆写的theme_field()函数就是下面这个样子的:
function qingkong_field($variables) {
//php code
}
你写在这个函数中的代码,将影响你的主题中所有字段的输出。通常,我都是直接复制函数的源代码,并加以修改。你可以在Drupal API 库(link is external)中找到这段代码,你也可以到Field模块的文件夹中找到它。
function qingkong_field($variables) {
$output = '';
// Render the label, if it's not hidden.
if (!$variables['label_hidden']) {
$output .= '<div class="field-label" '="" .="" $variables['title_attributes']="">' . $variables['label'] . ': </div>';
}
// Render the items.
$output .= '<div class="field-items" '="" .="" $variables['content_attributes']="">';
foreach ($variables['items'] as $delta => $item) {
$classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even');
$output .= '<div class="' . $classes . '" '="" .="" $variables['item_attributes'][$delta]="">' . drupal_render($item) . '</div>';
}
$output .= '</div>';
// Render the top-level DIV.
$output = '<div class="' . $variables['classes'] . '" '="" .="" $variables['attributes']="">' . $output . '</div>';
return $output;
}
当你在template.php文件中写了上述代码,并把qingkong改成了你自己的主题名称后,你还需要清空缓存,然后刷新页面,你会发现,页面和之前没有任何变化。这是因为,虽然默认的theme_field()函数被qingkong_field()覆写了,但是函数代码并没有变化。接下来,如果你想对网站所有的字段都进行修改的话,你就可以直接修改上面的代码。然而,大部分的情况是,我们只需要修改某个字段的输出方式。
和模版文件类似的,我们可以用不同的函数名来指定我们需要覆写的字段,如下:
THEMENAME_field__body__article()
THEMENAME_field__article()
THEMENAME_field__body()
THEMENAME_field()
如果你不知道这个名字该怎么写,你可以借助上一节介绍过的devel_themer模块,当然,这并不是唯一的方法,以后我们还会介绍其他的。
举个例子,你可以用下面的代码对article类型的node中的字段进行覆写:
function qingkong_field__article($variables) {
// your php code (see above)
}