Magento 2'de Gelişmiş Gönderi Kısıtlamalarını Ayarlama

Yayınlanan: 2017-05-17

Bu makalede, belirli koşullar uygulandığında bir gönderim yönteminin nasıl gizleneceğini açıklayacağız.

Bazı senaryolarda mağaza sahipleri, aşağıdaki nedenlerle nakliye seçeneklerini kısıtlamak isteyebilir:

  • bir ürün büyük boyutlara ve ağırlığa sahiptir, bu nedenle herhangi bir standart yolla sevk edilemez,
  • donmuş saklama koşulları , bir ürünün zamanında teslim edilmesine izin vermiyor
  • nakliye, müşterinin konumu (ülke, bölge, şehir ) nedeniyle kısıtlanmıştır
  • Toplam Alışveriş Sepeti, alışveriş yapan kişinin herhangi bir kargo teklifine hak kazanmasına izin vermez,
  • vb.

Magento gönderim seçeneklerinin varsayılan seçimi fazla esneklik sağlamaz. Yalnızca belirli ilçeler ve bölgeler için veya Sepet Toplamı belirlenen miktardan az olduğunda gönderimi kısıtlamak mümkündür.

Bunun yeterli olmadığını düşünüyorsanız, okumaya devam edin.

İş modelinize, hedeflerinize ve koşullarınıza göre nakliye seçeneklerini kısıtlamanıza izin verecek kendi eklentinizi nasıl oluşturacağınızı anlatacağım.

NOT

Magento 2 için bir uzantı oluşturmak için gerekli olan belirli adımlardan geçmeyeceğim. Bunu nasıl yapacağınızı buradan veya buradan görebilirsiniz.

Herhangi bir gönderim yöntemini dinamik olarak devre dışı bırakmak için uzantımızda yeni bir sınıf kümesine ihtiyacımız var - bunlar 2 eklenti . 1. kişi gönderim yöntemi doğrulamasından sorumlu olacak, 2. kişi ise bunları filtreleyecek.

Özetle, doğrulamadan geçmeyen her yöntem “ is_disabled ” olarak işaretlenecek ve bir sonraki adımda tüm “ is_disabled ” yöntemleri filtrelenecek ve ana listeden silinecektir.

hadi yuvarlanalım.

* Anlatacağım yaklaşım Shipping Suite uzantısında kullanılan ilkelere dayandığından, satıcı 'Mageworx' adını ve 'ShippingRules' uzantısının adını kullanacağım. NOT! Hatalardan kaçınmak için, bunları kendi adlarınızla değiştirmeniz gerekir!

Öncelikle filtreleme için kullanılacak bir eklenti (sınıf) oluşturalım. İşte nasıl yapılır:

 > MageWorx\ShippingRules\Model\Plugin\Nakliye\Oran\Sonuç\Ekle 
 ad alanı MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result;

sınıf Ekle
{
    /**
     * @var \Magento\Ödeme\Model\Oturum|\Magento\Arka Uç\Model\Oturum\Alıntı
     */
    korumalı $oturum;

    /**
     * @param \Magento\Checkout\Model\Session $checkoutSession
     * @param \Magento\Arka Uç\Model\Oturum\Alıntı $backendQuoteSession
     * @param \Magento\Framework\Uygulama\Durum $durum
     * @dahili parametre Oturum $oturum
     */
    genel işlev __construct(
        \Magento\Checkout\Model\Session $checkoutSession,
        \Magento\Arka Uç\Model\Oturum\Alıntı $backendAlıntıOturum,
        \Magento\Framework\Uygulama\Durum $durumu
    ) {
        if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) {
            $this->session = $backendQuoteSession;
        } başka {
            $bu->oturum = $checkoutSession;
        }
    }

    /**
     * Eklemeden önce her bir nakliye yöntemini doğrulayın.
     * Doğrulama başarılı olduysa kurallar eylemini uygulayın.
     * Bazı kuralları devre dışı olarak işaretleyebilir. Engelli kuralları sınıfta kaldırılacak
     * @bakın MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
     * oran nesnesindeki bu işaretin değerini kontrol ederek.
     *
     * NOT: Kurallar ve gönderim yöntemleri ile ilgili bazı sorunlarınız varsa, buradan hata ayıklamaya başlayın.
     *
     * @param \Magento\Shipping\Model\Rate\Sonuç $konu
     * @param \Magento\Quote\Model\Quote\Adres\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $sonucu
     * @dönüş dizisi
     */
    public function BeforeAppend($konu, $sonuç)
    {
        if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) {
            [$sonuç] döndür;
        }

        $filtableMethods = [
            'flatrate_flatrate',
            'ups_XDM',
            'ups_XPR',
            'ups_WXS',
            'taşıyıcı_yöntemi',
            // ... metod kodlarınızı buraya ekleyin
        ];
        $methodCode = $sonuç->getCarrier() . '_' . $sonuç->getMethod();
        if (!in_array($methodCode, $filtableMethods)) {
            [$sonuç] döndür;
        }

        /** @var \Magento\Quote\Model\Quote $quote */
        $quote = $this->session->getQuote();
        $quoteItems = $quote->getAllItems();
        $heavyWeightFlag = yanlış;
        foreach ($quoteItems as $item) {
            if ($item->getWeight() > 100) {
                $heavyWeightFlag = doğru;
                devam et;
            }
        }

        if ($heavyWeightFlag == doğru) {
            $result->setIsDisabled(true);
        }

        [$sonuç] döndür;
    }
}

Eklentimizin gövdesinde 3 kontrol çalıştırıyoruz:

1.

!$sonuç örneği\Magento\Quote\Model\Quote\Address\RateResult\Method

– giriş noktasında ihtiyacımız olanı almamızı sağlar: bu bir nakliye yöntemi örneğidir. Değilse, olduğu gibi iade ederiz.

2.

 !in_array($methodCode, $filtableMethods)

– sonra, geçerli yöntemin filtreleme yöntemleri listesinde olup olmadığını kontrol ederiz. Değilse, olduğu gibi iade ediyoruz.

3.

 $heavyWeightFlag == doğru

– son ve ana kontroldür. Bayrak gerçek değere uygulanırsa, geçerli yöntem devre dışı bırakılır: $result->setIsDisabled(true);

Sepete eklenen ve ağırlığı 100 standart birimin (pound veya kilo) üzerinde olan en az bir ürünü filtrelemeye çalışacağız.
Filtreleme için kullanılabilen yöntemler şunlardır: 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' . Sabit kodlanmışlardır ve $filtableMethods dizisinde depolanırlar.

Kural olarak, taşıyıcının kodundan ($result->getCarrier()) ve yöntemin kendisinin kodundan ( $ result->getMethod ( )) oluşan tüm nakliye yöntemi kodunu kullanarak kod üzerinde çalışıyoruz. _” .

Çek için gerekli ürünler doğrudan mevcut müşterinin teklifinden alınır.
NOT

Dizi sınıfı oluşturucusundaki küçük bir kod parçası, teklifi hem ön uçta hem de arka uçta tanımlamanıza izin verecektir (Yönetici panelinde bir siparişin oluşturulması şartıyla).

\Magento\Framework\App\State kullanarak şu anda hangi alanda olduğumuzu kontrol edebilir ve gerekli teklifi seçebiliriz:
1. \Magento\Arka Uç\Model\Oturum\Yönetici için Teklif
2. Ön Uç için \Magento\Checkout\Model\Session

Bu kadar!

Artık gönderim yöntemlerini doğrulayabiliriz ve bir sonraki aşamaya geçebiliriz - geçersiz (koşullarımıza göre) gönderim yöntemlerini devre dışı bırakmak için bir eklenti oluşturmak.

Bu nasıl yapılır:

 > MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates 
 /**
 * Telif hakkı 2016 MageWorx. Tüm hakları Saklıdır.
 * Lisans ayrıntıları için LICENSE.txt'e bakın.
 */

ad alanı MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result;

sınıf GetAllRates
{

    /**
     * İşaretli nakliye ücretlerini devre dışı bırakın.
     *
     * NOT: Kargo ücretlerinden bazılarını göremiyorsanız buradan hata ayıklamaya başlayın. İlk başta, 'is_disabled' seçeneğini işaretleyin
     * nakliye ücreti nesnesindeki param.
     *
     * @param \Magento\Shipping\Model\Rate\Sonuç $konu
     * @param dizisi $sonucu
     * @dönüş dizisi
     */
    genel işlev afterGetAllRates($konu, $sonuç)
    {
        foreach ($sonuç olarak $anahtar => $oran) {
            if ($rate->getIsDisabled()) {
                unset($sonuç[$anahtar]);
            }
        }

        $sonucu döndür;
    }
}

Bu eklenti, mevcut tüm nakliye yöntemleri verilerini almak ve her birini kontrol etmek için kullanılır. Yöntemlerden bazıları "is_disabled" işaretine sahipse, yalnızca doğrulayıcıda oluşturulan koşullara karşılık gelen yöntemleri görmemizi sağlayan listeden hariç tutarız. Bu yöntemler, bir web sitesinin herhangi bir sayfasında, alışveriş sepetindeki tahmini bir gönderim bloğu veya ödeme sayfası olsun, hariç tutulur.

Şimdi, eklentilerin nasıl çalıştığını kontrol etmek için onları dosyaya kaydetmemiz gerekiyor:

> 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">
        <plugin name="mageworx_shippingrules_update_rate_result"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append"
                sıralamaSipariş="10"
                devre dışı = "yanlış"/>
        <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates"
                type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates"
                sıralama = "11"
                devre dışı = "yanlış"/>
    </type>
</config>

NOT

Açıklayıcı nedenlerle, eklentiler 2 farklı sınıfa ayrılmıştır. Sıradan bir senaryoda, Magento\Shipping\Model\Rate\Result sınıfının 2 farklı yöntemini değiştirmek için yalnızca 1 sınıfı kullanabilirsiniz.

Neden bu şekilde çalışıyor?

Magento\Shipping\Model\Rate\Result , nakliye yöntemleri alayından sorumlu ana Magento 2 sınıfıdır. GetAllRates yöntemi, gönderim yöntemi listelerini getirmek için kullanılır.

Bu arada, nakliye yöntemlerinin eklenmesi genellikle 'ekleme' yönteminin yardımıyla yapılır. Yöntemleri eklerken valide ettikten ve koleksiyondan çıkardıktan sonra, geçerli yöntemlerin bir listesini alabiliriz.

Doğrulamanın kendisi de değiştirilebilir.

Uzantımız, farklı koşullara sahip ( store_id, customer_group_id, date from/to, haftanın günleri vb. ) özel filtreler koleksiyonunu depolayan büyük bir özel sınıfa sahiptir. ayrıca bir nakliye yöntemine uygulanması gereken eylemlerin bir koleksiyonunu içeren ayrı bir sınıfı vardır (örneğin , etkinleştirin veya devre dışı bırakın, maliyetini farklı koşullara göre yeniden yazın, ekstra maliyetler veya indirimler ekleyin, vb. )

Hata ayıklamadaki 1. eklentinin sonucu biraz şöyle görünür (1 birim ağırlığa sahip bir ürün için):
1

Alışveriş sepetinde bu şekilde görünüyor (ağırlık sınırı aşılmadığı için ups_WXS hala kullanılabilir):

2

Ancak, ürün ağırlığını 101 olarak değiştirirseniz bu gönderim yöntemi kullanılamaz hale gelir:

3

Listeden çıkardıysanız tekrar kullanılabilir hale gelir:
4

5

Kasada:

f3d3cac03678318af2d569d757fc7e79

NOT

Mevcut tüm sistem sevkıyat yöntemlerinin listesini doğrudan kodda aşağıdaki şekilde alabilirsiniz:

 /**
 * Taşıyıcı dizisini döndür.
 * $isActiveOnlyFlag true olarak ayarlanırsa, yalnızca aktif taşıyıcıları döndürür
 *
 * @param bool $isActiveOnlyFlag
 * @dönüş dizisi
 */
genel işlev getAvailableMethods($isActiveOnlyFlag = false)
{
    $carriers = $this->shippingConfig->getAllCarriers();
    foreach ($carriers as $carrierCode => $carrierModel) {
        if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) {
            devam et;
        }
        $carrierMethods = $carrierModel->getAllowedMethods();
        if (!$carrierMethods) {
            devam et;
        }
        foreach ($carrierMethods as $methodCode => $methodTitle) {
            $yöntemler[] = $taşıyıcıKodu . '_' . $yöntemKodu;
        }
    }

    dönüş !boş($yöntemler) ? $yöntemler: [];
}

Burada "$this->shippingConfig ", "Magento\Shipping\Model\Config" sınıfının bir örneğidir. Bu kodu kullanarak, uzantı ayarlarında gönderim yöntemleri seçicisi için kaynak modeli oluşturabilirsiniz (böylece eklentide sabit kodlamanız gerekmez).

Ve son ama en az değil.

Gönderim yöntemlerini devre dışı bırakmak için kendi uzantınızı oluşturmak istemiyorsanız, Magento 2 için Shipping Suite çözümümüzü kullanabilirsiniz.

Uzantı, yalnızca birkaç fare tıklamasıyla gerektiğinde herhangi bir nakliye yöntemini hariç tutmanıza olanak tanır.
1. Aşağıdaki koşulla yeni bir gönderim kuralı oluşturun:

8

2. Listeden Gönderi Yöntemini Gizle eylemini seçin ve hangi yöntemlerin devre dışı bırakılacağını seçin:

9

NOT

Koşullar listesinde 'ağırlık' özelliğini bulamazsanız, promosyon kurallarında kullanım için etkinleştirilip etkinleştirilmediğini kontrol edin:

10

Uzantımızı nasıl daha da geliştirebileceğimize dair herhangi bir sorunuz veya fikriniz varsa, lütfen aşağıdaki yorumlar bölümünde görüşlerinizi paylaşın.