(再質問)D7で、コンテンツタイプごとにCCKフィールドをレイアウトする方法

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

http://groups.drupal.org/node/56708 にて以前質問させていただいたのですが、どうしても調べがつかないし理解できないので、お手上げ状態、再質問させてください。

CCKで作ったカスタムフィールド、myfieldを、コンテンツタイプ mycontentstypeに限り、テーブル内のセルに、フィール名、値みたいに分けてデザインしたいです。

Drupal実践プログラミング徹底入門も読んでいるのですが、
D6では、いろいろな変数がラップされている$contentではなく$nodeを使うべしということで、$nodeオブジェクトの中身を見るべく、node--mycontenttype.tpl.phpに

<?php print_r($node); ?>

で中身をしらべたところ、
$node->field_myfield['und'][0]['value']を発見しましたが、値はあるがフィールドラベルの値を持っていない!

そこでググりまくり、D7の場合は、

<?php print render($content['field_myfield']); ?>

で表示されるとのこと、なにっ$nodeオブジェクトを使わないの!と思いきや、表示されるのはフィールドラベルと値がセットで格納されているので一緒に表示されてしまいます。

カスタムのフィールドラベルと、フィールドの値を別々に出力するにはどうすれば良いのでしょうか。
またティーザーと通常の単ページノードを表示分けするには、条件分岐しなければならないのでしょうか?
お助けください。

Comments

一応はラベルが表示できた

s-jack's picture

CCKフィールドのmyfieldは、ラベル名は$content経由、値は$nodeオブジェクト経由で取得できました。

<table>
    <tr>
<td><?php print render($content['field_myfield']['#title']); ?></td>
<td><?php print $node->field_myfield['und'][0]['value']; ?></td>
    </tr>
</table>
</pre>

$nodeオブジェクトにフィールドの値や言語情報は持っているが、ラベル名を持っていない以上、このようにするしかありません。
$nodeオブジェクトに全てデータがあれば、済む話なんですが、難しいです。^^
言語を切り替えた場合、値は切り替わりますが、ラベルが切り替わりません。
$contentを作る段階まで深追いしてみます。
$nodeを作る段階ってハックとかフックする仕組みってあるのだろうか、しちゃっていいものだろうか。
どっちがよいのだろう。

entity と fieldがアリスワンダーランド的なところがなんとなく想像できます。

とんちんかんなことをしてるのかな

s-jack's picture

レスをいただけないようで、とんちかんなところで私は彷徨っているのでしょうか?^^

Doc-JP(drupal.orgのマニュアルを翻訳作業しましょうグループの移転)のモックアップにも、テーブル表記でカスタムフィールドを表示させていたいのですけど、どなたかご教示いただけませんでしょうかm(__)m

dokumori's picture

$nodeを作る段階ってハックとかフックする仕組みってあるのだろうか、しちゃっていいものだろうか。
どっちがよいのだろう。

以下いずれかのフックで対応できるはずです:

  • hook_preprocess_HOOK - これを使うと、テンプレート内で利用できる変数を新たに作成できます。最初の 'hook' はカスタムモジュール名、後の 'HOOK' はオペレーションで、この場合 node になるんじゃないかと思います。
  • hook_node_view - これを使うとレンダーされる前のノードオブジェクトを操作できます。

後者を利用する場合は、フックの実装の際に $node->type で処理するか否かを判断してください。

s-jack's picture

2つの関数を教えていただき感謝です!!!
じっくり読み込んでみます、取り急ぎ御礼まで。

こんにちは、s-jackさん 私も以前、 Drupalのフ

jun784's picture

こんにちは、s-jackさん

私も以前、
Drupalのフォーム部分のテーブル化だけで納期を一ヶ月ずらすはめになった記憶があります。

その際に学んだベストプラクティスは、
FORMの標準出力にCSSでLABELとDIVに色、枠をつけて、テーブルレイアウトに見せるという方法でした。
これなら、nodetype毎にもレイアウトを変更が可能です。

ただ、最近になりましてフォームのレイアウトをいじくれるモジュールも出て来ているようなので、
まずは以下のモジュールを試されるのがよいかと思われます。# 自分では全ては試しておりません。

Tableform(drupal7のみ)
http://drupal.org/project/tableform

fixed_field(drupal7のみ)
http://drupal.org/project/fixed_field

arrange fields(無理矢理、position:absoluteでフォームの位置を固定化)
http://drupal.org/project/arrange_fields

how to render a form in table layout(drupal6での、カスタムモジュールハック)
http://drupal.stackexchange.com/questions/5374/how-to-render-a-form-in-t...

ご質問ありましたら気軽にくださいっ。

s-jack's picture

私も以前、
Drupalのフォーム部分のテーブル化だけで納期を一ヶ月ずらすはめになった記憶があります。

お仕事をされてる方も苦悩される事例でほっとしました^^
phpの知識が浅いため、おいおいそんなところで悩んでるようじゃ、説明しきれん!と思われてるのかと思ってました。

その際に学んだベストプラクティスは、
FORMの標準出力にCSSでLABELとDIVに色、枠をつけて、テーブルレイアウトに見せるという方法でした。
これなら、nodetype毎にもレイアウトを変更が可能です。

この場合は、print render($content[])で出力されたところにcssのclass等がフィールド名と値で別々に振られているので、デザイン的に分けちゃえということでしょうか。firebugで覗いてみます。

沢山のモジュールをご紹介いただき感謝です。
できればHackしたくないので(モジュールの開発が止まると意味ないですが)、モジュールを1つずつ試してみます、ありがとうございます。
またフィードバック&質問させていただきますので、よろしくお願いします。

折角教えていただいたのですが

s-jack's picture

jun784さん、教えていただいたモジュールですが、入力フォームではなくて、出力のほうをいじりたいのです!
(フォームも後日弄りたいのでそのときに活躍しそうです ^^)

CCKでつくったカスタムフィールドを、特定のコンテンツタイプに限り、フィールドラベルと値を分けてテーブルに配置したいです。
このようなことをモジュールでできちゃうのもご存知でしょうか??

s-jackさん、これは申し訳ありません。 てっきり入力フ

jun784's picture

s-jackさん、これは申し訳ありません。

てっきり入力フォームの方と勘違いしておりました。

CCKでつくったカスタムフィールドを、特定のコンテンツタイプに限り、フィールドラベルと値を分けてテーブルに配置したいです。
このようなことをモジュールでできちゃうのもご存知でしょうか??

こういったモジュールももちろんあると思いますが、
こちらはテンプレートの領分かと思います。

あまりいい方法とは言えないかもしれませんが、
私は最近、ラベルはテンプレートに直接書いてしまっています。
t()関数で取り回しすれば多言語可も用意ですので、運用上問題なければ
無理にdrupalのcontentやフィールドをhookしなくてもいいかなと思っております。

また、ラベルを出力するのに以下のような手法もあります。

<?php
ラベルを出力する方法、その3
$info
= field_info_instance('node','field_name','content_type_name');
print
$info['label'];
?>

よろしくお願いします。

s-jack's picture

jun784さん、こんにちは。
なるほど直書き、さらにt関数ですか^^
ナイスアイデアですが、なんか悔しいな。最悪の場合これにしますけど。

方法その3ありがとうございます。
ラベル数多いとかなり大変ですね^^
やっぱ$nodeにラベル組み込むのがいいんでしょうかねえ。
これができるとデザインする方は汎用的に使えますね。
ただdokumoriさんに教えていただいたfook関数がまだ理解できてないです^^;

これか!

s-jack's picture

http://drupal.org/node/209229
これかな〜。

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

Group organizers

Group categories

Group notifications

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