跳转到主要内容
qingkong 提交于 26 June 2015

 2.3 Drupal主题相关的重要概念(3)Basic concept of Drupal Theme (III)

2.3.6

这一节,我们以字段为例,再更进一步的讲述覆写的概念,覆写字段的方法不止一种,但是我将重点讲述普遍推荐的方式——使用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 库中找到这段代码,你也可以到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'] . ':&nbsp;</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)

}

 

Drupal 版本