web-dev-qa-db-ja.com

選択リストフィールドを一括更新する方法

コンテンツタイプがあり、select list fieldがあります。 2つのオプションYesまたはNoがあり、このフィールドは必須フィールドではありません。

ウェブサイトには約100,000のノードがあり、各ノードの「はい」を選択するために一括更新すべてのノードを使用したいと思います。これを行う方法はありますか?

3
herci

質問の絞り込み

この回答では、「」のような私の追加コメントへの回答も考慮に入れています。現在値があるノードに対して、更新された値はどのようになりますかNo?になるはずですはいまたは残りいいえ "。 「良い質問:)この場合、すべてのノードにYes値が必要です。他の場合は、まず現在の値を確認してから、必要に応じて変更してください。あなたは正しいです」。

ステップ1:ルールコンポーネントを作成する

Rules Componentのこの例をご覧ください( Rules エクスポート形式):

{ "rules_set_an_initial_value_for_a_text_field" : {
    "LABEL" : "Set an initial value for a text field",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "node" : { "label" : "Node", "type" : "node" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_optionlist" } },
      { "NOT data_is" : { "data" : [ "node:field-optionlist" ], "value" : "A" } }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "node:field-optionlist" ], "value" : "B" } }
    ]
  }
}

上記の例をさらに説明するための詳細:

  • このルールコンポーネントは、以下の「ステップ2」で使用されます。
  • 私の場合、マシン名field_optionlistの選択リストフィールドがあります。
  • このフィールドには、実際には次のような3つの可能な値があります。

    • A(=詳細)。
    • B(=基本)。
    • C(=カスタム)。
  • 例として、「選択された値はAdvancedであってはなりません」というルール条件を使用することにしました(これはリセットしたくない値であると想定しています)。
  • そのフィールドの他の値については、ルールアクションでそのフィールドの値をBasicに変更します。

ルール条件Entity has fieldを追加して、このフィールドをこのルールコンポーネントでさらに処理できるようにしたことにも注意してください。これは、「データ比較」条件を追加しているときにルールUIで言及されていることでもあります。「」と書かれているところにあるデータセレクターは、ルールで使用できるデータにドリルダウンするのに役立ちます。エンティティフィールドを作成するにはデータセレクタに表示される場合は、「エンティティがフィールドを持つ」(または「コンテンツのタイプ」)」という条件を使用する必要がある場合があります。このEntity has field条件の重要性を説明するビデオチュートリアルについては、 データタイプとデータ選択 を参照してください。特に、そのビデオの13:30から17:30頃に示されているものを参照してください。

ここでは、選択したコンテンツタイプに関するルール条件を追加していないことに注意してください。これは、追加したい追加条件になる可能性があります。ただし、選択リストフィールドが関心のあるコンテンツタイプに対してのみ使用される場合、Entity has field条件で十分です。

必要に応じて、上記のエクスポートされたルールを取得(コピー)し、そのフィールドのマシン名のすべての出現箇所をフィールドのマシン名と一致するように変更します(この例では「A」や「B」などの可能な値を調整します)。 。それを行った後、このルールコンポーネントを自分の環境にインポートするだけです。

このルールコンポーネントをインポートしたら、自分のサイトのadmin/config/workflow/rules/componentsに移動します。次に、ハイパーリンク「execute」を使用して、自分のサイトでそれをqa-testします。そのリンクを使用した後、というボタンを使用しますSwitch to direct input mode。次に、いくつかのNode identifierを入力してを押すことができますExecuteボタン。選択したノードIDに応じて(つまり、そのフィールドがあり、ルール条件が満たされている場合)、ノードはそれに応じて更新されます。

ルールコンポーネントがノードのすべてのバリエーションに最適であると確信したら、以下のステップ2に進みます。

ステップ2:作業の大部分をVBOに任せる

この手順は非常に簡単です。処理するすべての約100.000ノードの適切なビューを作成し、それを Views Bulk Operations ビューに変換します。 VBOが操作として実行することの手掛かりは...予想通りですステップ1のルールコンポーネントを実行

方法がよくわからない場合は、 VBOでのルールコンポーネントの使用 "に関するビデオをご覧ください。さらに知りたい場合は、次の" 複数のパラメーターを持つルールコンポーネント "ビデオ。

もちろん、コンポーネントタイプによる処理、「a」特定の値のみにビュー出力を絞り込むなど、上記のアプローチには複数のバリエーションがあります。

注意:一度に100.000ノードを処理することは非常に困難です(メモリ要件など)。そのため、 " VBO設定の詳細 "についてのビデオも参照することをお勧めします... VBOを使用して一度にすべてを処理するように誘惑される前に...

ビデオチュートリアル

Rules に慣れていない(十分/まだ)場合は、32(!!!)のすばらしい無料のビデオチュートリアル Learn the Rules framework をチェックしてください。

ハッピー [〜#〜] vbo [〜#〜] -ing while Rules -ing!

2
Pierre.Vriens

複数のオプションがあります。

  • すべてのノードを反復処理してフィールドの値を変更するコードを使用できます(コードを実行するには、モジュール devel など)が必要です。

  • 他のオプションは Views Bulk Operations モジュールを使用して、そのタイプのノードのリストを表示するビューを作成し、views bulk operationsノードを編集するオプションがあるフィールド。これにより、ビュー内のすべてのノードを選択し、同じ値でフィールドを変更できます。

2
mistermoper

あなたはの線に沿って何かが必要です

<?php
$nodes = node_load_multiple(array(), array('type' => 'page'));
foreach($nodes as $node) {
  // Only modify nodes that have something in the body field
    $node->field_select['und'][0]['value'] = 'yes';
    node_save($node);
}

必要に応じて変更します。後でキャッシュをクリアすることを忘れないでください。

別のオプションは Administrative Views および Views Bulk Operations モジュールをインストールし、以下のスクリーンショットに示すように、値の変更をポイントします vbo and admin_views combined

1
Kartagis

このようなシナリオでは、ノードのタイムスタンプを保持するか、node_save()プロセス全体を回避する必要があります。この場合は、次のようにします。

$key = 'value'; // Key that holds the field value.
$value = '1'; // Assuming '1' is the value for the option "Yes".
$bundle = 'article'; // Name of the node type.

// Get $bundle node ids.
$query = new EntityFieldQuery();
$result = $query
  ->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', $bundle)
  ->execute();

if (isset($result['node'])) {
  // Load matching nodes.
  $nids = array_keys($result['node']);
  $nodes = entity_load('node', $nids);

  foreach ($nodes as $nid => $node) {
    // Update the field(s). Assign whole array since some nodes may 
    // come with an empty field.
    $node->field_foobar[LANGUAGE_NONE] = array(array($key => $value));

    // Give other modules the opportunity to act before saving fields.
    field_attach_presave('node', $node);

    // Save field data (modules can also hook here).
    field_attach_update('node', $node);
  }

  // Reset cache for the updated nodes.
  entity_get_controller('node')->resetCache($nids);
}
1
user26231

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

Add => Bulk operations:Content(Content)field in view。

参照

enter image description here

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

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

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

0
DRUPWAY