हेडर मिनी-कार्ट में उत्पाद SKU प्राप्त करना


10

मैं SKUएक Magento 2 साइट की मिनी-कार्ट में उत्पाद प्रदर्शित करने में सक्षम होना चाहता हूं । लेकिन मुझे यकीन नहीं है कि KnockoutJSअतिरिक्त उत्पाद जानकारी में खींचने के लिए कैसे उपयोग किया जाए। टेम्प्लेट जिसे बुलाया जा रहा है वह यहां है:

विक्रेता / Magento / मॉड्यूल-चेकआउट / देखें / दृश्यपटल / वेब / टेम्पलेट / minicart / आइटम / default.html

और जैसे कोड शामिल हैं:

<strong class="product-item-name">
    <!-- ko if: product_has_url -->
    <a data-bind="attr: {href: product_url}, text: product_name"></a>
    <!-- /ko -->
    <!-- ko ifnot: product_has_url -->
        <!-- ko text: product_name --><!-- /ko -->
    <!-- /ko -->
</strong>

तो मेरा सीधा सवाल यह होगा कि उत्पाद सेट के लिए मूल्य कहां हैं और मैं उत्पाद विवरण जोड़ने या हटाने के लिए उन्हें कैसे बदल सकता हूं?

जवाबों:


12

जहां तक ​​मुझे पता है, हेडर मिनिकार्ट ग्राहक के डेटा से डेटा प्राप्त करेगा

विक्रेता / Magento / मॉड्यूल-चेकआउट / देखें / दृश्यपटल / वेब / js / देखें / minicart.js

define([
    'uiComponent',
    'Magento_Customer/js/customer-data',
    'jquery',
    'ko',
    'sidebar'
], function (Component, customerData, $, ko) {
    'use strict';
    ......
    this.cart = customerData.get('cart');
    ......
}

ग्राहक डेटा जेएस में देखें vendor/magento/module-customer/view/frontend/web/js/customer-data.js, हम स्थानीय भंडारण से ग्राहक डेटा प्राप्त कर सकते हैं। उदाहरण के लिए, आपके ब्राउज़र कंसोल में, लाइन चलाएं: localStorage.getItem('mage-cache-storage')हम कार्ट जानकारी भी प्राप्त कर सकते हैं। यहाँ छवि विवरण दर्ज करें

{
  "cart": {
    "summary_count": 1,
    ....
    "items": [
      {
      ......   
        "qty": 1,
        "item_id": "11728",
        "configure_url": "http://magento2-demo/checkout/cart/configure/id/11728/product_id/1817/",
        "is_visible_in_site_visibility": true,
        "product_name": "Breathe-Easy Tank",
        "product_url": "http://magento2-demo/breathe-easy-tank.html",
        "product_has_url": true,
        "canApplyMsrp": false
      }
    ],
    .......
  }
}

विक्रेता / Magento / मॉड्यूल-चेकआउट / CustomerData / DefaultItem.php पर नेविगेट करें

protected function doGetItemData()
    {
       .......
        return [
            'options' => $this->getOptionList(),
            'qty' => $this->item->getQty() * 1,
            'item_id' => $this->item->getId(),
            'configure_url' => $this->getConfigureUrl(),
            'is_visible_in_site_visibility' => $this->item->getProduct()->isVisibleInSiteVisibility(),
            'product_name' => $this->item->getProduct()->getName(),
            'product_url' => $this->getProductUrl(),
            'product_has_url' => $this->hasProductUrl(),
           .....
    }

विक्रेता / Magento / मॉड्यूल-चेकआउट / CustomerData / AbstractItem.php

/**
 * {@inheritdoc}
 */
public function getItemData(Item $item)
{
    $this->item = $item;
    return \array_merge(
        ['product_type' => $item->getProductType()],
        $this->doGetItemData()
    );
}

SKU आइटम प्राप्त करने के लिए, मुझे लगता है कि हमें getItemData()( प्लगइन के साथ प्रयास करना चाहिए ) डेटा जोड़ना होगा । और फिर टेम्पलेट html को ओवरराइड करें vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html

 <div class="product-item-details">

                    <!-- ko text: product_sku --><!-- /ko -->

अद्यतन Magento 2.1.0 संस्करण

Magento 2.1.0 में, आपको केवल ओवरराइड करने की आवश्यकता है default.html। ऐसा इसलिए है क्योंकि विधि doGetItemDataपहले से ही उत्पाद स्कू है।


धन्यवाद! इस सवाल पर 'हाउज़' के एक टन में भरा!
वृत्ताकार

@Khoa TruongDinh महान जवाब के लिए धन्यवाद। यह सही काम करता है। क्या आप मुझे बता सकते हैं कि चेकआउट सारांश अनुभाग में हम ऐसा कैसे कर सकते हैं। मुझे बहुत कुछ मिला है लेकिन कैंट को एक स्थान मिला है जहां चेकआउट सारांश में नाम के बजाय नई विशेषता जोड़ना है।
रोहित गोयल

1
सावधान रहें, यदि आपके पास कॉन्फ़िगर करने योग्य उत्पाद हैं, तो आपको इस वर्ग को भी ओवरराइड करने की आवश्यकता है: Magento\ConfigurableProduct\CustomerData\ConfigurableItemऔर समूहीकृत उत्पाद के लिए:Magento\GroupedProduct\CustomerData\GroupedItem
फ्रेंक गार्नियर

@FranckGarnier मैंने अभी-अभी चेक किया है कि हमें इन वर्गों को ओवरराइड करने की आवश्यकता नहीं है। केवल जोड़ने पर !-- ko text: product_sku --><!-- /ko -->, स्केउ विन्यास योग्य उत्पाद के लिए दिखाई देगा। मेरा Magento संस्करण 2.1.5 है।
खोआ TruongDinh

1
Product_sku के लिए सही है, लेकिन यदि आपको मूल रूप से मौजूद अतिरिक्त जानकारी नहीं जोड़ने की आवश्यकता है, तो इन वर्गों के बारे में सावधान रहें, इसके बजाय प्लगइन्स का उपयोग करने का प्रयास करें।
फ्रेंक गार्नियर

7

सबसे पहले, minicart टेम्पलेट में आइटम प्राप्त करने के प्रवाह के बारे में @Khoa TruongDinh से बहुत अच्छी व्याख्या।

उत्पाद विवरण जोड़ने या हटाने के लिए मैं उन्हें कैसे बदल सकता हूँ?

मुझे एक तरीका मिला कि आप उत्पाद की कस्टम विशेषताओं के साथ मिनिकार्ट टेम्पलेट को कैसे बढ़ा सकते हैं। जो सबसे पहले आप को ओवरराइड करने की जरूरत है ऐसा करने के लिए विक्रेता / Magento / मॉड्यूल-चेकआउट / CustomerData / DefaultItem.php साथ डि प्राथमिकताएं

बनाएं एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / etc / di.xml OT ओवरराइड DefaultItem वस्तु

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Checkout\CustomerData\DefaultItem" type="Vendor\Module\Preferences\MiniCartItem" />
</config>

फिर doGetItemData () विधि को ओवरराइड करने के लिए नई ऑब्जेक्ट बनाएं और कस्टम product_custom_attribute के साथ custom_attribute जोड़ें

फ़ाइल: एप्लिकेशन / कोड / विक्रेता / मॉड्यूल / प्राथमिकताएं / MiniCartItem.php

namespace Vendor\Module\Preferences;

class MiniCartItem extends \Magento\Checkout\CustomerData\DefaultItem
{

    public function __construct(
        \Magento\Catalog\Helper\Image $imageHelper,
        \Magento\Msrp\Helper\Data $msrpHelper,
        \Magento\Framework\UrlInterface $urlBuilder,
        \Magento\Catalog\Helper\Product\ConfigurationPool $configurationPool,
        \Magento\Checkout\Helper\Data $checkoutHelper,
        \Magento\Catalog\Helper\Output $helper,
        \Magento\Catalog\Model\Product $productModel
    ) {
        $this->configurationPool = $configurationPool;
        $this->imageHelper = $imageHelper;
        $this->msrpHelper = $msrpHelper;
        $this->urlBuilder = $urlBuilder;
        $this->checkoutHelper = $checkoutHelper;
        $this->helper = $helper;
        $this->productModel = $productModel;
    }

    /**
     * {@inheritdoc}
     */
    protected function doGetItemData()
    {
        $imageHelper = $this->imageHelper->init($this->getProductForThumbnail(), 'mini_cart_product_thumbnail');
        $product = $this->productModel->load($this->item->getProduct()->getId());
        return [
            'options' => $this->getOptionList(),
            'qty' => $this->item->getQty() * 1,
            'item_id' => $this->item->getId(),
            'configure_url' => $this->getConfigureUrl(),
            'is_visible_in_site_visibility' => $this->item->getProduct()->isVisibleInSiteVisibility(),
            'product_name' => $this->item->getProduct()->getName(),
            'product_url' => $this->getProductUrl(),
            'product_has_url' => $this->hasProductUrl(),
            'product_price' => $this->checkoutHelper->formatPrice($this->item->getCalculationPrice()),
            'product_image' => [
                'src' => $imageHelper->getUrl(),
                'alt' => $imageHelper->getLabel(),
                'width' => $imageHelper->getWidth(),
                'height' => $imageHelper->getHeight(),
            ],
            'product_custom_attribute' => $this->helper->productAttribute($product, $product->getCustomAttribute(), 'custom_attribute'),
            'canApplyMsrp' => $this->msrpHelper->isShowBeforeOrderConfirm($this->item->getProduct())
                && $this->msrpHelper->isMinimalPriceLessMsrp($this->item->getProduct()),
        ];
    }
}

ध्यान दें कि मैं इंजेक्शन लगा रहा हूं

\ Magento \ Catalog \ Model \ Product $ productModel

निर्माण विधि के लिए क्योंकि मुझे अपने custom_attribute तक पहुँचने के लिए पूर्ण उत्पाद डेटा लोड करने की आवश्यकता है। अगर कोई बेहतर तरीका है तो कृपया मुझे बताएं।

और अंत में आप नई विशेषता प्रदर्शित कर सकते हैं

देखें / दृश्यपटल / वेब / टेम्पलेट / minicart / आइटम / default.html:

 <div class="product-item-details">

                    <!-- ko text: product_custom_attribute --><!-- /ko -->

उपयोग करना 'product_sku' => $this->item->getProduct()->getSku()स्क्यू में खींचने का काम करता है, इसलिए जब तक मुझे इसे \Magento\Catalog\Model\Product $productModelखींचने की आवश्यकता नहीं होती है, मैं इसका उपयोग कुछ अन्य उत्पाद जानकारी को हथियाने के लिए करूंगा। मुझे आखिरकार वरीयता मिल गई और वह चल पड़ा, इसलिए आपका तरीका एक आकर्षण की तरह काम करता है!
वृत्ताकार

1
कस्टम विशेषताओं के लिए आपको $productModelउत्पाद को सभी विशेषताओं के साथ लोड करने की आवश्यकता होती है और फिर उन्हें पुनर्प्राप्त किया जाता है $this->helper। अगर यह काम कर रहा है तो आप मेरे जवाब को बढ़ा सकते हैं।
मिरोस्लाव पेट्रॉफ

1
मैंने किया, और उन्होंने मुझे केवल एक बार वोट करने दिया। अगर मैं आपके उत्तर को सही और साथ ही खोआ के बता सकता हूं। मैं आसपास पोस्ट करूंगा और देखूंगा कि क्या हम आपके लिए अधिक वोट प्राप्त कर सकते हैं, क्योंकि मुझे अभी तक इस समस्या का कोई भी जवाब कहीं और देखना है और यह इसे बाहर पार्क में दस्तक देता है।
15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.