Setarea restricțiilor avansate de livrare în Magento 2
Publicat: 2017-05-17În acest articol, vom explica cum să ascundeți o metodă de expediere atunci când sunt aplicate anumite condiții.
În unele scenarii, proprietarii de magazine pot dori să restricționeze opțiunile de expediere deoarece:
- un produs are dimensiuni și greutate mari, prin urmare nu poate fi expediat în niciun mod standard,
- Condițiile de depozitare înghețate nu permit livrarea unui produs la timp
- transportul este restricționat din cauza locației clientului (țara, regiune, oraș )
- C art Total nu permite unui cumpărător să se califice pentru nicio ofertă de transport,
- etc.
Selecția implicită a opțiunilor de expediere Magento nu oferă prea multă flexibilitate. Este posibil să restricționați expedierea numai pentru anumite județe și regiuni sau atunci când Totalul coșului este mai mic decât suma stabilită.
Dacă credeți că acest lucru nu este suficient, citiți mai departe.
Vă voi spune cum să vă creați propriul plugin care vă va permite să restricționați opțiunile de livrare în funcție de modelul dvs. de afaceri, obiectivele și condițiile.
NOTĂ
Nu voi parcurge pașii specifici necesari pentru a crea o extensie pentru Magento 2. Puteți vedea cum să faceți asta aici sau aici.
Pentru a dezactiva dinamic orice metodă de expediere, avem nevoie de un nou set de clase în extensia noastră - acestea sunt 2 plugin -uri. Primul se va ocupa de validarea metodei de expediere, în timp ce al 2-lea le va filtra.
Pe scurt, fiecare metodă care nu trece validarea va fi marcată ca „ is_disabled ”, iar la pasul următor, toate metodele „ is_disabled ” vor fi filtrate și șterse din lista principală.
Sa mergem.
* Deoarece abordarea pe care o voi descrie se bazează pe principiile utilizate în extensia Shipping Suite , voi folosi numele furnizorului „Mageworx” și numele extensiei „ShippingRules”. NOTĂ! Pentru a evita erorile, trebuie să le înlocuiți cu propriile nume!
Mai întâi, să creăm un plugin (clasă) care va fi folosit pentru filtrare. Iată cum să:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append
spațiu de nume MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; clasa Append { /** * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ protejat $session; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param \Magento\Framework\App\State $state * @internal param Sesiune $session */ funcția publică __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\App\State $state ) { dacă ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $this->session = $backendQuoteSession; } altfel { $this->session = $checkoutSession; } } /** * Validați fiecare metodă de expediere înainte de a adăuga. * Aplicați acțiunea regulilor dacă validarea a avut succes. * Poate marca unele reguli ca fiind dezactivate. Regulile dezactivate vor fi eliminate în clasă * @vedeți MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * prin verificarea valorii acestui marcaj în obiectul ratei. * * NOTĂ: Dacă aveți unele probleme cu regulile și metodele de expediere, începeți depanarea de aici. * * @param \Magento\Shipping\Model\Rate\Result $subject * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result * @return matrice */ funcție publică înainte de Adăugare ($subiect, $rezultat) { if (!$rezultatul instanței \Magento\Quote\Model\Quote\Address\RateResult\Method) { returnează [$rezultat]; } $filtableMethods = [ 'flatrate_flatrate', „ups_XDM”, „ups_XPR”, „ups_WXS”, „metoda_purtătorului”, // ... adăugați aici codurile de metodă ]; $methodCode = $rezultat->getCarrier() . '_' . $rezultat->getMethod(); dacă (!în_array($methodCode, $filtableMethods)) { returnează [$rezultat]; } /** @var \Magento\Quote\Model\Quote $quote */ $quote = $this->session->getQuote(); $quoteItems = $quote->getAllItems(); $heavyWeightFlag = fals; foreach ($quoteItems ca $item) { dacă ($item->getWeight() > 100) { $heavyWeightFlag = adevărat; continua; } } dacă ($heavyWeightFlag == adevărat) { $rezultat->setIsDisabled(true); } returnează [$rezultat]; } }
Efectuăm 3 verificări în corpul pluginului nostru:
1.
!$rezultatul instanței de \Magento\Quote\Model\Quote\Address\RateResult\Method
– se asigură că la punctul de intrare obținem ceea ce avem nevoie: aceasta este o instanță a unei metode de expediere. În cazul în care nu este, îl returnăm așa cum este.
2.
!in_array($methodCode, $filtableMethods)
– în continuare, verificăm dacă metoda curentă este în lista de metode de filtrare. În caz că nu este, îl returnăm așa cum este.
3.
$heavyWeightFlag == adevărat
– este ultimul și principalul control. Dacă indicatorul este aplicat valorii reale, metoda curentă este dezactivată: $result->setIsDisabled(true);
Vom încerca să filtram cel puțin un produs adăugat în coș și care are o greutate mai mare de 100 de unități standard (lire sau kilograme).
Metodele disponibile pentru filtrare sunt „flatrate_flatrate”, „ups_XDM”, „ups_XPR”, „ups_WXS”, „carrier_method” . Ele sunt codificate și stocate în matricea $filtableMethods .
Operăm pe cod folosind întregul cod al metodei de expediere care, de regulă, constă din codul transportatorului ($result->getCarrier()) și codul metodei în sine ($result->getMethod()) conectat cu „ _” .
Produsele necesare pentru verificare sunt preluate direct din oferta curenta a clientului.
NOTĂ
O mică bucată de cod din constructorul clasei de matrice vă va permite să definiți citatul atât pe front-end, cât și în backend (cu condiția ca o comandă să fi fost creată în panoul de administrare).
Folosind \Magento\Framework\App\State putem verifica în ce zonă ne aflăm în acest moment și selectam oferta necesară:
1. \Magento\Backend\Model\Session\Quote for Admin
2. \Magento\Checkout\Model\Session pentru front-end
Asta e!
Acum putem valida metodele de expediere și putem trece la următoarea etapă – crearea unui plugin pentru dezactivarea metodelor de expediere nevalide (conform condițiilor noastre).
Iată cum să:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * Copyright 2016 MageWorx. Toate drepturile rezervate. * Consultați LICENSE.txt pentru detalii despre licență. */ spațiu de nume MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; clasa GetAllRates { /** * Dezactivați tarifele de expediere marcate. * * NOTĂ: Dacă nu puteți vedea unele dintre tarifele de expediere, începeți depanarea de aici. La început, bifați „is_disabled” * param în obiectul tarifului de expediere. * * @param \Magento\Shipping\Model\Rate\Result $subject * @param array $rezultat * @return matrice */ funcție publică afterGetAllRates($subiect, $rezultat) { foreach ($rezultat ca $key => $rata) { dacă ($rate->getIsDisabled()) { unset($rezultat[$key]); } } returnează $rezultat; } }
Acest plugin este folosit pentru a prelua toate datele disponibile despre metodele de expediere și pentru a verifica fiecare dintre ele. Dacă unele dintre metode au marcajul „is_disabled” , doar o excludem din listă, ceea ce ne permite să vedem doar acele metode care corespund condițiilor create în validator. Aceste metode sunt excluse pe orice pagină a unui site web, fie că este vorba despre un bloc estimativ de livrare în coșul de cumpărături sau pe pagina de finalizare a comenzii.
Acum, pentru a verifica cum funcționează pluginurile, trebuie să le înregistrăm în fișier:
> 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" sortOrder="10" disabled="false"/> <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates" sortOrder="11" disabled="false"/> </tip> </config>
NOTĂ
Din motive descriptive, pluginurile sunt împărțite în 2 clase diferite. Într-un scenariu obișnuit, puteți utiliza doar 1 clasă pentru a modifica 2 metode diferite ale clasei Magento\Shipping\Model\Rate\Result.
De ce funcționează așa?
Magento\Shipping\Model\Rate\Result este clasa principală Magento 2 care este responsabilă pentru procesarea metodelor de expediere. Metoda sa getAllRates este folosită pentru a prelua liste de metode de expediere.
Între timp, adăugarea metodelor de expediere se face de obicei cu ajutorul metodei „adăugați”. Având metode validate în timpul anexării și după ce le-am exclus din colecție, putem obține o listă de metode valide.
Validarea în sine poate fi, de asemenea, modificată.
Extensia noastră are o clasă specială mare care stochează o colecție de filtre personalizate cu diferite condiții (cum ar fi store_id, customer_group_id, data from/to, zile ale săptămânii etc. ). are, de asemenea, o clasă separată cu o colecție de acțiuni care ar trebui aplicate unei metode de expediere (de exemplu , activați-o sau dezactivați-o, rescrieți-i costul în funcție de diferite condiții, adăugați costuri suplimentare sau reduceri etc. )
Rezultatul primului plugin în depanare arată oarecum așa (pentru un produs cu greutatea de 1 unitate):
Așa arată în coșul de cumpărături (ups_WXS este încă disponibil, deoarece limita de greutate nu este depășită):
Cu toate acestea, dacă modificați greutatea produsului la 101, această metodă de livrare devine indisponibilă:
Devine disponibil din nou dacă l-ați exclus din listă:
La casă:
NOTĂ
Puteți obține lista cu toate metodele de livrare disponibile în sistem chiar în cod, în felul următor:
/** * Matrice de returnare a transportatorilor. * Dacă $isActiveOnlyFlag este setat la true, va returna numai transportatorii activi * * @param bool $isActiveOnlyFlag * @return matrice */ funcția publică getAvailableMethods($isActiveOnlyFlag = false) { $carriers = $this->shippingConfig->getAllCarriers(); foreach ($carriers ca $carrierCode => $carrierModel) { dacă (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === adevărat) { continua; } $carrierMethods = $carrierModel->getAllowedMethods(); dacă (!$carrierMethods) { continua; } foreach ($carrierMethods ca $methodCode => $methodTitle) { $methods[] = $carrierCode . '_' . $methodCode; } } return !empty($metode) ? $metode : []; }
Unde `$this->shippingConfig` este o instanță a clasei `Magento\Shipping\Model\Config` . Folosind acest cod, puteți crea modelul sursă pentru selectorul de metode de expediere în setările extensiei (astfel, nu va trebui să-l codificați în plugin).
Și nu în ultimul rând.
Dacă nu doriți să vă creați propria extensie pentru dezactivarea metodelor de expediere, puteți utiliza soluția noastră Shipping Suite pentru Magento 2 .
Extensia vă permite să excludeți orice metodă de expediere ori de câte ori este nevoie, doar în câteva clicuri de mouse.
1. Creați o nouă regulă de expediere cu următoarea condiție:
2. Selectați acțiunea Ascundere metoda de expediere din listă și alegeți ce metode trebuie dezactivate:
NOTĂ
Dacă nu găsiți atributul „greutate” în lista de condiții, verificați dacă este activat pentru utilizare în regulile promoționale:
Dacă aveți întrebări sau idei despre cum să îmbunătățiți în continuare extensia noastră , vă rugăm să vă împărtășiți opinia în secțiunea de comentarii de mai jos.