it-swarm-ja.com

コンテンツタイプに新しいフィールドを追加した後、デフォルトフィールドですべてのノードを更新します

いくつかのノードを持つ既存のコンテンツタイプがあります。デフォルト値が「off」の新しいブールフィールドを追加しました。

ただし、各ノードを再保存するまでデフォルト値は設定されないため、新しいフィールドがデフォルト値を使用しているノードのみを表示するビューは現在空です。

フィールドを追加する前に作成された既存のノードを更新して、そのフィールドをデフォルト値に設定するにはどうすればよいですか?

15
DanH

悲しいことに、これを行う簡単な方法はありません(VBO /ルール以外に)が、新しいフィールドを追加した後、特定のノードタイプのフィールド値を事前入力する必要がある場合に、カスタムモジュールインストールファイルの更新関数で使用するコードは次のとおりです(この場合、「ページ」ノード):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

この答え で説明されている別の手動の方法は、EntityFieldQueryを使用して各ノードをロード/保存します。よりDrupal-yですが、パフォーマンスははるかに低くなります...(各ノードに完全なノードロードと保存操作が必要です!)。

10
geerlingguy

おすすめコンテンツは直接MySQlにあります。テーブルは次のようになります。

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

それらを見ると、それは非常に簡単です-クエリがどのように見えるかを始めるために私に必要ですか、それともここから大丈夫ですか?

2
Mike

次のロジックを試してください。はるかに高速で、すべてのフック実装をバイパスします。 詳細 。単純な直接db_selectクエリを記述して、すべてのNIDを取得し、このサンプルコードでループできます。

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

sqlを使用して、フィールド値が設定されていないノードが

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_documentは、私のフィールドに対応するテーブルであり、ノードを参照するエンティティIDを持つ1つのエントリパー値セットを含みます

sQL挿入...選択構文を使用しました

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
0
Matoeil

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

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

参照

enter image description here

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

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

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

0
DRUPWAY

このモジュールでコンテンツタイプのフィールドを更新する簡単な方法を見つけました: Field Defaults

スクリーンショットをご覧ください。既存のコンテンツをデフォルト値で更新するか、既存の値を保持できます。

D7でテストしましたが、動作します。

enter image description here

0