web-dev-qa-db-ja.com

ルールを介して複数の値を持つ段落フィールドにデータ値を設定しますか?

過去数日間、ルールを使用してノードの段落バンドル内のフィールドを変更する方法について調査および実験してきました。ノードの段落フィールドでは、複数の値を使用できます(最大6)。段落バンドルには、ユーザーが「タイプ」を選択するラジオボタンフィールドがあり、対応するフィールドの表示をトリガーします。 'Conditional Fields'モジュールには、依存関係がトリガーされない場合に「デフォルト値にリセット」するオプションがありますが、これは私にとって機能しません(私が信じるパッチが必要です)。代わりに、送信時にフォームをクリーンアップするルールを使用しています。これは通常のノードフィールドで完全に機能しましたが、クリーンアップする必要があるフィールドが段落エンティティ内にあり、フィールド内にエンティティの複数のインスタンスがある場合、それほど単純ではありません。

私の実験では、firstおよびonly最初の段落バンドルのインスタンスをデータにリセットすることができましたこのようなセレクター:

node:field-paragraphs-categories:0:field-select-service

ここでの問題(I think)は、データセレクターの:0:のおかげで、段落フィールドの最初の「行」のみを選択していることですか?私はその数字の意味を推測しているだけです。データセレクターのラベル付けは私にはわかりません。

データセレクターオプションに表示されている0または他の数値(例:1,2,3)がないと、変更したい適切なフィールドにアクセスできません。

利用可能なデータセレクターのスクリーンショット

私は正しい方向は段落フィールドをループして各「行」を個別に選択し、次にループの現在のリスト項目を介して適切なフィールドを選択してそのように変更することですが、これまでのところ完全に失敗しています。

これを行うには、(タイプルールの)コンポーネントと標準ルールが必要だと思いますよね?

ルール:

条件=エンティティにフィールドがあります-パラメータ:エンティティ:[ノード]、フィールド:field_paragraphs_categories

Loop =node:field-paragraphs-categories&コンポーネントをアクションとして追加

Action =IDでエンティティを取得-current-paragraph:item-id

コンポーネント(タイプルール):

条件=データ比較-current-paragraph:item-id(from loop):field-service-type

Action =データ値を設定します-current-paragraph:item-id(from loop):field-select-service

ループの現在のアイテムのIDをコンポーネントのデータ比較またはアクションに単純に渡すことができないため、含まれているフィールドにドリルダウンできます。これは私が困惑しているところです。おそらく私の方法全体が間違っているかもしれませんが、私にはわかりません。

私が見つけることができた最も近い命令はこのスレッドにあります https://www.drupal.org/node/1699712 @#9しかし、同様ですが、私が知っている部分についての洞察はありませんmに問題があります。

このサポートリクエストの短いバージョンは次のとおりです。

複数の値を持つ段落フィールドをループし、「service-type」にデータ比較条件を設定し、条件が次のように評価される場合に「select-service」にデータ値を設定するにはどうすればよいですか? true。

説明:

「データ値の設定」などのデータ比較またはアクションを追加しようとすると、各行を反復処理してその行のフィールドを次のように変更する方法を見つけることができません。

最初の反復= node:field-paragraphs-categories:0:field-select-service->値を設定

2回目の反復= node:field-paragraphs-categories:1:field-select-service->値を設定

3回目の反復= node:field-paragraphs-categories:2:field-select-service-> set value

4回目の反復= node:field-paragraphs-categories:3:field-select-service->値を設定

等々。

私が今理解している限り、そのインデックス番号を自動的にループしないと、可能な各インデックス番号(0,1 、2、3、4、5など)。

最終結果

いくつかのさらなるテストの後、問題は、段落が現在のリストアイテムフィールドをループ内での操作に利用できないことです(ただし、メッセージやその他のアクションを作成するためにアクセスできます)。 フィールドコレクションモジュール[〜#〜] does [〜#〜]はフィールドコレクションフィールドを公開しますルールがループし、Pierre.Vriensによって概説されている改良が代わりにそのモジュールで完全に動作します。

2
TheGruntler

以下でさらに詳しく説明するように、質問では複数のルールの問題に対処する必要があります...

1.ルールコンポーネントは必要ないかもしれません

ルールで「ループ」を使用することに慣れているようなので、その部分は問題ありません。しかし、あなたが気付いていないように見えるのは、 Conditional Rules モジュールを使用して次のような状態を確認できることです:

条件=データ比較-current-paragraph:item-id(from loop):field-service-type

この追加モジュールを使用することで、追加のルールコンポーネントが不要になり、(単一の)ルール自体で必要なすべてにアクセスできます。

2.ルールコンポーネントとのデータの受け渡し

ただし、ルールコンポーネントの使用も有効な代替手段です。それが望ましい場合は、ルール(およびルールコンポーネント)に次の改良を加えることをお勧めします。

  • 次のように定義された、ルールコンポーネントでは必ず2つの変数を使用してください(「提供」ではなく「パラメーター」を使用してください)。

    • current-paragraph:item-id(from loop):field-service-typeと一致するデータ型の最初の変数。変数V1を呼び出すとします。
    • current-paragraph:item-id(from loop):field-select-serviceと一致するデータ型の2番目の変数。変数V2を呼び出すとします。
  • ルールで、ルールコンポーネントを呼び出すと、次のようになります。

    • 変数V1のデータ値を渡します。これはcurrent-paragraph:item-id(from loop):field-service-typeである必要があります。
    • 変数V2のデータ値を渡します。これはcurrent-paragraph:item-id(from loop):field-select-serviceである必要があります。
    • 変数V1とV2を使用して、ルール条件とルールアクションを実行します。ルールコンポーネントの実行が終了すると、V2の更新された値は、ルールコンポーネントを呼び出したルールの対応するcurrent-paragraph:item-id(from loop):field-select-serviceにも反映されると確信しています。そうでない場合は、V2の「パラメーター」ではなく「提供」を使用してみてください(ルールコンポーネントを定義する場合)。

3.リストの操作に「データ値の設定」を使用しないでください

ルールの使用における一般的な間違いは、「データ値の設定」(複数値フィールドの場合)などのルールアクションを誰かが誤って使用し、そのフィールドのすべての既存の値が削除されることです。正しい方法は、ルールリストの「リストに追加」を使用することです(新しい値を使用するため)。これにより、既存の値が保持されます。これについての詳細は リストとループ ビデオを参照してください。

ただし、このシナリオでは、おそらく「リストから削除」を使用する必要があります(古い値を変更するため)。

PS:この質問はD7に関するものだと思います。

2
Pierre.Vriens