web-dev-qa-db-ja.com

一括フィールド更新?

既に多くのノードがあるDrupal 7コンテンツタイプに新しい(テキスト)フィールドを追加しました。

これらのすべてのノードのデフォルト値をフィールドに入力するにはどうすればよいですか?

34
daphshez

EntityFieldQuery を使用してノードのリストを取得し、ノードのフィールドを node_save() で更新できます。

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

これが1回限りの操作である場合、 Devel モジュールのExecute PHP関数を使用して上記を実行できます。それ以外の場合は、単純なカスタムモジュールを作成できます。

37
user7

私は Views Bulk Operations を使用し、「Execute Arbitrary PHP Script」を使用して基本的に上記の項目を実行しますが、追加のコードをすべて実行する必要はありません、必要な機能を実行する小さなスニペット($object->field_foo['und'][0]['value'] = 'some_value'など)

17
rfay

ある値でフィールドを更新したいだけなら、受け入れられた答えのより高性能な代替はこれです:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

違いは、直接使用することですfield_attach_presaveおよびfield_attach_update関数。ノードフィールドのみを正しく更新し、残りのノード保存プロセスをスキップします。これは、ノードの事前保存/保存フックが呼び出されない、「変更された」日付が現在の日付に更新されないなどの影響があります。ユースケースによっては、node_save()プロセス全体を使用する方がよい場合があります。

9
Mirsoft

実際、VBO(Views Bulk Operations)は優れたソリューションです。さらに、最新バージョンでは、1回の操作でノードの言語を更新する非常に簡単な方法を提供するオプション「エンティティ値の変更」があります。

4
xaa

Views Bulk Operations モジュールをインストールして有効にし、ページ表示付きのビューを作成します。

追加=>一括操作:ビューのコンテンツ(コンテンツ)フィールド。

参照

enter image description here

デフォルト値を設定するフィールドを選択します。

あなたの場合、そのタイトル。画像ではタグです。

ビューを保存し、作成したページに移動します。結果のページが複数ある場合は、現在のページのすべてのアイテム、すべてのページのすべてのアイテムを選択するか、個々のノードに対応するボックスを手動でチェックできます。続行するには、少なくとも1つのチェックボックスをオンにする必要があります。

次に、デフォルト値を設定して保存します。

2
DRUPWAY