Views PHP

Views PHPはViewsの出力フィールドやフィルタ、ソートにPHPを組み込むためのモジュールです。フィルタやソートではあまり使う必要はないかと思うのですが、出力フィールドではかなり便利です。

Views3の出力フィールドは、そのままでもかなり細かい設定が可能です。データベースに保存された全てのコンテンツのタイトルや作成日付、投稿者名、全ての追加のフィールドの値、コンテンツタイプ、コンテンツへのパス、等々、データベースに対してSQL文を簡単に発行してくれるとものと理解すればいいかと思います。

そして、その取り出した値をどう出力するかについても、これでもか、というくらい多様な設定が可能です。HMTLでのマークアップ、複数値を持つ場合のデータの選択、フィールド値を特定のパターンで置き換えることもできます。テキストデータであれば出力する文字数やマークアップの削除、あるいは特定のHTMLタグだけマークアップを残す、画像であれば、Image cacheで設定したさまざまなサイズの画像か元画像か、クリックした場合のリンク先もImage Cacheの画像か元画像か、あるいはその画像が含まれる元コンテンツ自体へのリンクとするか、同一コンテンツに複数の画像がある場合の処理、等々、フィールド値の種類によって、異なる選択や設定ができるようになっています。

この出力に対して条件を設定するのは同じViews設定にあるフィルタで、特定のコンテンツタイプだけ、特定の期間のコンテンツだけ、特定の分類タームだけ、等々、何段階にでもフィルタで対象コンテンツを絞り込んでいくことができます。


ところが、特定のパターンで置き換えた出力フィールドに対して条件を設定するといったことが必要になると、その置き換えパターンの内部に条件を設定する必要がでてきます。そこで登場するのがこのViews PHPです。

例えば画像のリンク先を、その画像が含まれる元コンテンツのコンテンツタイプや画像以外の他のフィールド値によって、元コンテンツにリンクするか、別のリンク先に設定するか、という条件分岐を設定したりすることができます。

例として簡単な画像ギャラリーを作ってみました。

 

最初のサムネイルだけはPDFを開き、その他のサムネイルは元コンテンツにリンクするようにしています。

まず、Viewsの出力フィールドにはNID(ノードのシリアル番号)、コンテンツタイプ、画像フィールド(1番目の画像のみ)、PDF(ファイルのURL)を抽出するものの、フィールド自体は非表示にておきます。

Views PHPモジュールが提供するGlobal:PHPフィールドを追加します。この時問題なのが、PHPフィールドにAVAILABLE VARIABLESというのがあるのですが、Drupal7だと$row->field_imagesとかやっても何故かnidしか引っ張ってきません。さんざん調べてこちらで同じことを経験し解決している方を発見、同様にprint_rやって出力可能な変数を探して、PHPフィールドのOutput code欄にこのスクリプトを貼っつけました。

<?php
$imgfilename = isset($data->field_field_images['0']['raw']['uri']) ? substr($data->field_field_images['0']['raw']['uri'],9): "";
$linkurl = isset($data->field_field_pdf['0']['raw']['filename']) ? $data->field_field_pdf['0']['raw']['filename'] : $data->nid ;
if($imgfilename){
if($data->node_type == 'story'):
print '<a href="/system/files/'.$linkurl.'" target="_blank"><img src="/sites/default/files/styles/square/public/'.$imgfilename.'"></a>';
elseif($data->node_type == 'blog'):
print '<a href="/node/'.$linkurl.'"><img src="/sites/default/files/styles/square/public/'.$imgfilename.'"></a>';
endif;
}
?>
  • $imgfilenameは、画像のパスを引っ張ってくるためにuriの変数を整形し、画像がなければ空白を返しています。
  • $linkurlはリンク先URLをコンテンツにPDFファイルがアップロードされている場合はPDFファイルへのパス、ない場合はnidを返しています。
  • 原因はよくわからないのですが、これでうまく動くのにエラーがでてきたので、issetで値があるかどうかをチェックすることによって回避しました。あとこの方法だとimage cacheをどこかで出力するようにしておかないと、image cacheが生成されず、画像はリンク切れになってしまいます。

もっとスマートな方法もあるかも知れませんが、コンテンツのフィールドの設計を変える必要が生じて、古いフィールドも新しいフィールドも同じフィールドに表示したり、といった場合にはとても便利な方法になるかとおもいます。

ただviewsは設定を間違うと結構シリアスな状況が発生する場合もあるので、Views PHPは、基本的には運用サイトでいきなり設定せずに、開発サイト等でテスト、検証してから設置すべきです。