コンテンツタイプの設定でフィールドの数が多くなってくると、編集画面も煩雑になってきて、どこに何があるのか入力する個所を探すのも大変になってきます。
Field Group モジュールをインストールしていれば、フィールドグループを追加して開閉式のフィールドセットにまとめることも出来ますが、それでもフィールドセットを開閉するたびにスクロールしたり、戻ったりとまだ少し煩雑です。
Field Group モジュールにはフィールドグループをタブで表示させる機能があるので、それを使うと編集画面がタブで整理され、とてもすっきりします。
プログラムからノードの特定のフィールドだけを修正/更新したいとき、このようなコードを考えるかもしれません。
$node = node_load($nid); $node->field_fieldname[LANGUAGE_NONE][0]['value'] = '更新したフィールドの値'; node_save($node);
node_load() でいったん変更したいノードの完全なデータを読み込み、修正/変更したいフィールドを操作して、node_save() で保存する。
「しかしこれでは無駄が多い」と感じてしまいますね。まず変更する必要のないフィールドもすべて読み込まなければなりません。そして変更していないフィールドや、ノード自体もすべて保存し直すことになります。フィールドの数が3つや4つならまだしも、10 や 20、50 ~ものフィールドがあったらどうでしょうか?それで1つか2つのノードを変更したいならまだしも、数千ものノードを連続で修正したい場合は?
Drupalのエンティティ(ノード、ユーザーなどの概念)にカスタムデータフィールド(属性情報)を持たせる。
フィールドAPIは、Drupalのエンティティにカスタムデータフィールドを持たせ、フィールドデータの保存、ロード、編集そしてレンダリングをサポートします。フィールドAPIを利用することで、(ノード、ユーザーなどの)あらゆるエンティティタイプは、カスタムフィールドを持つことが出来るようになります。他のモジュールはウェブブラウザーからカスタムフィールドを操作するためのユーザーインターフェース、および様々な種類のデータタイプ、フォーム部品、そしてディスプレイフォーマットを提供することが出来ます。
フィールドの中にフィールドを作る、つまりフィールドを入れ子に設定したいときに使用するモジュールです。
フィールドをグループ化する Fieldgroup というモジュールがありますが、これは単にフィールドの表示や入力フォームの配置の際にグループ化するだけのもので、フィールドの構造はあくまでフラットです。
これに対してフィールドコレクションはフィールドの構造そのものを入れ子に設定し、複数のフィールドをセットにして1つのフィールドとして扱えるようにします。
例えば料理のレシピサイトを考えてみましょう。1つ1つのレシピをノードで作成することにします。「レシピ」というコンテンツタイプを作り、フィールドの構成を以下のように設定します。
field_view_field() を使うべし!
フィールドコレクションのテンプレートのカスタマイズで、少しハマったので、メモしておきます。
「賃貸物件(forrent)」というコンテンツタイプのノードに、近くの駅を表示する「アクセス(field_access)」というフィールド(フィールドコレクション)があるとします。「アクセス(field_access)」フィールドコレクションのフィールドには、「駅(field_station)」、「徒歩分(field_walk)」、「バス(field_bus)」があります。「駅(field_station)」は路線の中の最寄り駅、「徒歩分(field_walk)」はその駅から物件まで徒歩何分かかるかを示すフィールド、「バス(field_bus)」はその駅からバスで何分かかるかを示すフィールドです。
複数の路線の駅からアクセス出来る場合もあるので、「アクセス」フィールドの値の数は無制限とします。
特定のウィジェットタイプを操作するには、hook_field_widget_WIDGET_TYPE_form_alter() を使います。WIDGET_TYPE のところを、操作したいウィジェットタイプに置き換えて使います。
ウィジェットタイプの名前が分からないときは、操作したいウィジェットを含むフォームが存在するページで、hook_field_widget_form_alter() をコールしてみて、第1引数を $element とすると、$element['instance']['widget']['type'] にあります。
「特定のフィールドを特定のロールのユーザーだけに表示させたい」といった場合に必要になってくるモジュールです。(※単に「特定のフィールドだけを表示/非表示にしたい」という場合は、コンテンツタイプの「表示管理」(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「コンテンツタイプ名」 > 「表示管理」)でコントロール出来ます。)
D6 の Content Permissions モジュールの後継モジュールのようです。Content Permissions モジュールは CCK に同梱されていましたが、D7 ではこの Field Permissions モジュールを別途ダウンロードしてインストールする必要があります。
インストール後、設定のしかたも D6 の Content Permissions モジュールとは少し違います。以前はユーザー権限のページに、他のアクセスコントロールといっしょにズラーーーっと表示されていましたが、
Drupal7のインストールのデフォルトでは、Listモジュール(コアモジュール)が無効になっているので、これを有効にする。
そうするとフィールドタイプ(保存データ形式)で List(float) と List(integer)、リスト(テキスト)が選択できるようになるので、いづれかを選択すると、ウィジェット(データ編集用フォーム要素)に選択リスト、チェックボックス/ラジオボタンを設定できるようになる。
整数、浮動小数点数値といった数値タイプのフィールドを追加したい場合は、Numberモジュール(コアモジュール)を有効にすると、フィールドタイプの選択肢に追加される。Numberモジュールもデフォルトでは無効になっている。
コンテンツタイプのフィールド項目が多くなると、ノードの編集画面の整理(グループ分け等によるカスタマイズ)が必要になってくる。
フィールドセットなどで入力フォームをグループ分けするのに、独自の汎用カスタムモジュールの中で、hook_form_FORM_ID_alter() などのフックでフォームをカスタマイズしていましたが、そういったことは、普通に CCK をインストールしていれば GUI 操作で簡単に出来ることがわかった。
コンテンツタイプの「フィールドの管理」ページで、「追加」フォームの一番下、New group を追加すれば良い。