web-dev-qa-db-ja.com

ルールを使用してフィールドコレクションフィールドのすべてのアイテムを合計する方法

無制限の値を持つフィールドコレクションがあります。

このフィールドコレクション内には、Price(field_price)というフィールドがあります。

addupフィールドコレクション内にあるすべての価格を合計値(コンテンツタイプ内の合計値フィールドに設定します)。

私はこのようなすべての価格を手に入れることができることを知っています:

enter image description here

しかし、トリッキーな部分はそれらを合計することです。

ループにCalculate a valueを追加してみましたが、データセレクターの場合、次のようなものしか得られません。

enter image description here

また、list-item:field-priceも使用できません。

すべての兆候は、これが正しいアプローチではないことを示しています。

答えに答えよう。


また、list-item:field-priceも使用できません。

私がずっと正しい道にいることがわかりました。これをcalculate a valueにしようとしたときにこれが利用できなかった理由は、price_fieldタイプをtext-fieldに変更したためです。非数値フィールドに対して計算を行うことはできません。 decimalに戻したところ、list-item:field_priceを使用できるようになりました。

2
No Sssweat

最初、私はあなたのルールが2つのパラメーター(たとえば 'current_total'と 'next_item')でルールコンポーネントを実行し、両方の合計を計算し、その合計をルールに返す必要があると考えました(そのコンポーネントパラメーターの "provides"を使用)。 。そして、ルールのループが終了する前に、ルールで、提供された合計でcurrent_totalを更新します。

ただし、このようなルールコンポーネントは必要ありません。必要なのは1つのルールだけです。このルール(ルールエクスポート形式)を見てください。IMOは、この質問について正確に行うプロトタイプです。

{ "rules_calculate_sum_of_prices_in_all_field_collection_items" : {
    "LABEL" : "Calculate sum of prices in all field collection items",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_view--article" : { "bundle" : "article" } },
    "IF" : [
      { "entity_has_field" : { "entity" : [ "node" ], "field" : "field_article_details" } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "\u003Cstrong\u003EDrupal calculator\u003C\/strong\u003E started ..." } },
      { "variable_add" : {
          "USING" : { "type" : "decimal", "value" : "0" },
          "PROVIDE" : { "variable_added" : { "total_price" : "Price total" } }
        }
      },
      { "LOOP" : {
          "USING" : { "list" : [ "node:field-article-details" ] },
          "ITEM" : { "article_details_item" : "Article details item" },
          "DO" : [
            { "data_calc" : {
                "USING" : {
                  "input_1" : [ "total-price" ],
                  "op" : "+",
                  "input_2" : [ "article-details-item:field-price" ]
                },
                "PROVIDE" : { "result" : { "calculation_result" : "Calculation result" } }
              }
            },
            { "data_set" : { "data" : [ "total-price" ], "value" : [ "calculation-result" ] } },
            { "drupal_message" : { "message" : "After adding a price of \u003Cstrong\u003E[article-details-item:field-price]\u003C\/strong\u003E for field collection item with id \u003Cstrong\u003E[article-details-item:item-id]\u003C\/strong\u003E, subtotal is \u003Cstrong\u003E[calculation-result:value]\u003C\/strong\u003E." } }
          ]
        }
      },
      { "drupal_message" : { "message" : "The \u003Cstrong\u003ETotal price\u003C\/strong\u003E for all prices included as field collection items is \u003Cstrong\u003E[total-price:value]\u003C\/strong\u003E." } },
      { "drupal_message" : { "message" : "\u003Cstrong\u003EDrupal calculator\u003C\/strong\u003E ended ..." } }
    ]
  }
}

このルールの詳細は以下のとおりです...

ルールイベント:

コンテンツは(Articleタイプの)表示され、コンテンツタイプarticleのマシン名を適切なものに適合させます(または適合する他のルールイベントを使用します)。

ルール条件:

エンティティにはフィールドがありますが、エンティティは「ノード」であり、フィールドコレクションフィールドのマシン名はfield_article_detailsです(このマシン名を適切なものに適合させますが、フィールドコレクションフィールド自体を使用してください)。

ルールアクション:

ここで魔法が起こります...これらは関連するルールアクションです:

  1. Show a message on the site、次のようなメッセージが表示されます。

    Drupal計算機が起動しました...

  2. Add a variable一方、total_price、10進数(2桁)、初期値0という名前の変数です。

  3. Add a loop、私のフィールドコレクションフィールド(マシン名field_article_detailsを使用)の各項目を反復処理し、反復ごとに次のルールアクションを実行します。

    • Calculate a valuetotal_price(上記のルールアクション2で定義)とarticle-details-item:field-price(これは、価格を含むフィールドコレクション内のフィールドのマシン名で、2桁の10進数)の合計を計算します。結果(合計)を変数calculation_resultに格納します。

    • Set a data value、変数calculation_resultに保存されている値をmy total_priceにコピーするだけです(上記のルールアクション2で定義)。備考:確かではありません(テストされていません)が、このcalculation_result変数はtotal_price(前のアクション)で直接置き換えることができるため、このアクションは必要ありません。

    • Show a message on the site、次のようなメッセージが表示されます。

    ID 3のフィールドコレクションアイテムに価格3.40を追加すると、小計は15.00になります。

  4. Show a message on the site、次のようなメッセージが表示されます。

    フィールドコレクションアイテムとして含まれるすべての価格の合計価格は26.23です。

  5. Show a message on the site、次のようなメッセージが表示されます。

    Drupal計算機が終了しました...

明らかに、このルールはむしろプロトタイプです。正常に動作することを確認したら、すべてのルールアクションを削除します。 Show a message on the site。そのため、アイテム2と3(最後のサブ箇条書きなし)のみがルールアクションとして残されます。

ショータイム ...

これが私のテスト結果のサンプル、つまり表示されるDrupalメッセージです。

Drupal calculator started ...
After adding a price of 2.45 for field collection item with id 1, subtotal is 2.45.
After adding a price of 9.15 for field collection item with id 2, subtotal is 11.60.
After adding a price of 3.40 for field collection item with id 3, subtotal is 15.00.
After adding a price of 1.23 for field collection item with id 4, subtotal is 16.23.
The Total price for all prices included as field collection items is 26.23.
Drupal calculator ended ...

より詳しい情報

フィールドコレクションルール のあるアイテムの処理は本当に楽しいです!これに慣れていない場合は、まず「 ルールを使用してメール本文のすべてのフィールドコレクションアイテムを反復処理する方法 」への回答を要約してみてください。

5
Pierre.Vriens

計算フィールドを使用して多値エンティティ参照フィールドに対してこれを行いました。一般的な前提は、フィールドコレクションを保持するエンティティに非表示の計算フィールドを追加することです。これは特に簡単ではありませんが、可能です-カスタムを作成する必要がありますPHPこれを達成するためのコード。私は以下のコード(フィールド名をジェネリックに変更)を含めています:

// Setup Entity Metadata Wrapper.
$wrapper = entity_metadata_wrapper($entity_type, $entity);
// Loop through field_collection.
foreach ($wrapper->field_collection->getIterator() as $related_wrapper) {
  // Expose the parts of the commerce_price field type.
  $price_field_wrapper = commerce_price_wrapper_value($related_wrapper, 'commerce_price_field');
  // Get the amount from the price field.
  $price_field_amount = $price_field_wrapper['amount'];
  // Get the currency type.
  $price_field_currency_code = $price_field_wrapper['currency_code'];
  // Use the amount and currency to covert to a decimal value.
  $price = commerce_currency_amount_to_decimal($price_field_amount, $price_field_currency_code);
  // Increment $total by the decimal stored in $price.
  $total += $price;
}

// Set the field value to $total formatted to 2 decimal places, with no 1000's separator.
$entity_field[0]['value']  = number_format($total, 2, '.', '');
2
HomoTechsual

受け入れられた回答 と同じ回答を思いつきました。 リクエストごと として、私の回答を元に戻しました。

Field_totalを0に設定します

次に、ループでfield_total + list-item:field_priceを追加し、結果をfield_totalに設定します。

enter image description here

1
No Sssweat