プログラムからノードの特定のフィールドだけを修正/更新したいとき、このようなコードを考えるかもしれません。
$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 のコンテンツのアクセスコントロールにはいくつかの方法があります。コアに組み込まれている機能、あるいは追加モジュールによって提供されるもの、またはいくつかの追加モジュールの組み合わせによって実現するものなどです。いくつかの機能は互いに互換性があります。
Drupal 7 では、新しいクールな機能のひとつとして、ノードの「ビューモード」を簡単に追加出来るようになりました。ビューモードは、コメントなど他のエンティティでも有効なものですが、今回はノードについて取り上げてみたいと思います。
利用可能なすべてのコンテンツタイプの情報を得るには node_type_get_types() 、特定のノードのコンテンツタイプの情報を得るには node_type_get_type($node) を使います。
node_type_get_types() はコンテンツタイプの内部名称をキー、コンテンツタイプの情報のオブジェクトを値とする配列を返します。
node_type_get_type($node) は引数に渡されたノードが属するコンテンツタイプの情報のオブジェクトを返します。
コンテンツタイプのフィールド項目が多くなると、ノードの編集画面の整理(グループ分け等によるカスタマイズ)が必要になってくる。
フィールドセットなどで入力フォームをグループ分けするのに、独自の汎用カスタムモジュールの中で、hook_form_FORM_ID_alter() などのフックでフォームをカスタマイズしていましたが、そういったことは、普通に CCK をインストールしていれば GUI 操作で簡単に出来ることがわかった。
コンテンツタイプの「フィールドの管理」ページで、「追加」フォームの一番下、New group を追加すれば良い。
ノード編集フォームの中の CCK フィールドの、例えばセレクトボックスをチェックボックスにしたい場合なんかは、GUI で変更できる。