Koşul Modeli ve Fieldset ile Magento 2 Modülü Örneği (Bölüm 2)
Yayınlanan: 2019-12-16Bir önceki yazımızda Admin Panel'de arayüzlü bir Kural modeli oluşturmamızı sağlayan koda göz atmıştık. Bu, modülün önemli bir parçasıydı ve eğer onu ön uçta kullanmayı öğrenmezseniz tek başına işe yaramaz. Bu nedenle, kuralların ve bunların içindeki koşulların önemini anlamanın tam zamanı.
Herhangi bir doğrulama modeli, bir nesnenin doğrulanmasına yardımcı olan koşulları devralır. Sonuç olarak, bu doğrulama kontrolüne dayanarak belirli faaliyetleri gerçekleştirebiliriz. Örneğimizde, alışveriş sepetinde "ağır_ağırlık" öznitelik değeri 1'e (doğru) eşit olan bir öğe olup olmadığını tanımlamaya izin veren bir kural oluşturacağız. Böyle bir ürünün bulunması durumunda, 'Sepetinizde bazı ağır ürünler var, teslimatı görüşmek için lütfen bizimle iletişime geçin' mesajını içeren bir blok görüntüleyeceğiz. alışveriş sepeti sayfasında.
* Rule modelimizi yükleme şeklimizin gerçek hayattaki bir duruma %100 uymayacağını anlamak çok önemlidir. Bu nedenle, Kural Kimliğinin yüklenmesi gereken bir kuralı düzgün bir şekilde belirteceğiz. Buna dayanarak, bilinen nesneyi, sepet-sevkiyat adresindeki öğelerle doğrulayacağız. Örnek olarak oluşturulmamış bir modülde, Kural nesneleri, mevcut ortamla, yani bir mağaza, bir müşteri ve grubu, saat, tarih vb. ile uyumluluklarına karşı onları doğrulayacak özel bir sınıf olarak yüklenmelidir. .Bu konuyu kesinlikle bir dizi daha ilgili makalemizde ele alacağız. *
Önemli yan not:
Artık modülün kodu github.com'daki halka açık depoda ücretsiz olarak mevcuttur. Böylece blog yazılarımızdan kod kopyala-yapıştır işlemi yapılmaz. Gerekli tüm kodlar burada kolayca bulunur.
İlk olarak, Yönetici Panelinde, ağır_ağırlık olarak belirtilen öznitelik değerine sahip bir ürün bulmaya yardımcı olacak yeni bir kural oluşturalım:
*Koşullarda öznitelik listesinde özniteliğinizi görmüyorsanız, önce bu özniteliğin yapılandırmasını kontrol ettiğinizden emin olun. Promosyon Kural Koşulları İçin Kullan seçeneğinin devre dışı bırakılmaması için yapılacaktır.
Bunu yapmak için Mağazalar > Nitelikler > Ürün'e gidin. Ardından, listeden niteliğinizi seçin > Vitrin Özellikleri >. Promosyon Kuralı Koşulları için Kullanım 'Evet' olarak ayarlanmalıdır. Lütfen daha fazla ayrıntı için aşağıdaki ekran görüntüsüne bakın:
Kuralımın kimliği 1'dir. Ayrıca, yükleme işlemini kolaylaştırmak için kullanacağım. Şimdi, yeni bir mesaj görüntüleyen yeni bloğumuzu ekleyerek sepet sayfasının düzenini güncelleyelim.
`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> ```
Düzenden fark etmiş olabileceğiniz gibi, 2 dosyaya daha ihtiyacımız olacak: bir blok ve bir şablon. Onları oluşturalım:
`app/code/Vendor/Rules/view/frontend/templates/cart/example.phtml` ```php <?php /** @var \Vendor\Rules\Block\Cart\RuleExample $block */ ?> <?= $block->getMessage();?> ```
Hepsi şablonda basitleştirildi, yani sadece bir mesaj çıktısı. Gerekirse, gerektiği gibi bir düzen ekleyebilirsiniz.
Tam sayfa önbellek sayfalarında bu tür şablonları kullanırken sonuçların da önbelleğe alınacağını unutmayın. Resmi Magento geliştirici belgelerinde ayrıntılı olarak açıklanan bu tür sayfalar için farklı bir yaklaşım kullanılmalıdır.
Örnekten ana sınıfı eklemenin zamanı geldi. İşte blok sınıfı:
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(); } } ```
Doğrulamanın tam olarak burada gizlendiği yer olduğu için bu sınıf üzerinde biraz duralım. Şablonumuzda kullandığımız tek bir genel yöntemi vardır. Bu, `getMessage()` yöntemidir. Yöntemin içinde, teslimat adresi (doğrulama için kullanılacak) ile birlikte doğru bir kural belirtilir (sepetimizi doğrular).
Gönderim adresini standart ön uç işlevini kullanarak, yani ödeme oturumundan talep ederek alırız. Kimliğe dayalı bir filtre kullanarak kuralı koleksiyondan doldururuz. (Bu yazının başında belirttiğim gibi, bu en iyi yol değildir ve yalnızca örnek olarak kullanılabilir. Kuralı alma yöntemini size en uygun şekilde açıkladığınızdan emin olun). Bloğumuzda 2 zorunlu nesne olduğunda, bize sadece kuralımızın `$rule->validate($shippingAddress)`yönteminin ne döndüreceğini, yani doğru mu yanlış mı kontrol etmemiz kalıyor. Sonuçlara göre, şablonumuzdaki alışveriş sepeti sayfasında görüntülenecek bir mesaj oluşturun (veya oluşturmayın). Kural modelinin içinde şu şekilde çalışır:
```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); } ```
Bu yöntem, "Vendor\Rules\Model\Rule" sınıf kurallarımızın devralındığı "Magento\Rule\Model\AbstractModel" soyut sınıfında zaten var. Özel doğrulamaya ihtiyacınız varsa, bir üst yöntemi çağırarak veya çağırmadan sınıf kurallarına kendi 'validate' yöntemini eklemek her zaman mümkündür.
Ön uçta sonuç olarak elde edeceğimiz şey:
*T1 Blue ürününün ağır_ağırlık öznitelik değeri 1'e eşittir:
![Sepetteki geçerli ürün]
*T1 Red ürününün ağır_ağırlık öznitelik değeri 0'a eşittir:
![Sepetteki geçerli ürün]
Ekran görüntülerinde de görebileceğiniz gibi, sepet etiketinin altında T1 Blue ürünü için bloktan mesajımız görüntüleniyor. Kırmızı olan için, tersine, mesaj görüntülenmez. Bu, kuralın doğru çalıştığı anlamına gelir.
Makaleyi okumak için zaman ayırdığınız için hepinize teşekkür ederim. Herhangi bir sorunuz varsa, bunları aşağıdaki yorumlarda paylaşmaktan çekinmeyin. Yardımcı olmaktan memnuniyet duyarım.