当前位置: 代码迷 >> 综合 >> Drupal 7中的字段渲染方法
  详细解决方案

Drupal 7中的字段渲染方法

热度:10   发布时间:2023-12-13 15:18:25.0

转载自http://drupalchina.cn/node/5369 

原作者: phpartisan


Drupal7中导入了Entity概念!并且提供了强大的相关字段的存储,加载,编辑,渲染的field API。通过内容类型的字段管理以及显示管理的标签页可以用覆盖其所有处理环节。

但是在Entity一连串的相关处理之外,有时经常需要针对某个特定的字段进行另外的渲染处理。比如说我们想把node的作者名放置到边栏。当然也可以使用Panels和CCK Blocks等模块实现此类需求。也可以通过简单的代码实现。

 

有没有碰到过这样的写法。

//此为不太好的写法。

$block['content'] = $node->field_name['und'][0]['safe_value'];

 

在drupal6中为了获取想显示的值直接使用node对象是非常常见的一种方法。「 'safe_value' 」是已经检测过的值应该是安全的。但是不觉得有什么问题吗?可以列举以下几个理由。

1.首先「 'und' 」是drupal7中对字段的语言设置(详细可参考Gabor Hojtsy的博客(link is external))。直接通过它指定值时,没有考虑到多语言环境下出现的问题。

2,如果不想失去模板引擎所提供的正常的字段渲染优势,不应该直接指定使用字段的值。

3.[0]['safe_value']是明确指定了字段的第一个值。如果这样的话,当字段存在多个值时会需要循环处理。

4.一些字段(例如node reference)并不存在「 'safe_value' 」元素。此情况下如果使用未检验过的「 'value' 」时并不安全。并不是说node reference字段含有不安全的值(此类型仅仅是node ID),而是说对于初级开发人员会养成一种非良好的习惯。也许其他字段的「 'value' 」中会含有不安全的值。

 

幸好field_view_field()提供了解决方案。

$output = field_view_field('node', $node, 'field_name');

 

此函数的返回值具备了已经正确检验(#4已通过),含有要素全体(#3已通过),正确的语言配置(#1已通过),含有正确的markup(#2已通过)的渲染数组!字段中如果没有使用中语言的正确有效值时会自动切换为网站默认语言。而且此函数的参数可以传递含有格式的设置以及View Mode设置信息的数组。

 

不需要搞得如此复杂,仅仅需要单一的值就行了。诸如此类的情况下该怎么办?这种情况下可以使用2个函数。其一是field_get_items() 。它会返回具有正确语言设置的字段信息数组(根据需要也可以指定语言)。此处所获取的数据可以利用于服务器端的处理。例如图像字段的alt文本想在其他地方使用等等。但是需要注意的是特别是用户输入的原数据,为了避免安全隐患,使用此类数据前需要进行正确的检验处理。

 

另一个是field_view_value()。当需要渲染字段单一的值时,它会返回已检验处理过的渲染数组。参数也可以传递格式设置信息。从field_get_items()的返回数组中获取单一的值如下。

$node = node_load($nid);
$field = field_get_items('node', $node, 'field_name');
$output = field_view_value('node', $node, 'field_name', $field[$delta]);

$delta是字段元素中的key。如果是单一的值的话此处为0.

 

最后在介绍一个有趣的示例。为了显示图像字段,设置它的图像样式和node的链接。此处field_view_value()和field_view_field()是相同的结果。

$node = node_load($nid);
$image = field_get_items('node', $node, 'field_image');
$output = field_view_value('node', $node, 'field_image', $image[0], array('type' => 'image','settings' => array('image_style' => 'thumbnail','image_link' => 'content',),
));

 

如上所示,当我们需要把特定的字段显示在block中,只要通过field API就能实现!干净简单!而且返回的是渲染数组,在通过模板文件进行渲染之前,可以根据需要对他的结构进行再次加工。同时 field_view_field()和field_view_value() 的返回值都是已经正确检验处理过的。