Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2)

Pubblicato: 2019-12-16

Nell'articolo precedente, abbiamo dato un'occhiata al codice che ci permette di creare un modello di regole con un'interfaccia nel pannello di amministrazione. Questa era una parte significativa del modulo, che è inutile di per sé se non impari come usarlo sul frontend. Pertanto, è giunto il momento di capire l'importanza delle regole e delle condizioni al loro interno.

Qualsiasi modello di convalida eredita le condizioni che aiutano a convalidare un oggetto. Di conseguenza, sulla base di questo controllo di convalida, possiamo eseguire determinate attività. Nel nostro esempio creeremo una regola che permette di definire se c'è un articolo con il valore dell'attributo `pesante_peso` che è uguale a 1 (vero) nel carrello. Nel caso in cui un articolo del genere venga trovato, visualizzeremo un blocco con il seguente messaggio "Hai degli articoli pesanti nel carrello, contattaci per discutere della consegna". nella pagina del carrello.

*È fondamentale capire che il modo in cui carichiamo il nostro modello di regole non si adatta al 100% a un caso reale. Questo è il motivo per cui specificheremo accuratamente una regola con la quale deve essere caricato l' ID regola . Sulla base di ciò, convalideremo l'oggetto noto con gli articoli dal carrello―indirizzo di spedizione. In un modulo che non è stato creato come esempio, gli oggetti Rules devono essere caricati come una classe speciale, che li convaliderà rispetto alla loro compatibilità con l'ambiente corrente, ovvero un negozio, un cliente e il suo gruppo, ora, data, ecc. Affronteremo sicuramente questo argomento in una serie di ulteriori articoli correlati. *

Nota a margine importante:

Ora, il codice del modulo è disponibile gratuitamente nel repository pubblico su github.com. Quindi, non dovrai più copiare e incollare il codice dai nostri post sul blog. Tutto il codice richiesto è comodamente disponibile qui.

Innanzitutto, creiamo una nuova regola nel Pannello di amministrazione, che aiuterà a trovare un prodotto con il valore dell'attributo specificato come heavy_weight:

Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2) | Blog di MageWorx
Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2) | Blog di MageWorx

*Se non vedi il tuo attributo nell'elenco degli attributi nelle condizioni, assicurati di controllare prima la configurazione di questo attributo. Deve essere fatto per garantire che l'opzione Usa per le condizioni delle regole promozionali non sia disabilitata.

Per farlo, vai su Negozi > Attributi > Prodotto. Quindi, seleziona il tuo attributo dall'elenco > Proprietà vetrina >. Usa per le condizioni delle regole promozionali devono essere impostate su "Sì". Si prega di fare riferimento allo screenshot qui sotto per maggiori dettagli:

Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2) | Blog di MageWorx

La mia regola ha ID 1. Inoltre, la userò per facilitare il processo di caricamento. Ora aggiorniamo il layout della pagina del carrello aggiungendo il nostro nuovo blocco che mostra un nuovo messaggio ad esso.

 `app/code/Vendor/Rules/view/frontend/layout/checkout_cart_index.xml` ```xml <?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceContainer name="checkout.cart.form.before"> <block class="Vendor\Rules\Block\Cart\RuleExample" name="custom_block_with_rules" template="Vendor_Rules::cart/example.phtml"/> </referenceContainer> </body> </page> ```

Come avrai notato dal layout, avremo bisogno di altri 2 file: un blocco e un modello. Creiamoli:

 `app/code/Vendor/Rules/view/frontend/templates/cart/example.phtml` ```php <?php /** @var \Vendor\Rules\Block\Cart\RuleExample $block */ ?> <?= $block->getMessage();?> ```

È tutto reso semplice nel modello, cioè solo un output di messaggio. Se necessario, è possibile aggiungere un layout in base alle esigenze.

Tieni presente che quando utilizzi tali modelli su pagine cache a pagina intera, anche i risultati verranno memorizzati nella cache. Un approccio diverso dovrebbe essere utilizzato per tali pagine, che è descritto in dettaglio nei documenti ufficiali di sviluppo di Magento.

È ora di aggiungere la classe principale dall'esempio. Ecco la classe di blocco:

 heckout\Model\Session as CheckoutSession; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\View\Element\Template; use Magento\Quote\Model\Quote\Address as QuoteAddress; use Vendor\Rules\Model\Rule; use Vendor\Rules\Model\ResourceModel\Rule\CollectionFactory as RulesCollectionFactory; /** * Class RuleExample */ class RuleExample extends Template { /** * @var RulesCollectionFactory */ private $rulesCollectionFactory; /** * @var string */ private $message; /** * @var CheckoutSession */ private $checkoutSession; /** * RuleExample constructor. * * @param Template\Context $context * @param RulesCollectionFactory $rulesCollectionFactory * @param CheckoutSession $checkoutSession * @param array $data */ public function __construct( Template\Context $context, RulesCollectionFactory $rulesCollectionFactory, CheckoutSession $checkoutSession, array $data = [] ) { $this->rulesCollectionFactory = $rulesCollectionFactory; $this->checkoutSession = $checkoutSession; $this->message = ''; parent::__construct($context, $data); } /** * @return string */ public function getMessage(): string { if ($this->message) { return $this->message; } $shippingAddress = $this->getShippingAddress(); if (!$shippingAddress) { return $this->message; } $rule = $this->getRule(); if ($rule && $rule->validate($shippingAddress)) { $this->message = __( 'You have some heavy weight items in your cart, please contact us to discuss delivery.' ); } return $this->message; } /** * @return Rule|null */ private function getRule(): ?Rule { /** @var \Vendor\Rules\Model\ResourceModel\Rule\Collection $rulesCollection */ $rulesCollection = $this->rulesCollectionFactory->create(); $rulesCollection->addFilter('rule_id', 1); /** @var Rule|null $rule */ $rule = $rulesCollection->getFirstItem(); return $rule; } /** * @return QuoteAddress|null */ private function getShippingAddress(): ?QuoteAddress { /** @var \Magento\Quote\Model\Quote $quote */ try { $quote = $this->checkoutSession->getQuote(); } catch (LocalizedException $exception) { return null; } if (!$quote) { return null; } return $quote->getIsVirtual() ? $quote->getBillingAddress() : $quote->getShippingAddress(); } } ```

Soffermiamoci un po' su questa classe perché è proprio lì che si nasconde la convalida. Ha un solo metodo pubblico che utilizziamo nel nostro modello. È il metodo `getMessage()`. All'interno del metodo viene specificata una regola corretta (validerà il nostro carrello), così come l'indirizzo di spedizione (verrà utilizzato per la convalida).

Otteniamo l'indirizzo di spedizione utilizzando la funzionalità standard del frontend, ovvero richiedendolo dalla sessione di checkout. Popoliamo la regola dalla raccolta utilizzando un filtro basato su ID. (Come ho detto all'inizio di questo post, non è il mezzo migliore e può essere utilizzato esclusivamente come esempio. Assicurati di descrivere il metodo per ottenere la regola nel modo più adatto a te). Quando abbiamo 2 oggetti obbligatori nel nostro blocco, ci resta solo da controllare cosa restituirà il metodo `$rule->validate($shippingAddress)` della nostra regola, cioè vero o falso. In base ai risultati, crea (o meno) un messaggio che verrà visualizzato nella pagina del carrello nel nostro modello. All'interno del modello di regole, funziona come segue:

 ```php /** * Validate rule conditions to determine if rule can run * * @param \Magento\Framework\DataObject $object * @return bool */ public function validate(\Magento\Framework\DataObject $object) { return $this->getConditions()->validate($object); } ```

Questo metodo esiste già nella classe astratta `Magento\Rule\Model\AbstractModel`, da cui le nostre regole di classe `Vendor\Rules\Model\Rule` vengono ereditate. Se hai bisogno di una convalida personalizzata, è sempre possibile aggiungere il proprio metodo `validate` alle regole di classe con o senza invocare un metodo padre.

Ecco cosa otterremo di conseguenza sul frontend:

*Il valore dell'attributo heavy_weight del prodotto T1 Blue è uguale a 1:

![Prodotto valido nel carrello]

Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2) | Blog di MageWorx

*Il valore dell'attributo heavy_weight del prodotto T1 Red è uguale a 0:

![Prodotto valido nel carrello]

Esempio di modulo Magento 2 con modello di condizioni e set di campi (parte 2) | Blog di MageWorx

Come puoi vedere negli screenshot, il nostro messaggio dal blocco viene visualizzato per il prodotto T1 Blue sotto l'etichetta del carrello. Per quello rosso, invece, il messaggio non viene visualizzato. Ciò significa che la regola funziona correttamente.


Grazie a tutti per aver dedicato del tempo a leggere l'articolo. In caso di domande, sentiti libero di condividerle nei commenti qui sotto. Sarò felice di aiutarti.