ตัวอย่าง Magento 2 Module พร้อม Condition Model และ Fieldset (ตอนที่ 2)

เผยแพร่แล้ว: 2019-12-16

ในบทความที่แล้ว เราได้พิจารณาโค้ดที่ช่วยให้เราสร้างแบบจำลอง กฎ ด้วยอินเทอร์เฟซในแผงการดูแลระบบ นั่นเป็นส่วนสำคัญของโมดูล ซึ่งไม่มีประโยชน์หากคุณไม่ได้เรียนรู้วิธีใช้งานในส่วนหน้า ดังนั้นจึงถึงเวลาแล้วที่จะเข้าใจถึงความสำคัญของกฎและเงื่อนไขภายใน

โมเดลการตรวจสอบใด ๆ จะสืบทอดเงื่อนไขที่ช่วยตรวจสอบวัตถุ ด้วยเหตุนี้ เราสามารถดำเนินกิจกรรมบางอย่างได้ตามการตรวจสอบยืนยันนี้ ในตัวอย่างของเรา เราจะสร้างกฎที่อนุญาตให้กำหนดว่ามีสินค้าที่มีค่าแอตทริบิวต์ "heavy_weight" ที่เท่ากับ 1 (จริง) ในตะกร้าสินค้าหรือไม่ ในกรณีที่พบรายการดังกล่าว เราจะแสดงบล็อกที่มีข้อความต่อไปนี้ 'คุณมีสินค้าหนาบางรายการในรถเข็นของคุณ โปรดติดต่อเราเพื่อหารือเกี่ยวกับการจัดส่ง' ในหน้าตะกร้าสินค้า

*สิ่งสำคัญคือต้องเข้าใจว่าวิธีที่เราโหลดแบบจำลอง กฎ ของเรานั้นไม่เหมาะกับกรณีในชีวิตจริง 100% นี่คือเหตุผลที่เราจะระบุกฎให้ต้องโหลด Rule ID ให้เรียบร้อย ตามนั้น เราจะตรวจสอบวัตถุที่รู้จักกับสินค้าจากรถเข็น—ที่อยู่สำหรับจัดส่ง ในโมดูลที่ไม่ได้สร้างขึ้นเป็นตัวอย่าง วัตถุ กฎ จะต้องโหลดเป็นคลาสพิเศษ ซึ่งจะตรวจสอบความถูกต้องเทียบกับความเข้ากันได้กับสภาพแวดล้อมปัจจุบัน เช่น ร้านค้า ลูกค้าและกลุ่ม เวลา วันที่ ฯลฯ เราจะจัดการกับเรื่องนี้อย่างแน่นอนในบทความที่เกี่ยวข้องเพิ่มเติม *

หมายเหตุด้านที่สำคัญ:

ตอนนี้โค้ดของโมดูลมีให้ใช้ฟรีในที่เก็บสาธารณะบน github.com ดังนั้นจึงไม่มีการคัดลอกโค้ดจากโพสต์ในบล็อกของเราอีกต่อไป รหัสที่จำเป็นทั้งหมดมีให้ที่นี่

ขั้นแรก ให้สร้างกฎใหม่ในแผงการดูแลระบบ ซึ่งจะช่วยค้นหาผลิตภัณฑ์ที่มีค่าแอตทริบิวต์ที่ระบุเป็น heavy_weight:

ตัวอย่าง Magento 2 Module พร้อม Conditions Model และ Fieldset (ตอนที่ 2) | บล็อก MageWorx
ตัวอย่าง Magento 2 Module พร้อม Conditions Model และ Fieldset (ตอนที่ 2) | บล็อก MageWorx

*หากคุณไม่เห็นแอตทริบิวต์ของคุณในรายการแอตทริบิวต์ในเงื่อนไข โปรดตรวจสอบการกำหนดค่าของแอตทริบิวต์นี้ก่อน จะต้องดำเนินการเพื่อให้แน่ใจว่าตัวเลือก Use For Promo Rule Conditions จะไม่ถูกปิดใช้งาน

ไปที่ Stores > Attributes > Product จากนั้นเลือกแอตทริบิวต์ของคุณจากรายการ > คุณสมบัติหน้าร้าน > เงื่อนไขการใช้กฎโปรโมชั่นต้องตั้งค่าเป็น 'ใช่' โปรดดูภาพหน้าจอด้านล่างสำหรับรายละเอียดเพิ่มเติม:

ตัวอย่าง Magento 2 Module พร้อม Conditions Model และ Fieldset (ตอนที่ 2) | บล็อก MageWorx

กฎของฉันมี ID 1 นอกจากนี้ ฉันจะใช้เพื่ออำนวยความสะดวกในกระบวนการโหลด ตอนนี้ มาอัปเดตเลย์เอาต์ของหน้ารถเข็นโดยเพิ่มบล็อกใหม่ของเราที่แสดงข้อความใหม่

 `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> ```

ตามที่คุณอาจสังเกตเห็นจากเลย์เอาต์ เราจำเป็นต้องมีไฟล์เพิ่มอีก 2 ไฟล์: บล็อกและเทมเพลต มาสร้างกัน:

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

ทั้งหมดนี้ทำได้ง่ายในเทมเพลต กล่าวคือ แค่เอาท์พุตข้อความ หากจำเป็น คุณสามารถเพิ่มเค้าโครงได้ตามต้องการ

โปรดทราบว่าเมื่อใช้เทมเพลตดังกล่าวในหน้าแคชแบบเต็มหน้า ผลลัพธ์จะถูกแคชไว้ด้วย ควรใช้แนวทางที่แตกต่างออกไปสำหรับหน้าดังกล่าว ซึ่งมีการอธิบายโดยละเอียดในเอกสาร Magento dev อย่างเป็นทางการ

ได้เวลาเพิ่มคลาสหลักจากตัวอย่างแล้ว นี่คือคลาสบล็อก:

 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(); } } ```

มาพูดถึงคลาสนี้กันสักหน่อยเพราะว่านั่นคือจุดซ่อนการตรวจสอบความถูกต้อง มีวิธีการสาธารณะเพียงวิธีเดียวที่เราใช้ในเทมเพลตของเรา เป็นเมธอด `getMessage()` ภายในวิธีการ จะมีการระบุกฎที่ถูกต้อง (จะตรวจสอบรถเข็นของเรา) ตลอดจนที่อยู่สำหรับจัดส่ง (จะใช้สำหรับการตรวจสอบความถูกต้อง)

เราได้รับที่อยู่สำหรับจัดส่งโดยใช้ฟังก์ชันส่วนหน้ามาตรฐาน กล่าวคือ โดยการขอจากช่วงการชำระเงิน เราเติมกฎจากคอลเล็กชันโดยใช้ตัวกรองที่ยึดตาม ID (อย่างที่บอกในตอนต้นของโพสต์นี้ ไม่ใช่วิธีที่ดีที่สุดและสามารถใช้เป็นตัวอย่างเท่านั้น อย่าลืมอธิบายวิธีการรับกฎด้วยวิธีที่เหมาะสมกับคุณที่สุด) เมื่อมีออบเจ็กต์บังคับ 2 รายการในบล็อกของเรา เราจะเหลือเพียงเราตรวจสอบว่าวิธีการ `$rule->validate($shippingAddress)`ของกฎของเราจะคืนค่ากลับมา กล่าวคือ จริงหรือเท็จ จากผลลัพธ์ ให้สร้าง (หรือไม่) ข้อความที่จะแสดงบนหน้ารถเข็นในเทมเพลตของเรา ภายในโมเดลกฎ ทำงานดังนี้:

 ```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); } ```

เมธอดนี้มีอยู่แล้วในคลาสนามธรรม `Magento\Rule\Model\AbstractModel` ซึ่งกฎคลาส `Vendor\Rules\Model\Rule` ของเราได้รับการสืบทอด หากคุณต้องการการตรวจสอบความถูกต้อง คุณสามารถเพิ่มเมธอดของตัวเอง `ตรวจสอบความถูกต้อง' ลงในกฎของคลาสได้เสมอ โดยมีหรือไม่มีการเรียกใช้เมธอดพาเรนต์

นี่คือสิ่งที่เราได้รับจากส่วนหน้า:

*ค่าแอตทริบิวต์ heavy_weight ของผลิตภัณฑ์ T1 Blue เท่ากับ 1:

![สินค้าที่มีในรถเข็น]

ตัวอย่าง Magento 2 Module พร้อม Conditions Model และ Fieldset (ตอนที่ 2) | บล็อก MageWorx

*ค่าแอตทริบิวต์ heavy_weight ของผลิตภัณฑ์ T1 Red เท่ากับ 0:

![สินค้าในตะกร้าสินค้า]

ตัวอย่าง Magento 2 Module พร้อม Condition Model และ Fieldset (ตอนที่ 2) | บล็อก MageWorx

ดังที่คุณเห็นในภาพหน้าจอ ข้อความของเราจากบล็อกจะแสดงขึ้นสำหรับผลิตภัณฑ์ T1 Blue ใต้ป้ายกำกับรถเข็น สำหรับสีแดง ตรงกันข้าม ข้อความไม่ปรากฏ ซึ่งหมายความว่ากฎทำงานอย่างถูกต้อง


ขอขอบคุณทุกท่านที่สละเวลาอ่านบทความ หากคุณมีคำถามใด ๆ อย่าลังเลที่จะแบ่งปันในความคิดเห็นด้านล่าง เรายินดีที่จะช่วยเหลือ