Рейтинг:1

Почему пользовательское условие не содержит родительского объекта?

флаг us

Я использую:

  • Друпал 9.1.7
  • Коммерция 2.24

Я пытаюсь создать свое пользовательское условие (на основе https://docs.drupalcommerce.org/commerce2/developer-guide/core/conditions). Однако родительский объект всегда имеет значение NULL. Похоже, что родительский объект работает только тогда, когда я указываю commerce_order как тип объекта только, но мне нужно commerce_order_item. ParentEntityAwareInterface и ParentEntityAwareTrait находятся в использовании. Отладка показывает, что:

  оценка публичной функции (EntityInterface $entity) {
    $this->assertEntity($entity);
    /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
    $order_item = $сущность;
    /** @var \Drupal\commerce_promotion\Entity\PromotionInterface $promotion */
    $promotion = $this->parentEntity;
    //$ продвижение равно NULL
    // остальная часть кода
  }

$ продвижение всегда равно нулю.

Аннотация:

 * @CommerceCondition(
 * id = "myproj_product_condition",
 * label = @Translation("Выбор товара"),
 * категория = @Translation("Выбор продукта"),
 * entity_type = "commerce_order_item",
 * parent_entity_type = "commerce_promotion",
 * вес = 9,
 * )
apaderno avatar
флаг us
Я посмотрел код, используемый модулем *Commerce Core*. Я не могу сказать, почему `$this->parentEntity` будет `NULL`, но объяснение может быть в [`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) и [`Promotion::applies()`](https://git.drupalcode.org/project /commerce/-/blob/8.x-2.x/modules/promotion/src/Entity/Promotion.php#L554).
apaderno avatar
флаг us
См. комментарий к `Promotion::applies()`: *Отфильтруйте условия на тот случай, если останутся **условия позиции заказа** (которые были перемещены в условия предложения).* (выделено мной.)
Codium avatar
флаг us
@apaderno Я отлаживаю, и это показывает, что мой метод условия `evaluate()` выполняется до `\Drupal\commerce\Plugin\Commerce\Condition\ParentEntityAwareTrait::setParentEntity`, поэтому родительский объект имеет значение NULL. Странный.
apaderno avatar
флаг us
`setParentEntity()` вызывается не всегда. Из того, что я вижу, читая код, единственными классами, вызывающими этот метод, являются `Promotion`, но только для условий *commerce_order*, и `PaymentGateway`.
apaderno avatar
флаг us
Я не понимаю, что означает *которые были перемещены в предложение условий* в комментарии к коду, который я цитировал ранее. Что происходит, когда модуль реализует условие, связанное с классом «Promotion», но запрашивает получение экземпляра «OrderItem» в качестве аргумента? Есть ли код, который присваивает эти условия экземпляру класса `OfferItem` или `Offer` вместо класса `Promotion`, как говорится в аннотации класса?
apaderno avatar
флаг us
По сути, это причина, по которой я не опубликовал ответ: мне не ясно, что делает код Commerce Core, а не в тот момент, чтобы показать, какой код присваивает условие экземпляру класса, отличному от запрошенного в аннотации.
Рейтинг:0
флаг in

Документы отмечают это:

(Если вы хотите, чтобы Условие применялось к нескольким типам родительских сущностей, вы можете оставить это свойство неустановленным; однако вам нужно быть осторожным в реализации метода Assessment(), чтобы проверить тип родительского объекта перед доступом к любому из родительских объектов. методы объекта.)

Итак, кажется, аннотация будет:

 * @CommerceCondition(
 * id = "myproj_product_condition",
 * label = @Translation("Выбор товара"),
 * категория = @Translation("Выбор продукта"),
 * entity_type = "commerce_order_item",
 * вес = 9,
 * )

и утверждать:

$promotion = $this->parentEntity;

if (проверьте, что $promotion относится к определенному типу сущности) {
 ...
}

Очистите кеш после обновления аннотации (и, возможно, придется заново создать правило? Не уверен, что это повлияет на это). Кроме того, это может быть ошибка в Drupal Commerce.

apaderno avatar
флаг us
Аннотация, используемая из OP, не является неправильной. Это та же самая аннотация, которая используется в [`OrderItemQuantity`](https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/promotion/src/Plugin/Commerce/Condition /OrderItemQuantity.php#L29), который также использует `$promotion = $this->parentEntity;` в своем [`evaluate()`](https://git.drupalcode.org/project/commerce/-/blob /8.x-2.x/modules/promotion/src/Plugin/Commerce/Condition/OrderItemQuantity.php#L81). Ошибка не устанавливает одновременно *entity_type* и *parent_entity_type*; если что-то не так, это что-то другое.
Kevin avatar
флаг in
Однако тип сущности в этом примере другой? `commerce_order` и `commerce_order_item`?
apaderno avatar
флаг us
Я имел в виду, что вопрос должен быть дополнительно изучен, чтобы понять, всегда ли можно использовать `$this->parentEntity` и есть ли альтернатива.
Codium avatar
флаг us
@apaderno Я вижу только примеры commerce_order + commerce_promotion, но условие может работать и с commerce_order_item согласно документам
apaderno avatar
флаг us
@Codium Да, но в этом случае условие не устанавливает `parentEntity`. Я думаю, что понял, почему это происходит, глядя на методы, которые я связал в другом опубликованном мной комментарии, но я все еще нахожу что-то неясным.
Codium avatar
флаг us
@apaderno, я продолжаю расследование, спасибо за помощь

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.