跳转到主要内容

2.3.2 字段的覆写

这一节,我们以字段为例,再更进一步的讲述覆写的概念,覆写字段的方法不止一种,但是我将重点讲述普遍推荐的方式——使用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 .= '
' . $variables['label'] . ': 
'; } // Render the items. $output .= '
'; foreach ($variables['items'] as $delta => $item) { $classes = 'field-item ' . ($delta % 2 ? 'odd' : 'even'); $output .= '
' . drupal_render($item) . '
'; } $output .= '
'; // Render the top-level DIV. $output = '
' . $output . '
'; 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)
 
}