ウィジェットタイプ「選択リスト」において、使用する値のリストを動的に生成できるようなモジュールはありますでしょうか?
なければPHPコードを書くことになるのかなと思っています。
具体的に実現したいこととして、CCKして定義したコンテンツタイプのノードの、とあるフィールドの値を選択リストとしたいと思います。
例として、test_typeというコンテンツタイプがあり、フィールドfield1が定義されているとします。
test_typeのノードが以下のように存在したとき、
- ノード名「てすと1」、field1は「hoge」
- ノード名「てすと2」、field1は「bar」
- ノード名「てすと3」、field1は「foo」
選択リストの「使用する値のリスト」が
hoge
bar
foo
となるイメージです。ノードが増えるに従って動的に増えます。
実現可能なモジュール、もしくはPHPコードで実現する際のAPIここみたらいいよ等ヒントをいただければ幸いに思います。
よろしくお願いします。
コメント
こんなPHPコードを書いてみては?
フィールドの「使用する値のリスト」項目のPHPコードに以下のようなPHPコードを書けば、良いと思われます。
$sql ="SELECT node_data_field_フィールド名.field_フィールド名_value AS select_option
FROM node node
LEFT JOIN content_type_コンテンツタイプ名 node_data_field_フィールド名
ON node.vid = node_data_field_フィールド名.vid
WHERE node.type in ('コンテンツタイプ名')";
$result = db_query($sql);
$items = array();
while ($node = db_fetch_array($result)) {
$items[] = $node[select_option];
}
return $items;
上記で日本語で表記してある フィールド名 には全て同じ値が入ります。コンテンツタイプも同様です。
質問者さんの例で言うと、以下のようなPHPコードになります。
$sql ="SELECT node_data_field_field1.field_field1_value AS select_option
FROM node node
LEFT JOIN content_type_test_type node_data_field_field1
ON node.vid = node_data_field_field1.vid
WHERE node.type in ('test_type')";
$result = db_query($sql);
$items = array();
while ($node = db_fetch_array($result)) {
$items[] = $node[select_option];
}
return $items;
大体、こんな感じで動作します。
--------------------------
oumiya_s
http://geeeek.crz.jp/
途中経過報告
ありがとうございました、PHPコードの方をオススメ頂いたので、結局そちらから手をつけています。
情報が不足していたかもしれません、バージョンは6.14を利用しています。
アドバイスいただきましたコードを利用し、以下のようなエラーが出ました。
user warning: Unknown column 'node_data_field_field1.field_field1_value' in 'field list' query: SELECT fnode_data_field_field1.field_field1_value AS select_option FROM node node LEFT JOIN content_type_test_type node_data_field_field1 ON node.vid = node_data_field_field1.vid WHERE node.type in ('test_type') in /var/www/drupal/sites/all/modules/cck/content.module(1694) : eval()'d code on line 2.'field list'というのが何を指すかわかっておらず、これから調べようと思っています。
データベースを覗いて、以下のSQL文でもいけるのではないかと思ったのですが、いかがでしょうか?
(以下のSQL文でも上記と同じ意味のエラーが出ていますが。。。)
また、node_data_field_field1 というテーブルが存在しなかったのも、気になっているところです。
SELECT field_field1_value AS select_option FROM content_type_test_type解決(微妙に
ありがとうございました。やりたいことが若干変わり、ノードタイトルの一覧を利用することにしたため、より簡単なSQL文で解決しました。
リファレンス等を参考にしながら、イジり、ちょこっとDrupalの理解が深まり、よい機会となりました。
CCKに含まれるNodeReferenceモジュールを使用する
あなたの想定した動作と同じかどうか分かりませんが、以下をお試しください。
※表記のURLのexample.comの部分をご自身のドメインに変更してください。
(管理ページ > サイトの構築 > モジュール)
(CCKに最初から含まれているモジュールです)
(管理ページ > コンテンツの管理 > コンテンツタイプ)
ラベル:(任意の名前)
Field name (a-z, 0-9, _):(任意の名前)
Field Type:ノード参照
Widget:選択リスト
恐らく、作成ページでの動作はあなたの想定通りと思われます。
しかし、表示の方はどうでしょうか? そこは想定どおりでは無い気がします。
この方法で満足できない場合は、やはりPHPコードを書くことになると私は思います。
もしくはそういうことが出来そうなモジュールを探すか……。
PHPコードについては別のコメントを参照してください。
--------------------------
oumiya_s
http://geeeek.crz.jp/
コメントありがとうございます。
ご丁寧な解説ありがとうございました!
まずはこちらの方法を試してみようと思います。
まだdrupalを触り始めて日が浅く、試すのにも時間がかかりそうだと思いましたので、
取り急ぎお礼まで。
試した結果は改めて報告させていただきたく思います。
ありがとうございました。
自分でコメントつけといてなんですが
自分でコメントつけといてなんですが、PHPコードの方が楽でおすすめだと思います。
--------------------------
oumiya_s
http://geeeek.crz.jp/