フィールド

プログラムからノードの特定のフィールドだけを修正/更新したいとき、このようなコードを考えるかもしれません。

$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つのノードを変更したいならまだしも、数千ものノードを連続で修正したい場合は?

コア: 
Drupal7
~ Field Api 和訳 ~

Drupalのエンティティ(ノード、ユーザーなどの概念)にカスタムデータフィールド(属性情報)を持たせる。

フィールドAPIは、Drupalのエンティティにカスタムデータフィールドを持たせ、フィールドデータの保存、ロード、編集そしてレンダリングをサポートします。フィールドAPIを利用することで、(ノード、ユーザーなどの)あらゆるエンティティタイプは、カスタムフィールドを持つことが出来るようになります。他のモジュールはウェブブラウザーからカスタムフィールドを操作するためのユーザーインターフェース、および様々な種類のデータタイプ、フォーム部品、そしてディスプレイフォーマットを提供することが出来ます。

コア: 
Drupal7

フィールドの中にフィールドを作る、つまりフィールドを入れ子に設定したいときに使用するモジュールです。

フィールドをグループ化する Fieldgroup というモジュールがありますが、これは単にフィールドの表示や入力フォームの配置の際にグループ化するだけのもので、フィールドの構造はあくまでフラットです。

これに対してフィールドコレクションはフィールドの構造そのものを入れ子に設定し、複数のフィールドをセットにして1つのフィールドとして扱えるようにします。

例えば料理のレシピサイトを考えてみましょう。1つ1つのレシピをノードで作成することにします。「レシピ」というコンテンツタイプを作り、フィールドの構成を以下のように設定します。

コア: 
Drupal7
~ Rendering Drupal 7 fields (the right way) Computerminds 和訳 ~

フィールドコレクションのテンプレートのカスタマイズで、少しハマったので、メモしておきます。

「賃貸物件(forrent)」というコンテンツタイプのノードに、近くの駅を表示する「アクセス(field_access)」というフィールド(フィールドコレクション)があるとします。「アクセス(field_access)」フィールドコレクションのフィールドには、「駅(field_station)」、「徒歩分(field_walk)」、「バス(field_bus)」があります。「駅(field_station)」は路線の中の最寄り駅、「徒歩分(field_walk)」はその駅から物件まで徒歩何分かかるかを示すフィールド、「バス(field_bus)」はその駅からバスで何分かかるかを示すフィールドです。

複数の路線の駅からアクセス出来る場合もあるので、「アクセス」フィールドの値の数は無制限とします。

コア: 
Drupal7

特定のウィジェットタイプを操作するには、hook_field_widget_WIDGET_TYPE_form_alter() を使います。WIDGET_TYPE のところを、操作したいウィジェットタイプに置き換えて使います。

ウィジェットタイプの名前が分からないときは、操作したいウィジェットを含むフォームが存在するページで、hook_field_widget_form_alter() をコールしてみて、第1引数を $element とすると、$element['instance']['widget']['type'] にあります。

コア: 
Drupal7

「特定のフィールドを特定のロールのユーザーだけに表示させたい」といった場合に必要になってくるモジュールです。(※単に「特定のフィールドだけを表示/非表示にしたい」という場合は、コンテンツタイプの「表示管理」(「管理」 > 「サイト構築」 > 「コンテンツタイプ」 > 「コンテンツタイプ名」 > 「表示管理」)でコントロール出来ます。)

D6 の Content Permissions モジュールの後継モジュールのようです。Content Permissions モジュールは CCK に同梱されていましたが、D7 ではこの Field Permissions モジュールを別途ダウンロードしてインストールする必要があります。

インストール後、設定のしかたも D6 の Content Permissions モジュールとは少し違います。以前はユーザー権限のページに、他のアクセスコントロールといっしょにズラーーーっと表示されていましたが、

コア: 
Drupal7

Drupal7のインストールのデフォルトでは、Listモジュール(コアモジュール)が無効になっているので、これを有効にする。

そうするとフィールドタイプ(保存データ形式)で List(float) と List(integer)、リスト(テキスト)が選択できるようになるので、いづれかを選択すると、ウィジェット(データ編集用フォーム要素)に選択リスト、チェックボックス/ラジオボタンを設定できるようになる。

整数、浮動小数点数値といった数値タイプのフィールドを追加したい場合は、Numberモジュール(コアモジュール)を有効にすると、フィールドタイプの選択肢に追加される。Numberモジュールもデフォルトでは無効になっている。

コア: 
Drupal7

コンテンツタイプのフィールド項目が多くなると、ノードの編集画面の整理(グループ分け等によるカスタマイズ)が必要になってくる。

フィールドセットなどで入力フォームをグループ分けするのに、独自の汎用カスタムモジュールの中で、hook_form_FORM_ID_alter() などのフックでフォームをカスタマイズしていましたが、そういったことは、普通に CCK をインストールしていれば GUI 操作で簡単に出来ることがわかった。

コンテンツタイプの「フィールドの管理」ページで、「追加」フォームの一番下、New group を追加すれば良い。

コア: 
Drupal6

ノード編集フォームの中の CCK フィールドの、例えばセレクトボックスをチェックボックスにしたい場合なんかは、GUI で変更できる。

  1. 「管理セクション」 > 「コンテンツの管理」 > 「コンテンツタイプ」 から、操作したいコンテンツタイプの「manage fields」をクリック。
  2. 操作するフィールドの「設定」をクリック。
  3. 「基本情報の変更」ボタンをクリック。
  4. 「ウィジェットタイプ」の中から変更したい設定を選んで、「継続」ボタンをクリック。
  5. 「値の数」を無制限か2以上にするとチェックボックスに、1を選ぶとラジオボタンになる。
  6. 「使用する値のリスト」に選択できるアイテムを設定する。phpコードで入力する場合は、フォームの ’#options’ に設定する配列を返すように書くと、動作する。
コア: 
Drupal6