Magento 2 - Đặt giá trị thuộc tính tùy chỉnh trên trang giỏ hàng


7

Trong Magento 1.x

Tôi đã tạo chức năng sau trong Namespace/Modulename/Model/Observer.php

public function salesQuoteItemSetCustomAttribute($observer){

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

Được gọi là chức năng này trong 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>

Cũng đã chuyển đổi trích dẫn thuộc tính tùy chỉnh của tôi để đặt hàng và từ thứ tự sang trích dẫn bằng cách sử dụng mã sau trongconfig.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>

Trong Magento 2

Tôi đã thử làm điều tương tự trong Magento 2 nhưng không thể có được thông tin chi tiết về sản phẩm.

Tôi đã thử với mã sau đây:

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>

Sử dụng đoạn mã trên tôi nhận được các giá trị của các thuộc tính trong giỏ hàng nhưng không nhận được giá trị thuộc tính tùy chỉnh của mình. Khi tôi cố gắng in Dữ liệu sản phẩm, nó sẽ trả về null.

Mã này hoạt động tốt với Magento 1.9. Làm cách nào để tôi làm cho nó hoạt động với Magento 2.0.2?

Làm cách nào để thiết lập custom attributevà hiển thị trang giỏ hàng trong Magento 2?

Câu trả lời:


10

Không cần phải tạo bất kỳ Quan sát nào , bạn có thể lấy nó bằng mã đơn giản dưới đây.

Chỉ cần tạo {MODULE_NAME}/etc/catalog_attributes.xmlvới nội dung dưới đây:

<?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>

Bạn có thể nhận được thuộc tính theo yêu cầu /templates/cart/item/default.phtmlvới mã dưới đây.

echo $_item->getProduct()->getData('custom_attribute');

Câu trả lời tốt đẹp. Làm việc như bùa mê
Jaimin Sutariya 6/12/17

Thx, nó đã cứu ngày của tôi :)
K. Maliszewski

Cảm ơn, nó hoạt động
Nikunj Vadariya

5

Trong Magento 2

Thay đổi mã sau đây:

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>

Tạo catalog_attributes.xmltrong etcthuộc tính chuyển đổi để 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>

Điều này sẽ mang thuộc tính của bạn trên Trang giỏ hàng


1
Cũng có thể bằng cách thêm hầu hết mọi dữ liệu tùy chỉnh bạn cần trong đối tượng quoteItem bằng cách sử dụng: $quoteItem->setData('categoryData', $categoryData);- trong execute()phương thức quan sát viên . Đối với điều này, bạn không cần thêm bất cứ điều gì vàocatalog_attributes.xml
Bartosz Kubicki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.