Puncte:1

De ce condiția personalizată nu conține entitatea părinte?

drapel us

Eu folosesc:

  • Drupal 9.1.7
  • Comerț 2.24

Încerc să îmi creez condiția personalizată (pe baza https://docs.drupalcommerce.org/commerce2/developer-guide/core/conditions). Cu toate acestea, entitatea părinte este întotdeauna NULL. Se pare că entitatea părinte funcționează doar atunci când specific comerț_comandă la fel de tip de entitate numai, dar am nevoie articol_comandă_comerț. ParentEntityAwareInterface și ParentEntityAwareTrait sunt în uz. Depanarea arată că:

  funcția publică evaluate(EntityInterface $entity) {
    $this->assertEntity($entity);
    /** @var \Drupal\commerce_order\Entity\OrderItemInterface $order_item */
    $articol_comanda = $entitate;
    /** @var \Drupal\commerce_promotion\Entity\PromotionInterface $promoție */
    $promoție = $this->parentEntity;
    //$promoția este NULL
    // restul codului
  }

$promotie este întotdeauna nulă.

Adnotare:

 * @CommerceCondition(
 * id = "myproj_product_condition",
 * label = @Translation ("Selector de produse"),
 * categorie = @Translation ("Selector de produse"),
 * entity_type = "commerce_order_item",
 * parent_entity_type = "commerce_promotion",
 * greutate = 9,
 * )
apaderno avatar
drapel us
M-am uitat la codul folosit de modulul *Commerce Core*. Nu pot spune de ce `$this->parentEntity` ar fi `NULL`, dar explicația ar putea fi în [`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) și [`Promotion::applies()`](https://git.drupalcode.org/project /commerce/-/blob/8.x-2.x/modules/promotion/src/Entity/Promotion.php#L554).
apaderno avatar
drapel us
Vezi comentariul la `Promoție::se aplică()`: *Filtrați condițiile în cazul în care rămân **condiții pentru articolele de comandă** (care au fost mutate pentru a oferi condiții).* (Sublinierea este a mea.)
Codium avatar
drapel us
@apaderno Depanez și arată că metoda mea de stare `evaluate()` rulează înainte de `\Drupal\commerce\Plugin\Commerce\Condition\ParentEntityAwareTrait::setParentEntity`, de aceea entitatea părinte este NULL. Ciudat.
apaderno avatar
drapel us
`setParentEntity()` nu este întotdeauna apelat. Din câte văd, citind codul, singurele clase care apelează acea metodă sunt `Promotion`, dar numai pentru condițiile *commerce_order* și `PaymentGateway`.
apaderno avatar
drapel us
Nu inteleg ce ar insemna *care au fost mutati sa ofere conditii*, in comentariul de cod pe care l-am citat mai devreme. Ce se întâmplă când un modul implementează o condiție care este asociată clasei `Promoție`, dar cere să obțină o instanță `OrderItem` ca argument? Există un cod care atribuie acele condiții unei instanțe a clasei `OfferItem` sau `Offer` în loc de clasa `Promotion`, așa cum spune adnotarea clasei?
apaderno avatar
drapel us
Acesta este, în esență, motivul pentru care nu am postat un răspuns: nu îmi este clar ce face codul Commerce Core, nu în punctul de a arăta care cod atribuie o condiție unei instanțe de clasă care este diferită de cea solicitată. în adnotare.
Puncte:0
drapel in

Documentele notează acest lucru:

(Dacă doriți ca Condiția să se aplice mai multor tipuri de entități părinte, puteți lăsa această proprietate nesetată; cu toate acestea, va trebui să aveți grijă în implementarea metodei evaluate() pentru a verifica tipul entității părinte înainte de a accesa oricare dintre entitățile părinte. metodele entității.)

Deci, se pare că adnotarea ar fi:

 * @CommerceCondition(
 * id = "myproj_product_condition",
 * label = @Translation ("Selector de produse"),
 * categorie = @Translation ("Selector de produse"),
 * entity_type = "commerce_order_item",
 * greutate = 9,
 * )

și afirmă:

$promoție = $this->parentEntity;

dacă (verificați $promoția este un anumit tip de entitate) {
 ...
}

Goliți memoria cache după actualizarea adnotării (și poate fi necesar să recreați regula? nu sunteți sigur dacă aceasta afectează acest lucru). Dincolo de asta, ar putea fi o eroare în Drupal Commerce.

apaderno avatar
drapel us
Adnotarea folosită din OP nu este greșită. Este aceeași adnotare folosită de [`OrderItemQuantity`](https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/promotion/src/Plugin/Commerce/Condition /OrderItemQuantity.php#L29), care folosește și `$promotion = $this->parentEntity;` în [`evaluate()`](https://git.drupalcode.org/project/commerce/-/blob) /8.x-2.x/modules/promotion/src/Plugin/Commerce/Condition/OrderItemQuantity.php#L81). Eroarea nu setează atât *entity_type*, cât și *parent_entity_type*; daca e ceva in neregula, e altceva.
Kevin avatar
drapel in
Totuși, tipul de entitate din acel exemplu este diferit? `commerce_order` vs `commerce_order_item`?
apaderno avatar
drapel us
Am vrut să spun că problema ar trebui investigată în continuare, pentru a înțelege dacă `$this->parentEntity` poate fi întotdeauna folosit și dacă există o alternativă.
Codium avatar
drapel us
@apaderno Văd doar exemple de commerce_order + commerce_promotion, dar condiția poate funcționa și cu commerce_order_item conform documentelor
apaderno avatar
drapel us
@Codium Da, dar în acest caz, condiția nu primește setarea „parentEntity”. Cred că am înțeles de ce se întâmplă asta, uitându-mă la metodele pe care le-am legat în celălalt comentariu pe care l-am postat, dar tot găsesc ceva neclar.
Codium avatar
drapel us
@apaderno investighez mai departe, mulțumesc pentru ajutor

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.