Impostazione delle restrizioni di spedizione avanzate in Magento 2
Pubblicato: 2017-05-17In questo articolo spiegheremo come nascondere un metodo di spedizione quando vengono applicate determinate condizioni.
In alcuni scenari i proprietari dei negozi potrebbero voler limitare le opzioni di spedizione perché:
- un prodotto ha grandi dimensioni e peso, quindi non può essere spedito in nessun modo standard,
- le condizioni di conservazione della conservazione congelata non consentono di consegnare un prodotto in tempo
- la spedizione è limitata a causa della posizione del cliente (paese, regione, città )
- il C art Total non consente a un acquirente di qualificarsi per eventuali offerte di spedizione,
- eccetera.
La selezione predefinita delle opzioni di spedizione Magento non offre molta flessibilità. È possibile limitare la spedizione solo per determinate contee e regioni o quando il totale del carrello è inferiore all'importo impostato.
Se pensi che questo non sia abbastanza, continua a leggere.
Ti dirò come creare il tuo plug-in che ti consentirà di limitare le opzioni di spedizione in base al tuo modello di business, obiettivi e condizioni.
NOTA
Non seguirò i passaggi specifici necessari per creare un'estensione per Magento 2. Puoi vedere come farlo qui o qui.
Per disabilitare dinamicamente un determinato metodo di spedizione, abbiamo bisogno di un nuovo set di classi nella nostra estensione: si tratta di 2 plugin . Il 1° si occuperà della convalida del metodo di spedizione, mentre il 2° li filtrerà.
In poche parole, ogni metodo che non supera la convalida verrà contrassegnato come " is_disabled " e al passaggio successivo tutti i metodi " is_disabled " verranno filtrati ed eliminati dall'elenco principale.
Diamoci dentro.
* Poiché l'approccio che descriverò si basa sui principi utilizzati nell'estensione Shipping Suite , utilizzerò il nome del venditore "Mageworx" e il nome dell'estensione "ShippingRules". NOTA! Per evitare errori, è necessario sostituirli con i propri nomi!
Innanzitutto, creiamo un plug-in (classe) che verrà utilizzato per il filtraggio. Ecco come:
> MageWorx\ShippingRules\Model\Plugin\Spedizione\Tariffa\Risultato\Aggiungi
spazio dei nomi MageWorx\ShippingRules\Model\Plugin\Shipping\Tariffa\Risultato; classe Aggiungi { /** * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ sessione $ protetta; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param \Magento\Framework\App\Stato $stato * @internal param Session $session */ funzione pubblica __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\App\Stato $stato ) { if ($stato->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $questo->sessione = $backendQuoteSession; } altro { $questo->sessione = $checkoutSession; } } /** * Convalida ogni metodo di spedizione prima di aggiungere. * Applicare l'azione delle regole se la convalida ha avuto esito positivo. * Può contrassegnare alcune regole come disabilitate. Le regole disabilitate verranno rimosse nella classe * @vedi MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * verificando il valore di questo contrassegno nell'oggetto tasso. * * NOTA: in caso di problemi con le regole e i metodi di spedizione, avvia il debug da qui. * * @param \Magento\Spedizione\Modello\Tariffa\Risultato $oggetto * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $risultato * @return array */ funzione pubblica beforeAppend($oggetto, $risultato) { if (!$result instanceof\Magento\Quote\Model\Quote\Address\RateResult\Method) { restituisce [$risultato]; } $filtableMethods = [ 'flatrate_flatrate', 'ups_XDM', 'ups_XPR', 'ups_WXS', 'metodo_portante', // ... aggiungi qui i codici del tuo metodo ]; $codicemetodo = $risultato->getCarrier() . '_'. $risultato->getMethod(); if (!in_array($codice metodo, $ metodi filtrabili)) { restituisce [$risultato]; } /** @var \Magento\Quote\Model\Quote $quote */ $quote = $questo->sessione->getQuote(); $quoteItems = $quote->getAllItems(); $pesopesanteFlag = falso; foreach ($quoteItems as $item) { se ($elemento->getWeight() > 100) { $bandierapesopesante = vero; Continua; } } se ($bandierapesopesante == vero) { $risultato->setIsDisabled(true); } restituisce [$risultato]; } }
Eseguiamo 3 controlli nel corpo del nostro plugin:
1.
!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method
– assicura che al punto di ingresso otteniamo ciò di cui abbiamo bisogno: questa è un'istanza di un metodo di spedizione. In caso contrario, lo restituiremo così com'è.
2.
!in_array($MethodCode, $filtableMethods)
– Successivamente, controlliamo se il metodo corrente è nell'elenco dei metodi per il filtraggio. In caso contrario, lo restituiamo così com'è.
3.
$bandierapesopesante == vero
– è l'ultimo e il principale controllo. Se il flag viene applicato al valore reale, il metodo corrente viene disabilitato: $result->setIsDisabled(true);
Cercheremo di filtrare almeno un prodotto aggiunto al carrello e con peso superiore a 100 unità standard (libbre o chili).
I metodi disponibili per il filtraggio sono 'flatrate_flatrate','ups_XDM','ups_XPR','ups_WXS','carrier_method' . Sono hardcoded e archiviati nell'array $filtableMethods .
Operiamo sul codice utilizzando l'intero codice del metodo di spedizione che, di regola, è composto dal codice del vettore ($result->getCarrier()) e dal codice del metodo stesso ($result->getMethod()) connesso con “ _” .
I prodotti necessari per il controllo sono presi direttamente dal preventivo del cliente corrente.
NOTA
Un piccolo pezzo di codice nel costruttore della classe array ti permetterà di definire la citazione sia sul frontend che sul backend (a condizione che sia stato creato un ordine nel pannello di amministrazione).
Utilizzando \Magento\Framework\App\State possiamo verificare in quale area ci troviamo al momento e selezionare la quotazione necessaria:
1. \Magento\Backend\Model\Session\Quote for Admin
2. \Magento\Checkout\Model\Session per il Frontend
Questo è tutto!
Ora possiamo convalidare i metodi di spedizione e procedere alla fase successiva, creando un plug-in per disabilitare i metodi di spedizione non validi (secondo le nostre condizioni).
Ecco come:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * Copyright 2016 MageWorx. Tutti i diritti riservati. * Vedere LICENSE.txt per i dettagli sulla licenza. */ spazio dei nomi MageWorx\ShippingRules\Model\Plugin\Shipping\Tariffa\Risultato; classe GetAllRates { /** * Disattiva le tariffe di spedizione contrassegnate. * * NOTA: se non riesci a visualizzare alcune delle tariffe di spedizione, avvia il debug da qui. All'inizio, seleziona 'is_disabled' *param nell'oggetto tariffa di spedizione. * * @param \Magento\Spedizione\Modello\Tariffa\Risultato $oggetto * @param array $risultato * @return array */ funzione pubblica afterGetAllRates($oggetto, $risultato) { foreach ($risultato come $chiave => $tasso) { if ($rate->getIsDisabled()) { unset($risultato[$chiave]); } } restituisce $risultato; } }
Questo plug-in viene utilizzato per recuperare tutti i dati sui metodi di spedizione disponibili e controllarli. Se alcuni dei metodi hanno il contrassegno "is_disabled" , lo escludiamo semplicemente dall'elenco, il che ci consente di vedere solo quei metodi che corrispondono alle condizioni create nel validatore. Questi metodi vengono esclusi su qualsiasi pagina di un sito Web, che si tratti di un blocco di spedizione stimato nel carrello o della pagina di pagamento.
Ora, per verificare come funzionano i plugin, dobbiamo registrarli nel file:
> MageWorx/ShippingRules/etc/di.xml
<?versione xml="1.0"?> <config xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Spedizione\Modello\Tariffa\Risultato"> <plugin name="mageworx_shippingrules_update_rate_result" type="MageWorx\ShippingRegole\Modello\Plugin\Spedizione\Tariffa\Risultato\Aggiungi" 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"/> </tipo> </config>
NOTA
Per ragioni descrittive, i plugin sono divisi in 2 classi differenti. In uno scenario ordinario, puoi utilizzare solo 1 classe per modificare 2 diversi metodi della classe Magento\Spedizione\Modello\Tariffa\Risultato.
Perché funziona in questo modo?
Magento\Shipping\Model\Rate\Result è la classe Magento 2 principale responsabile della processione dei metodi di spedizione. Il suo metodo getAllRates viene utilizzato per recuperare gli elenchi dei metodi di spedizione.
Nel frattempo, l'aggiunta di metodi di spedizione viene solitamente eseguita con l'aiuto del metodo "aggiungi". Dopo aver convalidato i metodi durante l'aggiunta e averli esclusi dalla raccolta, possiamo ottenere un elenco di metodi validi.
La convalida stessa può anche essere modificata.
La nostra estensione ha una grande classe speciale che memorizza una raccolta di filtri personalizzati con condizioni diverse (come store_id, customer_group_id, date from/to, giorni della settimana, ecc .). ha anche una classe separata con una raccolta di azioni che dovrebbero essere applicate a un metodo di spedizione (es. abilitarlo o disabilitarlo, riscriverne il costo in base a condizioni diverse, aggiungere costi aggiuntivi o sconti, ecc. )
Il risultato del 1° plugin in debug è più o meno questo (per un prodotto con il peso di 1 unità):
Ecco come appare nel carrello (ups_WXS è ancora disponibile, poiché il limite di peso non viene superato):
Tuttavia, se modifichi il peso del prodotto su 101, questo metodo di spedizione non è disponibile:
Diventa nuovamente disponibile se lo hai escluso dall'elenco:
Al checkout:
NOTA
Puoi ottenere l'elenco di tutti i metodi di spedizione del sistema disponibili direttamente nel codice nel modo seguente:
/** * Ritorno matrice di vettori. * Se $isActiveOnlyFlag è impostato su true, restituirà solo i vettori attivi * * @param bool $isActiveOnlyFlag * @return array */ funzione pubblica getAvailableMethods($isActiveOnlyFlag = false) { $carriers = $this->shippingConfig->getAllCarriers(); foreach ($carrier as $carrierCode => $carrierModel) { if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) { Continua; } $carrierMethods = $carrierModel->getAllowedMethods(); se (!$carrierMethods) { Continua; } foreach ($carrierMethods as $methodCode => $methodTitle) { $metodi[] = $codice vettore . '_'. $codice metodo; } } return !vuoto($metodi) ? $ metodi : []; }
Dove `$this->shippingConfig` è un'istanza della classe `Magento\Shipping\Model\Config` . Utilizzando questo codice, puoi creare il modello sorgente per il selettore dei metodi di spedizione nelle impostazioni dell'estensione (quindi non dovrai codificarlo nel plug-in).
Ultimo ma non meno importante.
Se non desideri creare la tua estensione per disabilitare i metodi di spedizione, puoi utilizzare la nostra soluzione Shipping Suite per Magento 2 .
L'estensione ti consente di escludere qualsiasi metodo di spedizione quando necessario con un paio di clic del mouse.
1. Crea una nuova regola di spedizione con la seguente condizione:
2. Selezionare l'azione Nascondi metodo di spedizione nell'elenco e scegliere quali metodi devono essere disabilitati:
NOTA
Se non trovi l'attributo 'peso' nell'elenco delle condizioni, controlla se è abilitato all'uso nelle regole promozionali:
In caso di domande o idee su come migliorare ulteriormente la nostra estensione , condividi la tua opinione nella sezione commenti qui sotto.