無制限の値を持つフィールドコレクションがあります。
このフィールドコレクション内には、Price(field_price)というフィールドがあります。
addupフィールドコレクション内にあるすべての価格を合計値(コンテンツタイプ内の合計値フィールドに設定します)。
私はこのようなすべての価格を手に入れることができることを知っています:
しかし、トリッキーな部分はそれらを合計することです。
ループにCalculate a value
を追加してみましたが、データセレクターの場合、次のようなものしか得られません。
また、list-item:field-price
も使用できません。
すべての兆候は、これが正しいアプローチではないことを示しています。
答えに答えよう。
また、list-item:field-priceも使用できません。
私がずっと正しい道にいることがわかりました。これをcalculate a value
にしようとしたときにこれが利用できなかった理由は、price_field
タイプをtext-field
に変更したためです。非数値フィールドに対して計算を行うことはできません。 decimal
に戻したところ、list-item:field_price
を使用できるようになりました。
最初、私はあなたのルールが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
です(このマシン名を適切なものに適合させますが、フィールドコレクションフィールド自体を使用してください)。
ここで魔法が起こります...これらは関連するルールアクションです:
Show a message on the site、次のようなメッセージが表示されます。
Drupal計算機が起動しました...
Add a variable一方、total_price
、10進数(2桁)、初期値0という名前の変数です。
Add a loop、私のフィールドコレクションフィールド(マシン名field_article_details
を使用)の各項目を反復処理し、反復ごとに次のルールアクションを実行します。
Calculate a value、total_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になります。
Show a message on the site、次のようなメッセージが表示されます。
フィールドコレクションアイテムとして含まれるすべての価格の合計価格は26.23です。
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 ...
フィールドコレクションルール のあるアイテムの処理は本当に楽しいです!これに慣れていない場合は、まず「 ルールを使用してメール本文のすべてのフィールドコレクションアイテムを反復処理する方法 」への回答を要約してみてください。
計算フィールドを使用して多値エンティティ参照フィールドに対してこれを行いました。一般的な前提は、フィールドコレクションを保持するエンティティに非表示の計算フィールドを追加することです。これは特に簡単ではありませんが、可能です-カスタムを作成する必要があります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, '.', '');