تعيين قيود الشحن المتقدمة في Magento 2
نشرت: 2017-05-17سنشرح في هذه المقالة كيفية إخفاء طريقة الشحن عند تطبيق شروط معينة.
في بعض السيناريوهات ، قد يرغب مالكو المتاجر في تقييد خيارات الشحن للأسباب التالية:
- منتج له أبعاد ووزن كبير ، وبالتالي لا يمكن شحنه بأي طريقة قياسية ،
- لا تسمح ظروف التخزين المجمدة بتسليم المنتج في الوقت المناسب
- الشحن مقيد بسبب موقع العميل (الدولة ، المنطقة ، المدينة )
- لا يسمح C art Total للمتسوق بالتأهل لأي عروض شحن ،
- إلخ.
لا يوفر التحديد الافتراضي لخيارات شحن Magento الكثير من المرونة. من الممكن فقط تقييد الشحن لمقاطعات ومناطق معينة أو عندما يكون إجمالي سلة التسوق أقل من المبلغ المحدد.
إذا كنت تعتقد أن هذا لا يكفي ، تابع القراءة.
سأخبرك بكيفية إنشاء المكون الإضافي الخاص بك والذي سيتيح لك تقييد خيارات الشحن وفقًا لنموذج عملك وأهدافك وشروطك.
ملاحظة
لن أخوض في الخطوات المحددة اللازمة لإنشاء امتداد لـ Magento 2. يمكنك معرفة كيفية القيام بذلك هنا أو هنا.
من أجل تعطيل أي طريقة شحن معينة ديناميكيًا ، نحتاج إلى مجموعة جديدة من الفئات في ملحقنا - هذان مكونان إضافيان . سيكون الأول مسؤولاً عن التحقق من طريقة الشحن ، بينما سيقوم الثاني بترشيحها.
باختصار ، سيتم تمييز كل طريقة لا تجتاز التحقق على أنها " معطلة " ، وفي الخطوة التالية ، يتم تصفية وحذف جميع طرق " is_disabled " من القائمة الرئيسية.
دعنا نلف.
* نظرًا لأن النهج الذي سأصفه يستند إلى المبادئ المستخدمة في ملحق Shipping Suite ، سأستخدم اسم البائع "Mageworx" واسم الامتداد "ShippingRules". ملاحظة! من أجل تجنب الأخطاء ، تحتاج إلى استبدال تلك بأسماءك الخاصة!
أولاً ، دعنا ننشئ مكونًا إضافيًا (فئة) سيتم استخدامه للتصفية. إليك كيفية:
> MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result \ Append
مساحة الاسم MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result ؛ فئة إلحاق { / ** *var \ Magento \ Checkout \ Model \ Session | \ Magento \ Backend \ Model \ Session \ Quote * / جلسة $ المحمية ؛ / ** *param \ Magento \ Checkout \ Model \ Session $ checkoutSession *param \ Magento \ Backend \ Model \ Session \ Quote $ backendQuoteSession *param \ Magento \ Framework \ App \ State $ state *internal param Session $ session * / الوظيفة العامة __construct ( \ Magento \ Checkout \ Model \ Session $ checkoutSession ، \ Magento \ Backend \ Model \ Session \ Quote $ backendQuoteSession ، \ Magento \ Framework \ App \ State $ state ) { إذا ($ state-> getAreaCode () == \ Magento \ Framework \ App \ Area :: AREA_ADMINHTML) { $ this-> Session = $ backendQuoteSession ؛ } آخر { $ this-> Session = $ checkoutSession؛ } } / ** * تحقق من كل طريقة شحن قبل إلحاقها. * تطبيق إجراء القواعد إذا كان التحقق من الصحة ناجحًا. * هل يمكن وضع علامة على بعض القواعد على أنها معطلة. ستتم إزالة القواعد المعطلة في الفصل * @ see MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result \ GetAllRates * بالتحقق من قيمة هذه العلامة في كائن المعدل. * * ملاحظة: إذا كانت لديك بعض المشكلات المتعلقة بالقواعد وطرق الشحن ، فابدأ في تصحيح الأخطاء من هنا. * *param \ Magento \ Shipping \ Model \ Rate \ Result $ الموضوع *param \ Magento \ Quote \ Model \ Quote \ Address \ RateResult \ AbstractResult | \ Magento \ Shipping \ Model \ Rate \ Result $ result *return مجموعة * / الوظيفة العامة قبل الإلحاق ($ subject، $ result) { إذا (! $ result exampleof \ Magento \ Quote \ Model \ Quote \ Address \ RateResult \ Method) { العودة [نتيجة $] ؛ } filtableMethods $ = [ "flatrate_flatrate" ، "ups_XDM" ، "ups_XPR"، "ups_WXS" ، "طريقة_ناقل" ، // ... أضف هنا رموز الطريقة الخاصة بك ] ؛ طريقة $ methodCode = $ result-> getCarrier (). "_". نتيجة $-> getMethod ()؛ إذا (! in_array ($ methodCode، $ filtableMethods)) { العودة [نتيجة $] ؛ } / **var \ Magento \ Quote \ Model \ Quote $ quote * / $ quote = $ this-> session-> getQuote () ؛ quoteItems $ = quote-> getAllItems ()؛ $ heavyWeightFlag = خطأ ؛ foreach ($ quoteItems as $ item) { إذا ($ item-> getWeight ()> 100) { $ heavyWeightFlag = صحيح ؛ استمر؛ } } إذا ($ heavyWeightFlag == صحيح) { نتيجة $-> setIsDisabled (صواب) ؛ } العودة [نتيجة $] ؛ } }
نقوم بإجراء 3 عمليات تحقق في جسم المكون الإضافي الخاص بنا:
1.
! $ result exampleof \ Magento \ Quote \ Model \ Quote \ Address \ RateResult \ Method
- يضمن أننا عند نقطة الدخول نحصل على ما نحتاجه: هذا مثال على طريقة الشحن. في حالة عدم وجودها ، نعيدها كما هي.
2.
! in_array ($ methodCode، $ filtableMethods)
- بعد ذلك ، نتحقق مما إذا كانت الطريقة الحالية موجودة في قائمة طرق التصفية. في حالة عدم وجودها ، نعيدها كما هي.
3.
heavyWeightFlag $ == صحيح
- هو الشيك الأخير والرئيسي. إذا تم تطبيق العلم على القيمة الحقيقية ، فسيتم تعطيل الطريقة الحالية: $ result-> setIsDisabled (true) ؛
سنحاول تصفية منتج واحد على الأقل مضاف إلى عربة التسوق ويزيد وزنه عن 100 وحدة قياسية (رطل أو كيلوغرامات).
الطرق المتاحة للتصفية هي "flatrate_flatrate" ، "ups_XDM" ، "ups_XPR" ، "ups_WXS" ، "طريقة_ناقل" . يتم ترميزها بدقة وتخزينها في المصفوفة $ filtableMethods .
نحن نعمل على الكود باستخدام رمز طريقة الشحن بالكامل والذي يتكون ، كقاعدة عامة ، من رمز شركة النقل ($ result-> getCarrier ()) ورمز الطريقة نفسها ($ result-> getMethod ()) المتصل بـ " _ " .
يتم أخذ المنتجات المطلوبة للشيك مباشرة من عرض أسعار العميل الحالي.
ملاحظة
سيسمح لك جزء صغير من التعليمات البرمجية في مُنشئ فئة المصفوفة بتحديد عرض الأسعار على كل من الواجهة الأمامية والخلفية (بشرط إنشاء أمر في لوحة المسؤول).
باستخدام \ Magento \ Framework \ App \ State ، يمكننا التحقق من المنطقة التي نتواجد فيها في الوقت الحالي ، وتحديد الاقتباس اللازم:
1. \ Magento \ Backend \ Model \ Session \ Quote for Admin
2. \ Magento \ Checkout \ Model \ Session للواجهة الأمامية
هذا هو!
الآن يمكننا التحقق من صحة طرق الشحن ويمكننا المتابعة إلى المرحلة التالية - إنشاء مكون إضافي لتعطيل طرق الشحن غير الصالحة (وفقًا لشروطنا).
هذه هي الطريقة:
> MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result \ GetAllRates
/ ** * حقوق الطبع والنشر 2016 MageWorx. كل الحقوق محفوظة. * راجع LICENSE.txt للحصول على تفاصيل الترخيص. * / مساحة الاسم MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result ؛ فئة GetAllRates { / ** * قم بتعطيل أسعار الشحن المحددة. * * ملاحظة: إذا لم تتمكن من رؤية بعض أسعار الشحن ، فابدأ في التصحيح من هنا. في البداية ، تحقق من "is_disabled" * معلمة في كائن معدل الشحن. * *param \ Magento \ Shipping \ Model \ Rate \ Result $ الموضوع *param مجموعة $ النتيجة *return مجموعة * / الوظيفة العامة afterGetAllRates ($ subject، $ result) { foreach ($ result as $ key => $ rate) { إذا (price-> getIsDisabled ()) { unset ($ result [$ key]) ؛ } } إرجاع نتيجة $؛ } }
يستخدم هذا المكون الإضافي لجلب جميع بيانات طرق الشحن المتاحة والتحقق من كل منها. إذا كانت بعض الطرق بها علامة "is_disabled" ، فإننا نستبعدها فقط من القائمة ، مما يمكننا من رؤية تلك الطرق التي تتوافق مع الشروط التي تم إنشاؤها في المدقق فقط. يتم استبعاد هذه الطرق من أي صفحة من موقع الويب ، سواء كانت كتلة شحن تقديرية في عربة التسوق ، أو صفحة الخروج.
الآن ، للتحقق من كيفية عمل المكونات الإضافية ، نحتاج إلى تسجيلها في الملف:
> MageWorx / ShippingRules / etc / di.xml
<؟ xml version = "1.0"؟> <config xmlns: xsi = "https://www.w3.org/2001/XMLSchema-instance" xsi: noNamespaceSchemaLocation = "urn: magento: framework: ObjectManager / etc / config.xsd"> <type name = "Magento \ Shipping \ Model \ Rate \ Result"> <اسم المكون الإضافي = "mageworx_shippingrules_update_rate_result" اكتب = "MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result \ Append" SortOrder = "10" معطل = "خطأ" /> <اسم المكون الإضافي = "mageworx_shippingrules_update_disabled_or_enabled_rates" اكتب = "MageWorx \ ShippingRules \ Model \ Plugin \ Shipping \ Rate \ Result \ GetAllRates" SortOrder = "11" معطل = "خطأ" /> </type> </config>
ملاحظة
لأسباب وصفية ، يتم تقسيم الملحقات إلى فئتين مختلفتين. في السيناريو العادي ، يمكنك استخدام فئة واحدة فقط لتعديل طريقتين مختلفتين للفئة Magento \ Shipping \ Model \ Rate \ Result.
لماذا يعمل بهذه الطريقة؟
Magento \ Shipping \ Model \ Rate \ النتيجة هي فئة Magento 2 الرئيسية المسؤولة عن عملية طرق الشحن. تُستخدم طريقة getAllRates الخاصة بها لجلب قوائم طرق الشحن.
وفي الوقت نفسه ، تتم إضافة طرق الشحن عادةً بمساعدة طريقة "الإلحاق". بعد التحقق من صحة الطرق أثناء الإلحاق ، وبعد استبعادها من المجموعة ، يمكننا الحصول على قائمة بالطرق الصالحة.
يمكن أيضًا تعديل التحقق من الصحة نفسه.
تحتوي إضافتنا على فئة خاصة كبيرة تخزن مجموعة من المرشحات المخصصة بشروط مختلفة (مثل store_id ، و customer_group_id ، والتاريخ من / إلى ، وأيام الأسبوع ، وما إلى ذلك ). يحتوي أيضًا على فئة منفصلة مع مجموعة من الإجراءات التي يجب تطبيقها على طريقة الشحن (على سبيل المثال ، تمكينها أو تعطيلها ، وإعادة كتابة تكلفتها وفقًا لشروط مختلفة ، وإضافة تكاليف أو خصومات إضافية ، وما إلى ذلك )
تبدو نتيجة المكون الإضافي الأول في التصحيح إلى حد ما مثل هذا (لمنتج بوزن وحدة واحدة):
هكذا تبدو في عربة التسوق (ما زالت ups_WXS متاحة ، حيث لم يتم تجاوز حد الوزن):
ومع ذلك ، إذا قمت بتغيير وزن المنتج إلى 101 ، تصبح طريقة الشحن هذه غير متاحة:
يصبح متاحًا مرة أخرى إذا قمت باستبعاده من القائمة:
عند الخروج:
ملاحظة
يمكنك الحصول على قائمة بجميع طرق شحن النظام المتاحة مباشرة في الكود بالطريقة التالية:
/ ** * عودة مجموعة من شركات النقل. * إذا تم تعيين $ isActiveOnlyFlag على true ، فسيعيد الناقلات النشطة فقط * *param bool $ isActiveOnlyFlag *return مجموعة * / الوظيفة العامة getAvailableMethods ($ isActiveOnlyFlag = false) { شركات النقل $ = $ this-> shippingConfig-> getAllCarriers () ؛ foreach (شركات الجوال $ كـ $ carrierCode => $ carrierModel) { إذا (! $ carrierModel-> isActive () && (bool) $ isActiveOnlyFlag === صحيح) { استمر؛ } $ carrierMethods = $ carrierModel-> getAllowedMethods () ؛ إذا (! $ carrierMethods) { استمر؛ } foreach ($ carrierMethods as $ methodCode => methodTitle $) { طرق $ [] = $ carrierCode. "_". طريقة $؛ } } العودة! فارغة (طرق $)؟ طرق $: []؛ }
حيث أن `$ this-> shippingConfig` هو مثيل للفئة` Magento \ Shipping \ Model \ Config` . باستخدام هذا الرمز ، يمكنك إنشاء نموذج المصدر لمحدد طرق الشحن في إعدادات الامتداد (وبالتالي ، لن تضطر إلى ترميزه في المكون الإضافي).
وأخيرا وليس آخرا.
إذا كنت لا ترغب في إنشاء ملحق خاص بك لتعطيل طرق الشحن ، فيمكنك استخدام حل Shipping Suite الخاص بنا لـ Magento 2 .
يتيح لك الامتداد استبعاد أي طريقة شحن عند الحاجة فقط ببضع نقرات بالماوس.
1. أنشئ قاعدة شحن جديدة بالشرط التالي:
2. حدد إخفاء إجراء طريقة الشحن من القائمة ، واختر الطرق التي يجب تعطيلها:
ملاحظة
إذا لم تعثر على سمة "الوزن" في قائمة الشروط ، فتحقق من تمكينها للاستخدام في القواعد الترويجية:
إذا كان لديك أي أسئلة أو أفكار حول كيفية تحسين الامتداد الخاص بنا ، فيرجى مشاركة رأيك في قسم التعليقات أدناه.