Magento 2 - Legen Sie den benutzerdefinierten Attributwert auf der Warenkorbseite fest

7

In Magento 1.x.

Ich habe folgende Funktion in erstellt Namespace/Modulename/Model/Observer.php

public function salesQuoteItemSetCustomAttribute($observer){

        $quoteItem = $observer->getQuoteItem();
        $product = $observer->getProduct();
        $quoteItem->setCustomerProductPoints($product->getCustomerProductPoints());
    }

Rief diese Funktion in Namespace/Modulename/etc/config.xml

    <sales_quote_item_set_product>
                <observers>
                    <product_point_quote>
                        <class>productpoint/observer</class>
                        <method>salesQuoteItemSetCustomAttribute</method>
                    </product_point_quote>
                </observers>
    </sales_quote_item_set_product>

Habe auch mein benutzerdefiniertes Attributangebot in Bestellung und von Bestellung in Angebot konvertiert , indem ich den folgenden Code in verwendet habeconfig.xml

    <sales_convert_quote_item>
        <customer_product_points>
            <to_order_item>*</to_order_item>
            <to_invoice_item>*</to_invoice_item>
            <to_shipment_item>*</to_shipment_item>
            <to_cm_item>*</to_cm_item>
        </customer_product_points>
    </sales_convert_quote_item>
    <sales_convert_order_item>
        <customer_product_points>
            <to_quote_item>*</to_quote_item>
            <to_invoice_item>*</to_invoice_item>
            <to_shipment_item>*</to_shipment_item>
            <to_cm_item>*</to_cm_item>
        </customer_product_points>
    </sales_convert_order_item>

In Magento 2

Ich habe versucht, dasselbe in Magento 2 zu tun, konnte jedoch keine Produktdetails abrufen.

Ich habe es mit folgendem Code versucht:

Namespace/Modulename/Observer/salesQuoteItemSetCustomAttribute.php

<?php
namespace Namespace\Modulename\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Catalog\Model\Product;
use Magento\Checkout\Model\Cart;


class salesQuoteItemSetCustomAttribute implements ObserverInterface
{
    public function __construct(
        \Magento\Checkout\Model\Cart $cart,
        \Magento\Catalog\Model\Product $product
    ) {
        $this->cart = $cart;
        $this->product = $product;
    }
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $cartQuote= $this->cart->getItems()->getData();
        $prod= $this->product->getData();
        echo '<pre>';print_r($prod); exit;
    }
}

etc/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">
    <event name="sales_quote_save_after">
        <observer name="set_checkout_quote_id" instance="Magento\Checkout\Observer\SalesQuoteSaveAfterObserver" />
    </event>
</config>

etc/fieldset.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../../../../../../../../../../lib/internal/Magento/Framework/Object/etc/fieldset.xsd">
    <scope id="global">
        <fieldset id="sales_convert_quote_item">
            <field name="product_point">
                <aspect name="to_order_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>
        </fieldset>
        <fieldset id="sales_convert_order_item">
            <field name="product_point">
                <aspect name="to_quote_item" />
                <aspect name="to_invoice_item" />
                <aspect name="to_shipment_item" />
                <aspect name="to_cm_item" />
            </field>
        </fieldset>
    </scope>
</config>

Mit dem obigen Code erhalte ich Werte von Attributen im Warenkorb, aber nicht meinen benutzerdefinierten Attributwert. Wenn ich versuche, Produktdaten zu drucken, wird null zurückgegeben.

Der Code funktioniert gut mit Magento 1.9. Wie mache ich es mit Magento 2.0.2?

Wie kann custom attributeich die Warenkorbseite in Magento 2 einstellen und anzeigen?

TIEFER JOSHI
quelle

Antworten:

10

Sie müssen kein Observe erstellen , Sie können es durch einfachen Code unten erhalten.

Müssen nur {MODULE_NAME}/etc/catalog_attributes.xmlmit folgenden Inhalten erstellen :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="custom_attribute"/>
    </group>
</config>

Sie können das Attribut custome /templates/cart/item/default.phtmlmit dem folgenden Code erhalten.

echo $_item->getProduct()->getData('custom_attribute');
Suresh Chikani
quelle
Gute Antwort. Arbeitete wie Charme
Jaimin Sutariya
Thx, es hat meinen Tag gerettet :)
K. Maliszewski
Danke, es funktioniert
Nikunj Vadariya
5

In Magento 2

Ändern Sie den folgenden Code:

Namespace/Modulename/Observer/salesQuoteItemSetCustomAttribute.php

<?php
namespace Namespace\Modulename\Observer;

use Magento\Framework\Event\ObserverInterface;

use Magento\Catalog\Model\Product;
use Magento\Checkout\Model\Cart;


class salesQuoteItemSetCustomAttribute implements ObserverInterface
{
   protected $_objectManager;

    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectManager,
        \Magento\Checkout\Model\Cart $cart,
        \Magento\Catalog\Model\Product $product,
        \Magento\Framework\ObjectManagerInterface $interface,
        \Magento\Quote\Model\Quote\Item $quote,
        \CollectionFactory $productCollectionFactory
    ) {
        $this->_objectManager = $objectManager;
        $this->cart = $cart;
        $this->product = $product;
        $this->objectManager = $interface;
        $this->quote = $quote;
    }
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $product = $observer->getProduct();
        $quoteItem = $observer->getQuoteItem();
        $quoteItem->setCustomAttribute($product->getCustomAttribute());
    }
}

etc/events.xml

<?xml version="1.0" encoding="UTF-8"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd">

            <event name="sales_quote_item_set_product">
                <observer
         name="product_point_quote"
         instance="Namespace\Modulename\Observer\salesQuoteItemSetCustomAttribute"/>
            </event>
</config>

Erstellen Sie catalog_attributes.xmlin etc, um das Attribut in Folgendes zu konvertieren quote:

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/catalog_attributes.xsd">
    <group name="quote_item">
        <attribute name="custom_attribute"/>
    </group>
</config>

Dadurch wird Ihr Attribut auf der Warenkorbseite angezeigt

TIEFER JOSHI
quelle
1
Übrigens ist es auch möglich, fast alle benutzerdefinierten Daten, die Sie im QuoteItem-Objekt benötigen, mithilfe der folgenden Methoden hinzuzufügen: $quoteItem->setData('categoryData', $categoryData);- in der Beobachtermethode execute(). Dafür müssen Sie nichts hinzufügencatalog_attributes.xml
Bartosz Kubicki