Drupal 7中的字段渲染方法

轉載自http://drupalchina.cn/node/5369 php

原做者: phpartisannode


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))。直接經過它指定值時,沒有考慮到多語言環境下出現的問題。spa

2,若是不想失去模板引擎所提供的正常的字段渲染優點,不該該直接指定使用字段的值。code

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() 的返回值都是已經正確檢驗處理過的。

相關文章
相關標籤/搜索