フィールド

コンテンツタイプの設定でフィールドの数が多くなってくると、編集画面も煩雑になってきて、どこに何があるのか入力する個所を探すのも大変になってきます。

Field Group モジュールをインストールしていれば、フィールドグループを追加して開閉式のフィールドセットにまとめることも出来ますが、それでもフィールドセットを開閉するたびにスクロールしたり、戻ったりとまだ少し煩雑です。

Field Group モジュールにはフィールドグループをタブで表示させる機能があるので、それを使うと編集画面がタブで整理され、とてもすっきりします。

コア: 
Drupal7
Drupal8

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

$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

ページ