Festlegen erweiterter Versandbeschränkungen in Magento 2
Veröffentlicht: 2017-05-17In diesem Artikel erklären wir, wie Sie eine Versandart ausblenden, wenn bestimmte Bedingungen zutreffen.
In einigen Szenarien möchten Ladenbesitzer möglicherweise die Versandoptionen einschränken, weil:
- Ein Produkt hat große Abmessungen und ein großes Gewicht, daher kann es nicht auf herkömmliche Weise versendet werden.
- Tiefkühllagerbedingungen erlauben es nicht, ein Produkt rechtzeitig zu liefern
- Der Versand ist aufgrund des Standorts des Kunden (Land, Region, Stadt ) eingeschränkt.
- Der Warenkorb -Gesamtbetrag erlaubt es einem Käufer nicht, sich für Versandangebote zu qualifizieren,
- usw.
Die Standardauswahl der Magento-Versandoptionen bietet nicht viel Flexibilität. Es ist nur möglich, den Versand für bestimmte Länder und Regionen einzuschränken oder wenn die Warenkorbsumme unter dem festgelegten Betrag liegt.
Wenn Sie der Meinung sind, dass dies nicht ausreicht, lesen Sie weiter.
Ich erkläre Ihnen, wie Sie Ihr eigenes Plugin erstellen, mit dem Sie die Versandoptionen entsprechend Ihrem Geschäftsmodell, Ihren Zielen und Bedingungen einschränken können.
HINWEIS
Ich werde nicht auf die spezifischen Schritte eingehen, die zum Erstellen einer Erweiterung für Magento 2 erforderlich sind. Wie das geht, erfahren Sie hier oder hier.
Um eine bestimmte Versandmethode dynamisch zu deaktivieren, benötigen wir einen neuen Satz von Klassen in unserer Erweiterung – dies sind 2 Plugins . Der erste ist für die Validierung der Versandart zuständig, während der zweite sie filtert.
Kurz gesagt, jede Methode, die die Validierung nicht besteht, wird als „ is_disabled “ markiert, und im nächsten Schritt werden alle „ is_disabled “-Methoden gefiltert und aus der Hauptliste gelöscht.
Auf geht's.
* Da der Ansatz, den ich beschreiben werde, auf den Prinzipien der Shipping Suite- Erweiterung basiert, verwende ich den Namen des Anbieters „Mageworx“ und den Namen der Erweiterung „ShippingRules“. HINWEIS! Um Fehler zu vermeiden, müssen Sie diese durch Ihre eigenen Namen ersetzen!
Lassen Sie uns zunächst ein Plugin (Klasse) erstellen, das zum Filtern verwendet wird. So geht's:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append
Namespace MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; Klasse anhängen { /** * @var \Magento\Checkout\Model\Session|\Magento\Backend\Model\Session\Quote */ geschützte $session; /** * @param \Magento\Checkout\Model\Session $checkoutSession * @param \Magento\Backend\Model\Session\Quote $backendQuoteSession * @param\Magento\Framework\App\State $state * @interner Parameter Sitzung $session */ öffentliche Funktion __construct( \Magento\Checkout\Model\Session $checkoutSession, \Magento\Backend\Model\Session\Quote $backendQuoteSession, \Magento\Framework\App\State $state ) { if ($state->getAreaCode() == \Magento\Framework\App\Area::AREA_ADMINHTML) { $this->session = $backendQuoteSession; } anders { $this->session = $checkoutSession; } } /** * Bestätigen Sie jede Versandart vor dem Anhängen. * Wenden Sie die Regelaktion an, wenn die Validierung erfolgreich war. * Kann einige Regeln als deaktiviert markieren. Die deaktivierten Regeln werden in der Klasse entfernt * @see MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates * indem Sie den Wert dieser Markierung im Tarifobjekt überprüfen. * * HINWEIS: Wenn Sie Probleme mit den Regeln und den Versandmethoden haben, beginnen Sie von hier aus mit dem Debuggen. * * @param \Magento\Shipping\Model\Rate\Ergebnis $subject * @param \Magento\Quote\Model\Quote\Address\RateResult\AbstractResult|\Magento\Shipping\Model\Rate\Result $result * @return-Array */ öffentliche Funktion beforeAppend($subject, $result) { if (!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method) { Rückgabe [$Ergebnis]; } $filtableMethods = [ 'flatrate_flatrate', 'ups_XDM', 'ups_XPR', 'ups_WXS', 'carrier_method', // ... fügen Sie hier Ihre Methodencodes hinzu ]; $methodCode = $result->getCarrier() . '_' . $result->getMethod(); if (!in_array($methodCode, $filtableMethods)) { Rückgabe [$Ergebnis]; } /** @var \Magento\Zitat\Modell\Zitat $Zitat */ $quote = $this->session->getQuote(); $quoteItems = $quote->getAllItems(); $heavyWeightFlag = falsch; foreach ($quoteItems als $item) { if ($item->getWeight() > 100) { $heavyWeightFlag = wahr; fortsetzen; } } if ($heavyWeightFlag == wahr) { $result->setIsDisabled(true); } Rückgabe [$Ergebnis]; } }
Wir führen 3 Überprüfungen im Hauptteil unseres Plugins durch:
1.
!$result instanceof \Magento\Quote\Model\Quote\Address\RateResult\Method
– stellt sicher, dass wir am Eingangspunkt das bekommen, was wir brauchen: das ist eine Instanz einer Versandart. Falls dies nicht der Fall ist, geben wir es einfach so zurück, wie es ist.
2.
!in_array($methodCode, $filtableMethods)
– Als nächstes prüfen wir, ob die aktuelle Methode in der Liste der Methoden zum Filtern enthalten ist. Falls dies nicht der Fall ist, geben wir es so zurück, wie es ist.
3.
$heavyWeightFlag == wahr
– ist die letzte und wichtigste Prüfung. Wenn das Flag auf den realen Wert angewendet wird, wird die aktuelle Methode deaktiviert: $result->setIsDisabled(true);
Wir werden versuchen, mindestens ein Produkt herauszufiltern, das dem Warenkorb hinzugefügt wurde und mehr als 100 Standardeinheiten (Pfund oder Kilo) wiegt.
Die zum Filtern verfügbaren Methoden sind 'flatrate_flatrate', 'ups_XDM', 'ups_XPR', 'ups_WXS', 'carrier_method' . Sie sind fest codiert und im Array $filtableMethods gespeichert.
Wir arbeiten mit dem Code, indem wir den gesamten Code der Versandart verwenden, der in der Regel aus dem Code des Spediteurs ($result->getCarrier()) und dem Code der Methode selbst ($result->getMethod()) besteht, verbunden mit „ _“ .
Die für den Check benötigten Produkte werden direkt aus dem aktuellen Kundenangebot übernommen.
HINWEIS
Mit einem kleinen Stück Code im Array-Klassenkonstruktor können Sie das Angebot sowohl im Frontend als auch im Backend definieren (vorausgesetzt, eine Bestellung wurde im Admin-Panel erstellt).
Über \Magento\Framework\App\State können wir prüfen, in welchem Bereich wir uns gerade befinden, und das notwendige Zitat auswählen:
1. \Magento\Backend\Model\Session\Quote für Admin
2. \Magento\Checkout\Model\Session für das Frontend
Das ist es!
Jetzt können wir die Versandmethoden validieren und mit der nächsten Phase fortfahren – dem Erstellen eines Plugins zum Deaktivieren ungültiger (gemäß unseren Bedingungen) Versandmethoden.
So geht's:
> MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates
/** * Copyright 2016 MageWorx. Alle Rechte vorbehalten. * Siehe LICENSE.txt für Lizenzdetails. */ Namespace MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result; Klasse GetAllRates { /** * Deaktivieren Sie die markierten Versandkosten. * * HINWEIS: Wenn Sie einige der Versandkosten nicht sehen können, beginnen Sie von hier aus mit dem Debuggen. Überprüfen Sie zuerst 'is_disabled' * param im Versandtarifobjekt. * * @param \Magento\Shipping\Model\Rate\Ergebnis $subject * @param-Array $Ergebnis * @return-Array */ öffentliche Funktion afterGetAllRates($subject, $result) { foreach ($Ergebnis als $Schlüssel => $Rate) { if ($rate->getIsDisabled()) { unset($result[$key]); } } $ergebnis zurückgeben; } }
Dieses Plugin wird verwendet, um alle verfügbaren Versandmethodendaten abzurufen und jede von ihnen zu überprüfen. Wenn einige der Methoden die Markierung „is_disabled“ haben, schließen wir sie einfach aus der Liste aus, wodurch wir nur die Methoden sehen können, die den im Validator erstellten Bedingungen entsprechen. Diese Methoden werden auf jeder Seite einer Website ausgeschlossen, sei es eine geschätzte Versandsperre im Warenkorb oder die Checkout-Seite.
Um nun zu überprüfen, wie Plugins funktionieren, müssen wir sie in der Datei registrieren:
> 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\Ergebnis"> <plugin name="mageworx_shippingrules_update_rate_result" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\Append" sortOrder="10" deaktiviert="false"/> <plugin name="mageworx_shippingrules_update_disabled_or_enabled_rates" type="MageWorx\ShippingRules\Model\Plugin\Shipping\Rate\Result\GetAllRates" sortOrder="11" deaktiviert="false"/> </Typ> </config>
HINWEIS
Aus anschaulichen Gründen werden die Plugins in 2 verschiedene Klassen eingeteilt. In einem normalen Szenario können Sie nur 1 Klasse verwenden, um 2 verschiedene Methoden der Klasse Magento\Shipping\Model\Rate\Result zu ändern.
Warum funktioniert das so?
Magento\Shipping\Model\Rate\Result ist die Hauptklasse von Magento 2, die für die Verarbeitung von Versandmethoden verantwortlich ist. Seine getAllRates- Methode wird zum Abrufen von Versandmethodenlisten verwendet.
Inzwischen wird das Hinzufügen von Versandarten normalerweise mit Hilfe der Methode „Anhängen“ durchgeführt. Nachdem wir Methoden beim Anhängen validiert und aus der Sammlung ausgeschlossen haben, können wir eine Liste gültiger Methoden erhalten.
Die Validierung selbst kann ebenfalls geändert werden.
Unsere Erweiterung hat eine große spezielle Klasse, die eine Sammlung von benutzerdefinierten Filtern mit unterschiedlichen Bedingungen speichert (z. B. store_id, customer_group_id, Datum von/bis, Wochentage usw. ). Es hat auch eine separate Klasse mit einer Sammlung von Aktionen, die auf eine Versandmethode angewendet werden sollten (z. B. aktivieren oder deaktivieren, ihre Kosten gemäß anderen Bedingungen umschreiben, zusätzliche Kosten oder Rabatte hinzufügen usw. ).
Das Ergebnis des 1. Plugins im Debug sieht ungefähr so aus (für ein Produkt mit dem Gewicht von 1 Einheit):
So sieht es im Warenkorb aus (ups_WXS ist noch verfügbar, da die Gewichtsgrenze nicht überschritten wird):
Wenn Sie jedoch das Produktgewicht auf 101 ändern, ist diese Versandart nicht mehr verfügbar:
Es wird wieder verfügbar, wenn Sie es aus der Liste ausgeschlossen haben:
An der Kasse:
HINWEIS
Sie können die Liste aller verfügbaren Systemversandmethoden wie folgt direkt im Code abrufen:
/** * Geben Sie eine Reihe von Trägern zurück. * Wenn $isActiveOnlyFlag auf true gesetzt ist, werden nur aktive Träger zurückgegeben * * @param bool $isActiveOnlyFlag * @return-Array */ öffentliche Funktion getAvailableMethods($isActiveOnlyFlag = false) { $carriers = $this->shippingConfig->getAllCarriers(); foreach ($carriers as $carrierCode => $carrierModel) { if (!$carrierModel->isActive() && (bool)$isActiveOnlyFlag === true) { fortsetzen; } $carrierMethods = $carrierModel->getAllowedMethods(); if (!$carrierMethods) { fortsetzen; } foreach ($carrierMethods als $methodCode => $methodTitle) { $methods[] = $carrierCode . '_' . $methodCode; } } return !empty($methods) ? $methoden : []; }
Wobei `$this->shippingConfig` eine Instanz der Klasse `Magento\Shipping\Model\Config` ist . Mit diesem Code können Sie das Quellmodell für die Auswahl der Versandmethoden in den Einstellungen der Erweiterung erstellen (daher müssen Sie es nicht im Plugin fest codieren).
Zuguterletzt.
Wenn Sie keine eigene Erweiterung zum Deaktivieren von Versandmethoden erstellen möchten, können Sie unsere Shipping Suite-Lösung für Magento 2 verwenden.
Mit der Erweiterung können Sie bei Bedarf mit nur wenigen Mausklicks jede Versandart ausschließen.
1. Erstellen Sie eine neue Versandregel mit der folgenden Bedingung:
2. Wählen Sie in der Liste die Aktion Versandmethode ausblenden und wählen Sie aus, welche Methoden deaktiviert werden sollen:
HINWEIS
Wenn Sie das Attribut „Gewicht“ nicht in der Liste der Bedingungen finden, überprüfen Sie, ob es für die Verwendung in Werberegeln aktiviert ist:
Sollten Sie Fragen oder Ideen zur weiteren Verbesserung unserer Erweiterung haben, teilen Sie uns bitte Ihre Meinung im Kommentarbereich unten mit.