CCKで作ったノードの表示用テンプレートの編集方法

Events happening in the community are now at Drupal community events on www.drupal.org.
nzaki's picture

初めて質問させていただきます。nzakiと申します。

1ヶ月前から書籍や本サイトを参考にしながらDrupal(Drupal6.x)を使ってサイトを作成しています。

CCK(6.x-2.2)で作成したノード(例:http://xxxxx/drupal6/node/47)を表示する
ときに出力されるHTMLの編集方法についてお聞きしたいことがあります。

今回、CCKを使って「商品情報」というコンテンツタイプを作成し、商品名や値段、商品詳細
などのフィールドを作っていくつかノードを作成しました。

その商品情報画面の中の任意の部分(例えば値段と商品詳細の間と画面の一番下など)に
購入ボタンをいくつか設置したいのですが、うまいやり方が思い浮かばず苦戦しています。

理想としては、何かのフック関数を使って表示前にFORM APIで定義したボタンを追加
できれば良いのですが、こんな方法はあるのでしょうか?

最悪、テーマ内のpage.tpl.phpをベースにして、商品情報用のテンプレートファイルを作って内部の$content
変数を使わずに一つ一つ値を定義していけば実現できるような気もしますが。。。

どなたかこの辺りをご存知の方がいらっしゃればヒントをいただけると幸いです。
よろしくお願いいたします。

Comments

ショッピングカート

aiwata55's picture

ショッピングカート系モジュールを使ったことはないのですが、Drupal では Ubercart というモジュールが有名です。ただし、日本の商文化に合わない点があるかもしれません。いずれにせよ、いずれかのショッピングカート系モジュールを使えば、おっしゃっているようなボタンの設置は可能だと思います。

もし既存のショッピングカート系 ASP のコードを埋め込みたいのであれば、そのコードを埋め込むためのフィールドを作成し、そこにショッピングカートシステムが書き出した商品毎のコードを埋め込んでいくことになるでしょう。あとは、そのフィールドの入力方式を Full HTML か PHP にしておけば、最終的にページをレンダリングする時にはカートに入れるボタンとして機能すると思います。

Theming(どこにボタンを表示させるかなど)は、やはり .tpl.php ファイルを作ることになるでしょう。なお、お尋ねの内容の場合、カスタマイズするテンプレートファイルは page.tpl.php ではなく node-custom.tpl.php(custom の部分は商品コンテントタイプの machine readable name)になります。page.tpl.php は、ヘッダー、サイドバー、フッターなどの、サイト共通部分を担当していますから。


Aki Iwata
FOREST & trees
http://www.forest-and-trees.com/


Aki Iwata
FOREST & trees

ありがとうございます。

nzaki's picture

アドバイスどうもありがとうございます。

Ubercartモジュールについては以前検討したのですが、今回作成するサイトは情報がメインで商品数があまり
ないため(5件以下)、ショッピングカート系モジュールを入れるまでもないかと思いCCKのみで対応することにしました。

CCKでコードを埋め込むためのフィールドを作る方法は目から鱗でした。
こんな使い方もあるのですね。勉強になります。

node-xxxx.tpl.phpを自分で作る場合についてですが、使っているテーマ(Zen)のnode.tpl.phpをベースに作ると思うのですが、まだコンテンツ部分(テンプレート変数の$contentが出力するHTML)を展開する方法がうまくイメージできません。

一番単純な方法では、最初に$contentが出力するHTMLを全部コピーして、node-xxxx.tpl.phpの
$content部分に貼り付けた後、任意の場所に商品情報の変数やボタン用のコードを挿入するやり方が
思いつきますが、これは一般的な方法でしょうか?
(汎用性が失われる気がするのですが・・・)

引き続きよろしくお願いいたします。

一度吐き出された

aiwata55's picture

一度吐き出された HTML をコピーして node-custom.tpl.php を作っても、表示の元となる変数が分からないので、あまり意味がありません。

Zen を使っている場合、まず zen ディレクトリから node.tpl.php を現在使用中の Zen サブテーマ・ディレクトリにコピーしてください。
次に、コピーされた node.tpl.php を再度同じディレクトリ内にコピーし、node-[your_content_type_name].tpl.php ([...] 内は、ご自身の環境に応じて書き換えて)とファイル名の変更を行ってください。以後、この node-[your_content_type_name].tpl.php を対象にカスタマイズをして行きます。

フィールドの埋め込み

Administer -> Content management -> 対象となるコンテントタイプに行き、Manage fields タブをクリックしてください。
これからテーマ内で変更したいフィールドの machine-readable name をコピーしてください。(現在僕が見ている Zen Classic テーマでは Name というラベルが付けられた行にあります)フィールド名は“field_”で始まります。

node-[your_content_type_name].tpl.php をエディタなどで開き、適当な場所(あなたが対象となっているフィールドを表示させたい場所)に

<?php
print $[just_copied_field_name]_rendered
?>

というコードを挿入してください。そして、[...] をあなたの環境に合わせて書き換えてください。つまり、さきほどコピーした内容をペーストしてください。その際は、括弧も込みで書き換えます。

必要に応じて先ほどの<?php ... ?><div><span> を使って囲い、ID や Class を割り当てると、CSS を使った見た目のカスタマイズが容易にできます。

グループの埋め込み

フィールドではなくグループごと扱いたい時には、Administer -> Content management -> 対象となるコンテントタイプに行き、Manage fields タブをクリックしたあと、カスタマイズしたいグループの name の値をコピーします。グループ名は“group_”で始まります。

node-[your_content_type_name].tpl.php をエディタなどで開き、適当な場所(あなたが対象となっているフィールドを表示させたい場所)に

<?php
print $[just_copied_group_name]_rendered
?>

というコードを挿入してください。そして、[...] をあなたの環境に合わせて書き換えてください。つまり、さきほどコピーした内容をペーストしてください。その際は、括弧も込みで書き換えます。

フィールドの場合と同様、必要に応じて先ほどの<?php ... ?><div><span> を使って囲い、ID や Class を割り当てると、CSS を使った見た目のカスタマイズが容易にできます。

$content から特定フィールドを省く

このままだと、先ほど node-custom.tpl.php に独自に挿入したフィールドやグループは $content 変数にも含まれているので、ページをレンダーした時二重に表示されてしまいます。

これを避けるため、Administer -> Content management -> 対象となるコンテントタイプに行き、Display fields タブをクリックして、テンプレートファイルに独自に挿入したフィールドやグループの“Exclude”チェックボックスにチェックしてください。なお、グループの Exclude チェックボックスをチェックした場合、そのグループに含まれるすべてのフィールドも $content 変数から省かれます。

参考になれば...


Aki Iwata
FOREST & trees
http://www.forest-and-trees.com/


Aki Iwata
FOREST & trees

できました。

nzaki's picture

お忙しい中、丁寧なアドバイスを頂きどうもありがとうございます。

先ほど試してみたところ、お蔭様でやりたいことを全て叶える事ができました。
テンプレートの編集作業はこれまでずっとモヤモヤとしたものがありましたが、
胸のつかえが取れた気分です。

今回は非常に勉強になりました。
本当にありがとうございました。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: