Unterschiedliches Produktlayout je nach Produkt

7

Was ich bisher versucht habe

Wie der Titel beschreibt. Wie kann man verschiedene Layouts pro Produkt basierend auf einem Wert für dieses Produkt implementieren (in diesem Fall eine benutzerdefinierte EAV für die Produkteinheit)?

Zuerst dachte ich, ich würde einen benutzerdefinierten Produkttyp für diese Art von Produkten erstellen. Das würde gut funktionieren. Sie können die Produkttypen für vorhandene Produkte zwar nicht ändern.

Dann dachte ich, ich könnte ein neues Seitenlayout erstellen, obwohl Sie dem Produktlayout keinen Inhalt hinzufügen können.

Zuletzt dachte ich, ich würde einfach alle diese Produkte in eine Kategorie einfügen und dort die Produktansicht ändern (über Design> Layout Update XML), aber dies würde bedeuten, dass der Endbenutzer XML schreibt, was ich nach Möglichkeit vermeiden möchte. Gleiches gilt für das Ändern des XML-Designs für Design> Layout-Aktualisierung für jedes Produkt.

Andere Information:

Ich habe ein Magento-Modul erstellt, das das Produktbild durch eine andere Ansicht ersetzen soll. Derzeit habe ich (in meinem Modul) die Datei view / frontend / layout / catalog_product_view.xml mit meinem benutzerdefinierten Inhalt überschrieben (Entfernen der Originalbild- / Videoblöcke und Hinzufügen meiner eigenen Blöcke). Dies funktioniert einwandfrei, obwohl ALLE Produkte jetzt das neue Layout haben.

Alle Produkte sind derzeit einfache Produkte

Tuim
quelle

Antworten:

8

Ja, Sie können dies erreichen, indem Sie kleinen Code schreiben

Sie müssen lediglich ein Layout über ein Ereignis layout_load_beforehinzufügen. Mit diesem Ereignis können Sie Ihr dynamisches Layout hinzufügen.

Hier ist ein Beispielcode für Sie. Bitte ändern Sie ihn nach Ihren Wünschen

Was Sie tun können, ist events.xmlin Ihrem Modul zu erstellen

[Vendor]/[Module]/etc/frontend/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <!-- for diffrentiate layout.xml on product basis -->
    <event name="layout_load_before">
        <observer name="load_custom_handler" instance="[Vendor]\[Module]\Observer\LayoutLoadBefore" />
    </event>
</config>

[Vendor]\[Module]\Observer\LayoutLoadBefore.phpSchreiben Sie in Ihre Datei den folgenden Code

<?php

namespace [Vendor]\[Module]\Observer;

class LayoutLoadBefore implements \Magento\Framework\Event\ObserverInterface
{
    /**
     * @var \Magento\Framework\Registry
     */
    private $registry;

    public function __construct(
       ............
       \Magento\Framework\Registry $registry,
       ............
    ) {
        $this->registry = $registry;
    }


    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $this->registry->registry('current_product');

        if (!$product) {
          return $this;
        }
        if ($product->getMyvalue()) { // your condition
           $layout = $observer->getLayout();
           $layout->getUpdate()->addHandle('your_handle_name');
        }

        return $this;
    }
}

Und jetzt gehen Sie zur [Vendor]\[Module]\view\frontend\layout\your_handle_name.xmlDatei und schreiben Sie Ihren Code.

Diese Datei wurde nur zu Ihrem spezifischen Produktzustand hinzugefügt

Murtuza Zabuawala
quelle
Wofür steht diese Linie? $layout->getUpdate()->addHandle('your_handler_name');, Ich verstehe den Handler nicht, ich habe auch F & E für den Layout-Handler, Ressourcen machen mich nicht verständlich. Wenn Sie mir helfen können ODER einige nützliche Links.
anonym
1
@Vivek diese Zeile hinzufügen Layout und seine your_handler_name.xml
Suchdatei
Hallo, hier funktioniert alles gut, auch mein Beobachter wird angerufen. Aber mein benutzerdefinierter Handler wird nicht gerendert. Er rendert nur catalog_product_view.xml. Bitte lassen Sie mich wissen, wenn ich etwas vermisse. Ich habe catalog_product_view_extension.xml
Ravi Soni
@ Ravi, bitte überprüfen Sie Ihren Handler-Pfad und Namen, oder stellen Sie auf andere Weise eine neue Frage und geben Sie Ihren Code dort ein und senden Sie mir den Link zu dieser Frage, die ich überprüfen werde
Murtuza Zabuawala
@ Ravi, your_handler_namewäre benutzerdefinierter Name jeder Name, den Sie hier geben können, erstellen Sie einfach eine Datei mit diesem Namen
Murtuza Zabuawala
7

Sie können dies mit XML für Massenprodukte tun. Dafür müssen Sie den Helfer überschreiben und ein Attribut dafür erstellen. Lassen Sie sich von mir beschreiben.

Schritt 1: Erstellen Sie das Produktattribut ' customlayout '.

  • Erstellen Sie ein cutom-Produktattribut für ein benutzerdefiniertes Layout. Hier habe ich gerade das Attribut ' customlayout ' mit dem Typ boolean (yes / no) erstellt .
  • Weisen Sie dieses Attribut im entsprechenden Attributsatz zu.
  • Jetzt ist " benutzerdefiniertes Layout " in Produkten sichtbar. Setzen Sie " Ja" in den Produkten, für die Sie ein anderes Layout festlegen möchten.

Geben Sie hier die Bildbeschreibung ein

Schritt 2: Überschreiben Sie die Hilfsfunktion initProductLayout ().

Überschreiben Sie die Hilfsfunktion in Ihrem benutzerdefinierten Modul und ändern Sie sie in der Datei di.xml , um die Hilfsfunktion zu überschreiben.

app / code / YourCompany / YourModule / etc / di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Catalog\Helper\Product\View" type="YourCompany\YourModule\Helper\Product\View" />
</config>

in der Datei YourCompany \ YourModule \ Helper \ Product \ view.php .

public function initProductLayout(ResultPage $resultPage, $product, $params = null)
    {
      ......
      // add handle params
      ......
    if ($params && $params->getBeforeHandles()) {
        foreach ($params->getBeforeHandles() as $handle) {
            $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
            $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
        }
    }

    $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku]);
    $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], null, false);

    if ($params && $params->getAfterHandles()) {
        foreach ($params->getAfterHandles() as $handle) {
            $resultPage->addPageLayoutHandles(['customlayout' => $product->getCustomlayout(), 'id' => $product->getId(), 'sku' => $urlSafeSku], $handle);
            $resultPage->addPageLayoutHandles(['type' => $product->getTypeId()], $handle, false);
        }
    }

   ........

    }

Hier habe ich ein benutzerdefiniertes Attribut für ein benutzerdefiniertes Layout-Handle hinzugefügt. Jetzt können Sie eine benutzerdefinierte Layoutdatei erstellen, um dieses Attribut zu verwenden.
Lassen Sie uns eine benutzerdefinierte Handle-Datei erstellen.

Schritt 3: Erstellen Sie eine Layoutdatei für ein benutzerdefiniertes Layout.

Erstellen Sie eine Layoutdatei in Ihrem benutzerdefinierten Design / Modul. catalog_product_view_customlayout_1.xml

Hier können Sie Ihre benutzerdefinierten Änderungen festlegen. Es wird auf alle Produkte angewendet , deren Attibute-Wert " Ja " " Ja " ist.

Emipro Technologies Pvt. GmbH.
quelle
@ Tuim, bitte folgen Sie den obigen Schritten, es wird für Sie funktionieren. Die obigen Schritte funktionieren für mich.
Emipro Technologies Pvt. Ltd.
@ Tuim, haben Sie unsere Lösung ausprobiert. Ist das Arbeit für dich?
Emipro Technologies Pvt. Ltd.
Hallo, ich habe mich für die unten stehende Lösung entschieden. Da ich nicht die komplette initProductLayout-Funktion mit einer benutzerdefinierten Implementierung überschreiben wollte. Das würde die Wartbarkeit verringern.
Tuim