Điểm:1

Tại sao điều kiện tùy chỉnh không chứa thực thể mẹ?

lá cờ us

Tôi đang sử dụng:

  • drupal 9.1.7
  • Thương mại 2,24

Tôi đang cố gắng tạo điều kiện tùy chỉnh của mình (dựa trên https://docs.drupalcommerce.org/commerce2/developer-guide/core/conditions). Tuy nhiên, thực thể mẹ luôn là NULL. Có vẻ như thực thể mẹ chỉ hoạt động khi tôi chỉ định commerce_order như thực thể_type chỉ, nhưng tôi cần commerce_order_item. ParentEntityAwareInterfaceParentEntityAwareTrait đang được sử dụng. Gỡ lỗi cho thấy rằng:

  đánh giá hàm công khai (EntityInterface $entity) {
    $this->assertEntity($entity);
    /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
    $order_item = $entity;
    /** @var \Drupal\commerce_promotion\Entity\PromotionInterface $promotion */
    $promotion = $this->parentEntity;
    //$khuyến mãi là NULL
    // phần còn lại của mã
  }

$khuyến mãi luôn luôn là rỗng.

Chú thích:

 * @C CommerceCondition (
 * id = "myproj_product_condition",
 * nhãn = @Translation("Bộ chọn sản phẩm"),
 * danh mục = @Translation("Bộ chọn sản phẩm"),
 * entity_type = "thương_mại_đơn_hàng_mặt_hàng",
 * parent_entity_type = "thương_mại_khuyến mãi",
 * trọng lượng = 9,
 * )
apaderno avatar
lá cờ us
Tôi đã xem mã được sử dụng bởi mô-đun *Cốt lõi thương mại*. Tôi không thể giải thích tại sao `$this->parentEntity` sẽ là `NULL`, nhưng có thể giải thích trong [`Promotion::getConditions()`](https://git.drupalcode.org/project/commerce/-/ blob/8.x-2.x/modules/promotion/src/Entity/Promotion.php#L271), [`Promotion::apply()`](https://git.drupalcode.org/project/commerce/ -/blob/8.x-2.x/modules/promotion/src/Entity/Promotion.php#L590) và [`Promotion::applies()`](https://git.drupalcode.org/project /commerce/-/blob/8.x-2.x/modules/promotion/src/Entity/Promotion.php#L554).
apaderno avatar
lá cờ us
Xem nhận xét về `Khuyến mãi::áp dụng()`: *Lọc các điều kiện đề phòng trường hợp còn sót lại **điều kiện mặt hàng đặt hàng** (đã được chuyển sang điều kiện ưu đãi).* (Tôi nhấn mạnh.)
Codium avatar
lá cờ us
@apaderno Tôi đang gỡ lỗi và nó cho thấy rằng phương thức `evaluate()` điều kiện của tôi đang chạy trước `\Drupal\commerce\Plugin\Commerce\Condition\ParentEntityAwareTrait::setParentEntity`, vì vậy đó là lý do tại sao thực thể mẹ là NULL. Lạ lùng.
apaderno avatar
lá cờ us
`setParentEntity()` không phải lúc nào cũng được gọi. Đối với những gì tôi có thể thấy khi đọc mã, các lớp duy nhất gọi phương thức đó là `Khuyến mãi`, nhưng chỉ dành cho các điều kiện *commerce_order* và `PaymentGateway`.
apaderno avatar
lá cờ us
Tôi không hiểu *đã được chuyển sang điều kiện cung cấp* nghĩa là gì, trong nhận xét mã mà tôi đã trích dẫn trước đó. Điều gì xảy ra khi một mô-đun triển khai một điều kiện được liên kết với lớp `Khuyến mãi` nhưng lại yêu cầu lấy một thể hiện `OrderItem` làm đối số? Có mã nào gán các điều kiện đó cho một thể hiện của lớp `OfferItem` hoặc `Offer` thay vì lớp `Promotion` như chú thích lớp nói không?
apaderno avatar
lá cờ us
Về cơ bản, đó là lý do tại sao tôi chưa đăng câu trả lời: Tôi không rõ mã Commerce Core đang làm gì, không phải ở điểm chỉ ra mã nào đang gán điều kiện cho một phiên bản lớp khác với phiên bản được yêu cầu trong chú thích.
Điểm:0
lá cờ in

Các tài liệu lưu ý điều này:

(Nếu bạn muốn Điều kiện áp dụng cho nhiều loại thực thể mẹ, bạn có thể không đặt thuộc tính này; tuy nhiên, bạn sẽ cần phải cẩn thận khi triển khai phương thức đánh giá () để kiểm tra loại thực thể mẹ trước khi truy cập vào bất kỳ thực thể mẹ nào. phương thức của thực thể.)

Vì vậy, có vẻ như chú thích sẽ là:

 * @C CommerceCondition (
 * id = "myproj_product_condition",
 * nhãn = @Translation("Bộ chọn sản phẩm"),
 * danh mục = @Translation("Bộ chọn sản phẩm"),
 * entity_type = "thương_mại_đơn_hàng_mặt_hàng",
 * trọng lượng = 9,
 * )

và khẳng định:

$promotion = $this->parentEntity;

nếu (kiểm tra $promotion là một loại thực thể nhất định) {
 ...
}

Xóa bộ nhớ cache của bạn sau khi cập nhật Chú thích (và có thể phải tạo lại Quy tắc? Không chắc nó có ảnh hưởng đến điều đó không). Ngoài ra, nó có thể là một lỗi trong Drupal Commerce.

apaderno avatar
lá cờ us
Chú thích được sử dụng từ OP không sai. Đó là cùng một chú thích được sử dụng bởi [`OrderItemQuantity`](https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/promotion/src/Plugin/C Commerce/Condition /OrderItemQuantity.php#L29), lớp này cũng sử dụng `$promotion = $this->parentEntity;` trong [`evaluate()`](https://git.drupalcode.org/project/commerce/-/blob) /8.x-2.x/modules/promotion/src/Plugin/Commerce/Condition/OrderItemQuantity.php#L81). Lỗi không đặt cả *entity_type* và *parent_entity_type*; nếu có gì đó sai, đó là một cái gì đó khác.
Kevin avatar
lá cờ in
Tuy nhiên, loại thực thể trong ví dụ đó là khác nhau? `đơn_hàng_thương_mại` so với `đơn_hàng_thương_mại_mặt_hàng`?
apaderno avatar
lá cờ us
Ý tôi là vấn đề cần được điều tra thêm, để hiểu liệu `$this->parentEntity` có thể luôn được sử dụng hay không và liệu có giải pháp thay thế hay không.
Codium avatar
lá cờ us
@apaderno Tôi chỉ thấy các ví dụ về commerce_order + commerce_promotion, nhưng điều kiện cũng có thể hoạt động với commerce_order_item theo tài liệu
apaderno avatar
lá cờ us
@Codium Đúng vậy, nhưng trong trường hợp đó, điều kiện không được đặt `parentEntity`. Tôi nghĩ rằng tôi đã hiểu tại sao điều đó xảy ra, khi xem xét các phương pháp tôi đã liên kết trong nhận xét khác mà tôi đã đăng, nhưng tôi vẫn thấy có điều gì đó không rõ ràng.
Codium avatar
lá cờ us
@apaderno tôi đang điều tra thêm, cảm ơn bạn đã giúp đỡ

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.