Display Suiteの拡張

以前紹介したDisplay Suite、もう少し詳しく書きます。

Display SuiteはDrupalの個別コンテンツの出力を細かく設定するためのモジュールです。コンテンツの一覧を設定するViewsと対比されていいモジュールですが、Viewsほど一般的に使われていません。個別コンテンツの出力の設定するモジュールとしてはPanelsもよく利用されていますが、自分はどうもこのPanelsは使いずらく、モジュールではなく、テンプレートのオーバーライドで出力設定をしてきました。

クライアントからできる限り管理画面だけで管理できるようにしてほしい、とのリクエストがあり、Display Suiteでどこまでできるか、チャレンジすることにしました。

Display Suiteはテンプレートファイルnode.tpl.phpのオーバーライドを無効化し、コンテンツタイプ毎の「表示管理」画面でフィールド表示位置や表示方法を設定します。前回、Viewsと比べるとまだ発展途上かな、と書いたのですが、その部分もかなり対応できることがわかりました。

フィールドをもっとフレキシブルに設定する

Display Suite ExtraモジュールをオンにしてExtraの設定画面(admin/structure/ds/list/extras)でField Templatesを有効化します。これで表示設定されたフィールド毎に詳細設定ボタンが表示されるようになります。フィールドの設定をDrupal defaultからexpertに変更するとラベル、Outer wrapper、field items、field itemの4つが個別に設定できるようになります。

例えば

この設定で、

<div class="wrapper">
  <ul class="items">
    <li class="item">item</li>
    <li class="item">Item2</li>
  </ul>
<div>

といったマークアップができます。スライドショーとか、人様が配布されているjQueryのスクリプトを組み込む場合などにはかなり便利です。

入力のないフィールドを出力する

Display Suiteで出力だけのフィールドを追加することができます。DS管理画面のバーティカルタブのCustom fieldsを開き、Add a code fieldを選択します。例えばFacebookのいいね!ボタンをフィールドとして追加できます。

ここでは、Entitiesにnodeを設定し、フォーマットはPHP codeを選択、表示されたページのURLを取得し、いいねボタンのリンク先属性値に設定しています。

同じコンテンツ内の入力済みのフィールド値を演算して出力する場合にも便利です。例えばポンド単位で入力された重さの値をキログラムに換算して出力します。

<?php 
$pound = $entity->field_pound['und'][0]['value'];
print $pound*0.45359237.'kg';
?>

この場合フォーマットはDisplay Suite codeを選択することで$entityオブジェクトが有効になります。トークンも使えるようですが、こっちの方が確実性が高いと思います。

追加したフィールドはCustom fieldsのManage fieldsの画面で管理します。

この他にもまだまだ色んな機能があり、Viewsほどには使いこなせているとは言えないものの、へぇ~、と何度も言わせてくれるモジュールです。