Produkttypen in Magento 2 automatisch ändern

  • Tutorial
Manchmal müssen Inhaltsmanager aus dem einen oder anderen Grund ein bestimmtes Produkt von "Einfach" in "Virtuell" konvertieren oder umgekehrt das festgelegte Attribut in "Einfach" ändern und so weiter ... Meistens liegt dies auf den Schultern der Entwickler. Und hier möchte ich 1 neues und sehr interessantes Feature von Magento 2 beschreiben, das nicht in der offiziellen Dokumentation beschrieben ist.

So ändern Sie den Produkttyp in Magento 1. * Content Manager müssten neue Produkte manuell erstellen, Kopien der Originalprodukte erstellen usw. oder Entwickler bitten, dies über Code zu tun. Magento 2. * führt eine neue Funktion ein, um dieses Ziel zu erreichen. Bevor Sie sich damit befassen (ich nenne es "automatische Konvertierung"), sollten Sie einige Punkte beachten, um die richtigen Ergebnisse zu erzielen.

Automatische Konvertierung aus Benutzersicht


Schauen wir uns das Admin-Panel an oder wie es aus Sicht des Content Managers funktioniert. Nach wie vor können Sie den Typ des neuen Produkts auswählen, bevor Sie es erstellen.

In Magento 1 wird dies unter Admin> Katalog> Produkte verwalten> Seite angezeigt, um das Attribut des Sets und den Produkttyp auszuwählen, nachdem Sie auf "Produkt hinzufügen" geklickt haben.


Klicken Sie dazu in Magento 2 auf der Seite Admin> Produkte> Katalog auf den Pfeil rechts neben der Schaltfläche "Produkt hinzufügen".


Nachdem Sie den gewünschten Typ ausgewählt haben, zeigt Magento die Bearbeitungsseite für ein neues Produkt mit vordefinierten Optionen und / oder neuen Abschnitten für den ausgewählten Typ an. Wenn Sie den Produkttyp "Einfaches Produkt" auswählen oder einfach auf "Produkt hinzufügen" klicken, wird die Seite "Einfaches Produkt bearbeiten" angezeigt. Beachten Sie jedoch die folgenden drei Punkte:

  1. Gewichtsattribut
  2. Schnittkonfigurationen
  3. Downloadable Information Section

Diese 3 Abschnitte bestimmen den Produkttyp.

Magento 2 kann automatisch (beim Speichern) den Produkttyp für neue und vorhandene Produkte der folgenden Produkte ändern:

Überlegen Sie, was dafür getan werden muss.

Einfache und virtuelle Produkte

Wenn Sie das Gewicht auf "Gewicht" = "Der Artikel hat kein Gewicht" setzen (dh es gibt kein Gewicht und Sie entfernen nicht nur den Wert aus dem Eingabefeld), wird das Produkt als virtuelles Produkt gespeichert, sondern sobald Sie zur Produktbearbeitungsseite zurückkehren Wenn Sie angeben, dass das Produkt Gewicht hat, wird es sofort nach dem Speichern in ein einfaches Produkt umgewandelt.

Herunterladbares Produkt

Um ein einfaches Produkt in ein herunterladbares Produkt zu verwandeln, müssen Sie "Gewicht" = "Der Artikel hat kein Gewicht" setzen und 1 oder mehrere Links im Abschnitt "Herunterladbare Informationen" hinzufügen. Um dieses Produkt wieder in ein einfaches Produkt zu verwandeln, setzen Sie einfach "Weight" = "The item has weight" und speichern Sie das Produkt.

Konfigurierbares Produkt

Um aus einem einfachen Produkt ein konfigurierbares Produkt zu machen, fügen Sie einfach ein beliebiges Nebenprodukt hinzu, wie oben beschrieben. Und um es wieder einfach zu machen, löschen Sie einfach alle Konfigurationen und klicken Sie auf Speichern. Wie Sie bereits verstanden haben, bedeutet dies, dass es in Magento 2 kein konfigurierbares Produkt ohne Kinder geben kann (wie in Magento 1).

Das ist alles

Hinweis


Bevor Sie die automatische Konvertierung in ein konfigurierbares Produkt verwenden, müssen Sie berücksichtigen, dass in Magento 2 das Prinzip der Preisermittlung für ein konfigurierbares Produkt geändert wurde. In Magento 1 Configurable hatten Produkte einen eigenen Preis und ignorierten den Preis verwandter Produkte vollständig. Magento 2 verfolgt einen anderen Ansatz. Jetzt verwenden konfigurierbare Produkte einen berechneten Preis von angeschlossenen Kindern. Die Kehrseite der Medaille ist, dass, wenn Sie alle angehängten Produkte entfernen, das Produkt in ein einfaches Produkt konvertiert wird. Wenn Sie jedoch alle damit verbundenen Produkte von der Seite "Raster" im Verwaltungsbereich entfernen, wird das Produkt nicht konvertiert (warum dies so ist, werde ich später beschreiben). Angesichts der neuen Logik ist die Tatsache, dass das Produkt nur konfigurierbar ist, wenn es untergeordnete Elemente hat, andernfalls wird es in ein einfaches Produkt "konvertiert".
* In Magento 2.1 wurden einige dieser Fehler behoben. Wenn Sie die Methode $ product-> getFinalPrice () direkt aufrufen, wird jetzt eine Ausnahme ausgelöst
Fatal error:  Uncaught exception 'Magento\Framework\Exception\LocalizedException' with message 'Configurable product "…sku…" does not have sub-products' in vendor\magento\module-configurable-product\Pricing\Price\ConfigurablePriceResolver.php:52


Für Entwickler


Sprechen wir jetzt darüber, wie genau das alles funktioniert. Ich möchte mit dem Wichtigsten beginnen, mit der Klasse Magento \ Catalog \ Model \ Product \ TypeTransitionManager .
...
public function __construct(
        \Magento\Catalog\Model\Product\Edit\WeightResolver $weightResolver,
        array $compatibleTypes
    ) {
        $this->compatibleTypes = $compatibleTypes;
        $this->weightResolver = $weightResolver;
    }
    public function processProduct(Product $product)
    {
        if (in_array($product->getTypeId(), $this->compatibleTypes)) {
            $product->setTypeInstance(null);
            $productTypeId = $this->weightResolver->resolveProductHasWeight($product)
                ? Type::TYPE_SIMPLE
                : Type::TYPE_VIRTUAL;
            $product->setTypeId($productTypeId);
        }
    }
...

Dies ist eine relativ einfache Klasse mit zwei Methoden: __construct und processProduct. Die ganze Magie steckt in der zweiten Methode, processProduct ($ product). Wie Sie sehen, wird überprüft, ob der Typ des übertragenen Produkts in einer Reihe kompatibler Typen vorliegt. Wenn das Produkt ein Gewicht hat, handelt es sich um ein einfaches Produkt, wenn nicht, um ein virtuelles Produkt.

In Magento 2.1. Sie haben es erraten, die folgenden Typen sind kompatibel:
  • Einfach
  • Virtuell
  • Herunterladbar
  • Konfigurierbar

Alle von ihnen werden durch di.xml übertragen
...
Magento\Catalog\Model\Product\Type::TYPE_SIMPLEMagento\Catalog\Model\Product\Type::TYPE_VIRTUAL
...

Dies bedeutet, dass nur diese Typen in einfache oder virtuelle Produkte konvertiert werden können.

Wie oben erwähnt, kann ein einfaches Produkt auf dieselbe Weise in ein konfigurierbares und herunterladbares Produkt konvertiert werden. Alle Magie in den folgenden Klassen (Plugins):

Magento \ Downloadable \ Model \ Product \ TypeTransitionManager \ Plugin \ Downloadable :: aroundProcessProduct () überprüft, ob der Produkttyp Einfach, Virtuell, Herunterladbar ist. Daten mit dem herunterladbaren Schlüssel wurden vom Frontend gesendet und dieses Produkt hat kein Gewicht. Wenn ja, ist es herunterladbar, andernfalls wird die ursprüngliche Methode gestartet.
...
public function aroundProcessProduct(
        \Magento\Catalog\Model\Product\TypeTransitionManager $subject,
        Closure $proceed,
        \Magento\Catalog\Model\Product $product
    ) {
        $isTypeCompatible = in_array(
            $product->getTypeId(),
            [
                \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE,
                \Magento\Catalog\Model\Product\Type::TYPE_VIRTUAL,
                \Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE
            ]
        );
        $downloadableData = $this->request->getPost('downloadable');
        $hasDownloadableData = false;
        if (isset($downloadableData)) {
            foreach ($downloadableData as $data) {
                foreach ($data as $rowData) {
                    if (empty($rowData['is_delete'])) {
                        $hasDownloadableData = true;
                        break 2;
                    }
                }
            }
        }
        if ($isTypeCompatible && $hasDownloadableData && !$this->weightResolver->resolveProductHasWeight($product)) {
            $product->setTypeId(\Magento\Downloadable\Model\Product\Type::TYPE_DOWNLOADABLE);
            return;
        }
        $proceed($product);
    }
...


Magento \ ConfigurableProduct \ Model \ Product \ TypeTransitionManager \ Plugin \ Configurable :: aroundProcessProduct () Das Plugin ändert den Produkttyp in "konfigurierbar", wenn die Anfrage Daten mit dem Schlüssel "Attribute" enthält. Andernfalls wird die ursprüngliche Methode gestartet.
...
public function aroundProcessProduct(
        \Magento\Catalog\Model\Product\TypeTransitionManager $subject,
        Closure $proceed,
        \Magento\Catalog\Model\Product $product
    ) {
        $attributes = $this->request->getParam('attributes');
        if (!empty($attributes)) {
            $product->setTypeId(\Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE);
            return;
        }
        $proceed($product);
    }
...

Wie funktioniert das alles?


Wenn Sie versuchen, das Produkt wie oben beschrieben über das Admin-Bedienfeld zu speichern, wird der Typ dank dieses Codes in 1 geändert. Wenn Sie jedoch nur versuchen, das Produktmodell mit der save () -Methode zu speichern, ändert sich nichts. Der Punkt ist der Controller, der die Lagerung von Waren abwickelt.
Magento \ Catalog \ Controller \ Adminhtml \ Product \ Save :: execute () verwendet eine Instanz der Klasse Magento \ Catalog \ Model \ Product \ TypeTransitionManager

...
$product = $this->initializationHelper->initialize($this->productBuilder->build($this->getRequest()));
$this->productTypeManager->processProduct($product);
…
$product->save();
...

Wie Sie sehen, ist die Produktkonvertierung in keiner Weise an die save () -Methode gebunden und wird unmittelbar vor dem Erstellen des Produkts aufgerufen.

Anstelle einer Schlussfolgerung


Für Benutzer und Entwickler ist es meiner Meinung nach ein wenig klarer geworden, wie genau die neue Funktion von Magento 2 funktioniert. Es wundert mich, dass Magento 2 über die gesamte Zeit seines Bestehens nirgendwo darüber geschrieben hat.
Ich möchte auch hinzufügen, dass es in Magento 2 ganz einfach ist, neue Warentypen hinzuzufügen. Wenn Sie Benutzern erlauben möchten, sie untereinander zu konvertieren, müssen Sie nur ein paar Zeilen in die di.xml Ihres Moduls einfügen und Ihr eigenes Plugin erstellen.

Jetzt auch beliebt: