CCKモジュールをインストールしてフィールドを追加し、ノードを作成してみたものの、CCKで追加したフィールドはすべて本文の下部に表示されるだけです。Drupalの管理画面や、CSSで若干の変更が可能ですが、それには限界があります。この投稿では、テンプレートを編集して、CCKで追加した値を好きなようにレイアウトする方法について簡単にご紹介します。ブログのようなサイト以外では、このような方法でノードのレイアウトを劇的に変更する必要に迫られることもあると思います。
CCKフィールドの表示をカスタマイズする2つの方法
フィールドごとのテンプレートを作成する
各フィールドごとにcontent-field-field_name.tpl.phpといった命名規則でテンプレートを作成し、デフォルトのテンプレートをオーバーライドする方法です。この記事ではこの方法は扱いませんが、興味のある方は、英語ですが下記のページをご参照ください。
Template files for CCK fields | drupal.org
ノードテンプレートの中でCCKの出力も一緒にカスタマイズ
CCKフィールドの値はノードのオブジェクトとして取得できますので、ノードのテンプレートファイル(node.tpl.php)内で取得できます。タイトルにもあるように、この記事ではnode.tpl.phpでCCKの出力の部分まで含め、デザインしていく方法を扱います。
具体的な方法
テンプレートの準備
node-content_type.tpl.phpをテキストエディタで開き、$contentを探してください。<?php print $content; ?>という部分がノードの本文とCCKフィールドの値をまとめて返す変数です。まずはこの部分を削除します。そして、その$contentの代わりとして、もっと細かく本文や各CCKフィールドの変数を追加し、CSSでレイアウトしやすいようにHTMLタグでidやclassなどを付与していきます。
利用可能な変数を確認する方法
変数を追加といってもその変数がわかりませんよね。以下の方法などで、使用できる変数を知ることが出来ます。テーマのカスタマイズでは今後もよく利用すると思いますので、すべて試してみてお好みの方法を選択することをおすすめします。
print_r()を利用
一番お手軽な方法はprint_r()を使用する方法でしょうか?先程まで<?php print $content; ?>があった部分に、次のように入力します。
<pre><?php print_r($node); ?></pre>
今までノードの本文とCCKが表示されていた部分に$nodeオブジェクトの使用可能な変数が表示されます。
特定のフィールドについてだけ表示したい場合には、次のように入力します。
<pre><?php print_r($node->field_field_name); ?></pre>
Develモジュール + dsm()を利用
Develモジュールをインストールしてから、node.tpl.phpに次のように入力してください。
<?php dsm($node); ?>
こちらのほうがprint_r()よりも見やすいのでお薦めします。(私はいつもこの方法です。)
ここでも特定のフィールドについてだけ表示したい場合には、次のように入力します。
<?php dsm($node->field_field_name); ?>
その他、変数を知る方法
Develモジュールを用いた方法がお薦めですが、他にも以下のモジュールで使用可能な変数を知ることが出来ます。
- Theme developer
- この記事を書いている2010年6月下旬時点でdevバージョンです。
- Content Templates
- 本来、ブラウザから各コンテントタイプごとにノードのテンプレートを編集するモジュールですが、ノードで利用可能な変数を出力してくれますので、それを参考にnode.tpl.phpを編集できます。
よく使用する変数
上記の方法で利用可能な変数を確認することが出来ますが、ご参考までによく使用すると思われるものだけを掲載しておきます。
CCKデフォルトの表示を任意の位置に出力
ラベルも含めて表示できますが、表示をカスタマイズするには先述のように各フィールドのテンプレートを作成する必要があります。
<?php print $field_field_name_rendered; ?>
値を一つだけ出力
CCKは値が一つの場合でも、常に0から始まる数字で表される配列として出力されます。CCKの値が一つしかない場合でも、以下のコードで値を取得します。
<?php print $node->field_field_name[0]['view']; ?>
複数の値がある場合で、配列の2番目、3番目の値を取得したい場合は、以下のようにします。
<?php print $node->field_field_name[1]['view']; ?>
<?php print $node->field_field_name[2]['view']; ?>
複数の値をすべて出力
すべての値を表示したい場合は、一番単純な例として以下のようにします。
<?php foreach ((array)$field_field_name as $item): ?>
<?php print $item['view']; ?>
<?php endforeach; ?>
*末尾の['view']や['value']について
上の例では、いずれも変数の末尾が['view']で終わっていますが、['value']というのも使用できます。通常は['view']を使用するということで問題ないかと思いますが、2つには下のような違いがありますので、状況に応じて使い分けてください。
- ['view']: 表示のためにフォーマットされた値を返す。
- ['value']: データベースに保存されたそのままの値を返す。
その他、Textモジュールで作成したフィールドでは、['safe']というのも使用できます。コードを見る限り、使用する入力書式が許す範囲で値を返すもののようです。間違っていたらすみません。
ラベル(タイトル)を出力
<?php print $node->content['field_field_name']['field']['#title']; ?>
Fieldgroupで作成したグループ内にあるフィールドのラベル(タイトル)を出力
<?php print $node->content['group_group_name']['group']['field_field_name']['field']['#title']; ?>
Fieldgroupで作成したグループ名を出力
<?php print $node->content['group_group_name']['group']['#title']; ?>
ノードの本文のみを出力
始めに$contentを削除してしまったので、ノードの本文が表示されなくなってしまっています。下のスニペットでCCKフィールドを除いたノード本文のみを出力することが出来ます。
<?php print $node->content['body']['#value']; ?>
コメントを追加