多数のノードを持つ既存のコンテンツタイプがあります。デフォルト値が「off」の新しいブールフィールドを追加しました。
ただし、各ノードを再保存するまでデフォルト値は設定されていないため、新しいフィールドがデフォルト値を使用しているノードのみを表示するビューは現在空です。
フィールドを追加する前に作成された既存のノードを更新して、そのフィールドをデフォルト値に設定するにはどうすればよいですか?
多数のノードを持つ既存のコンテンツタイプがあります。デフォルト値が「off」の新しいブールフィールドを追加しました。
ただし、各ノードを再保存するまでデフォルト値は設定されていないため、新しいフィールドがデフォルト値を使用しているノードのみを表示するビューは現在空です。
フィールドを追加する前に作成された既存のノードを更新して、そのフィールドをデフォルト値に設定するにはどうすればよいですか?
回答:
悲しいことに、これを行う簡単な方法はありません(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ですが、パフォーマンスはあまり良くありません...(ノードごとに完全なノードのロードと保存操作が必要です!)。
entity_get_controller('node')->resetCache($nids);
そうでない場合、後続のnode_load()
キャッシュが古いデータをキャッシュからロードしnode_save()
、そのオブジェクトがその古いデータをデータベースに書き戻す可能性があります。
最善策はMySQlに直接あります。テーブルは次のようになります。
field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname
それらを見ると、それは非常に簡単です-クエリがどのように見えるかを始めるために私を必要としますか、ここから大丈夫ですか?
以下のロジックを試してください。はるかに高速で、すべてのフック実装もバイパスします。詳細は。単純な直接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つのエントリpar値を含む
私は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)
Views Bulk Operationsモジュールをインストールして有効にし、ページ表示のあるビューを作成します。
追加=>一括操作:ビュー内のコンテンツ(コンテンツ)フィールド。
参照
デフォルト値を設定するフィールドを選択します。
ビューを保存し、作成したページに移動します。結果のページが複数ある場合は、現在のページのすべてのアイテム、すべてのページのすべてのアイテムを選択するか、個々のノードに対応するボックスを手動で選択できます。続行するには、少なくとも1つのチェックボックスをオンにする必要があります。
次に、デフォルト値を設定して保存します。
このモジュールを使用して、コンテンツタイプのフィールドを更新する簡単な方法を見つけました。 フィールドのデフォルト
スクリーンショットをご覧ください。既存のコンテンツをデフォルト値で更新するか、既存の値を保持できます。
D7でテストしましたが、動作します。