مثال لوحدة Magento 2 مع نموذج الشروط ومجموعة الحقول (الجزء 2)
نشرت: 2019-12-16في المقالة السابقة ، ألقينا نظرة على الكود الذي يسمح لنا بإنشاء نموذج قواعد بواجهة في لوحة المسؤول. كان هذا جزءًا مهمًا من الوحدة ، وهو أمر غير مفيد بحد ذاته إذا لم تتعلم كيفية استخدامه في الواجهة الأمامية. وبالتالي ، فقد حان الوقت لمعرفة أهمية القواعد والشروط داخلها.
يرث أي نموذج تحقق الشروط التي تساعد في التحقق من صحة الكائن. نتيجة لذلك ، بناءً على فحص التحقق هذا ، يمكننا أداء أنشطة معينة. في مثالنا ، سننشئ قاعدة تسمح بتحديد ما إذا كان هناك عنصر بقيمة السمة "الوزن الثقيل" التي تساوي 1 (صواب) في عربة التسوق. في حالة العثور على مثل هذا العنصر ، سنعرض كتلة بالرسالة التالية "لديك بعض العناصر الثقيلة في سلة التسوق الخاصة بك ، يرجى الاتصال بنا لمناقشة التسليم". في صفحة عربة التسوق.
* من الأهمية بمكان أن نفهم أن الطريقة التي نحمل بها نموذج القاعدة الخاص بنا لن تتناسب مع حالة واقعية بنسبة 100٪. هذا هو السبب في أننا سنحدد بدقة القاعدة التي يجب أن يتم تحميل معرّف القاعدة بها. بناءً عليه ، سوف نتحقق من صحة الكائن المعروف بالعناصر الموجودة في سلة التسوق ― عنوان الشحن. في وحدة نمطية لم يتم إنشاؤها كمثال ، يجب تحميل كائنات القواعد كفئة خاصة ، والتي ستتحقق من توافقها مع البيئة الحالية ، أي متجر ، عميل ومجموعته ، الوقت ، التاريخ ، إلخ. بالتأكيد سنتعامل مع هذا الأمر في سلسلة من المقالات الأخرى ذات الصلة. *
ملاحظة جانبية مهمة:
الآن ، رمز الوحدة متاح مجانًا في المستودع العام على github.com. وبالتالي ، لا مزيد من نسخ الكود من منشورات مدونتنا. كل الكود المطلوب متاح بسهولة هنا.
أولاً ، دعنا ننشئ قاعدة جديدة في لوحة المسؤول ، والتي ستساعد في العثور على منتج بقيمة السمة المحددة على أنها ثقيلة الوزن:
* إذا كنت لا ترى السمة الخاصة بك في قائمة السمات في الشروط ، فتأكد من التحقق من تكوين هذه السمة أولاً. يجب أن يتم ذلك للتأكد من عدم تعطيل خيار Use For Promo Rule Terms لذلك.
للقيام بذلك ، انتقل إلى المتاجر> السمات> المنتج. ثم حدد السمة الخاصة بك من القائمة> خصائص واجهة المتجر>. يجب تعيين شروط الاستخدام لقاعدة العرض الترويجي على أنها "نعم". يرجى الرجوع إلى لقطة الشاشة أدناه لمزيد من التفاصيل:
تحتوي قاعدتي على المعرف 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> ```
كما لاحظت من التخطيط ، سنحتاج إلى ملفين آخرين: قالب وقالب. دعونا ننشئها:
`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 () `. داخل الطريقة ، يتم تحديد قاعدة صحيحة (ستتحقق من سلة التسوق الخاصة بنا) ، بالإضافة إلى عنوان الشحن (سيتم استخدامه للتحقق).
نحصل على عنوان الشحن باستخدام وظيفة الواجهة الأمامية القياسية ، أي بطلبه من جلسة الخروج. نقوم بتعبئة القاعدة من المجموعة باستخدام مرشح يعتمد على المعرف. (كما ذكرت في بداية هذه التدوينة ، فهي ليست أفضل الوسائل ويمكن استخدامها كمثال فقط. تأكد من وصف طريقة الحصول على القاعدة بالطريقة التي تناسبك بشكل أفضل). عند وجود كائنين إلزاميين في الكتلة الخاصة بنا ، لم يتبق لنا سوى التحقق مما ستعيده طريقة "قاعدة $-> التحقق ($ 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`. إذا كنت بحاجة إلى تحقق مخصص ، فمن الممكن دائمًا إضافة طريقة "validate" الخاصة إلى قواعد الفئة مع أو بدون استدعاء طريقة أصل.
إليك ما سنحصل عليه نتيجة لذلك في الواجهة الأمامية:
* قيمة السمة الثقيلة لمنتج T1 Blue تساوي 1:
! [منتج صالح في عربة التسوق]
* قيمة السمة الثقيلة لمنتج T1 Red تساوي 0:
! [منتج صالح في عربة التسوق]
كما ترى في لقطات الشاشة ، يتم عرض رسالتنا من الكتلة لمنتج T1 Blue تحت ملصق عربة التسوق. بالنسبة للون الأحمر ، على العكس من ذلك ، لا يتم عرض الرسالة. هذا يعني أن القاعدة تعمل بشكل صحيح.
شكرا لكم جميعا على الوقت الذي قضيته في قراءة المقال. إذا كان لديك أي أسئلة ، فلا تتردد في مشاركتها في التعليقات أدناه. يسعدني تقديم المساعدة.