it-swarm.dev

규칙을 사용하여 필드 수집 필드의 모든 항목을 추가하는 방법은 무엇입니까?

무제한 값을 가진 필드 컬렉션이 있습니다.

이 필드 컬렉션에는 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')를 사용하여 규칙 구성 요소를 수행하고 둘 다의 합계를 계산하고 해당 합계를 규칙에 리턴해야합니다 (해당 구성 요소 매개 변수에 "제공"사용). . 그런 다음 규칙의 루프가 끝나기 전에 규칙에서 current_total을 제공된 합계로 업데이트하십시오.

그러나 이러한 규칙 구성 요소는 필요하지 않으며 하나의 규칙 만 필요합니다. 이 규칙 (규칙 내보내기 형식)을 살펴보십시오.이 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의 기계 이름을 적합에 맞게 조정하십시오 (또는 다른 규칙 이벤트에 적합).

규칙 조건 :

엔터티에는 필드가 있지만 엔터티는 "노드"이며 내 필드 컬렉션 필드의 시스템 이름은 field_article_details입니다 (이 머신 이름을 원하는대로 조정하지만 필드 컬렉션 필드 자체를 사용해야합니다).

규칙 조치 :

여기에 마술이 일어날 곳이 있습니다 ... 여기에 관련된 규칙 행동이 있습니다 :

  1. Show a message on the site메시지와 함께 :

    Drupal 계산기가 시작되었습니다 ...

  2. Add a variabletotal_price, 10 진수 (2 자리), 초기 값 0 인 변수입니다.

  3. Add a loop, 내 필드 수집 필드의 각 항목 (시스템 이름 field_article_details)을 반복하고 각 반복에 대해 다음 규칙 조치를 수행하십시오.

    • Calculate a value, total_price (위의 규칙 조치 2에 정의 됨) 및 article-details-item:field-price (가격을 포함하는 필드 콜렉션의 필드 기계 이름, 2를 10 진수로 계산) 숫자)를 입력하고 결과 (합계)를 변수 calculation_result에 저장합니다.

    • Set a data valuecalculation_result의 변수 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 ...

더 많은 정보

Field collectionRules 로 항목을 처리하는 것은 정말 재미 있습니다! 익숙하지 않다면 먼저 " 규칙을 사용하여 전자 메일 본문의 모든 필드 수집 항목을 반복하는 방법? "에 대한 답을 요약 해보십시오.

5
Pierre.Vriens

계산 된 필드를 사용하여 muti-valued entityreference 필드에 대해이 작업을 수행했습니다. 일반적인 전제는 숨겨진 컬렉션 필드를 필드 컬렉션을 보유하는 엔티티에 추가하는 것입니다. 특히 쉽지는 않지만 가능합니다. 사용자 정의를 작성해야합니다. 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