รับ SKU ผลิตภัณฑ์ใน mini-cart


10

ฉันต้องการที่จะแสดงผลิตภัณฑ์SKUในรถเข็นขนาดเล็กของเว็บไซต์ Magento 2 แต่ฉันไม่แน่ใจว่าจะใช้KnockoutJSเพื่อดึงข้อมูลผลิตภัณฑ์เพิ่มเติมได้อย่างไร เทมเพลตที่ถูกเรียกใช้อยู่ที่นี่:

ผู้ขาย / วีโอไอพี / โมดูลเช็คเอาต์ / view / ส่วนหน้า / เว็บ / แม่แบบ / 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

เท่าที่ฉันรู้ minicart ส่วนหัวจะได้รับข้อมูลจากข้อมูลลูกค้า

ผู้ขาย / วีโอไอพี / โมดูลเช็คเอาต์ / view / ส่วนหน้า / เว็บ / js / view / minicart.js

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

ดูข้อมูลลูกค้า js 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 / module-checkout / 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(),
           .....
    }

ผู้ขาย / วีโอไอพี / โมดูลเช็คเอาต์ / 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มีผลิตภัณฑ์ sku อยู่แล้ว


ขอบคุณ! เต็มไปด้วย 'ชำนาญ' ในคำถามนี้!
Circlesix

@ เขา TruongDinh ขอบคุณสำหรับคำตอบที่ดี งานนี้สมบูรณ์แบบ คุณช่วยบอกฉันหน่อยได้ไหมว่าเราสามารถทำสิ่งนี้ได้เหมือนกันในส่วนสรุปการชำระเงิน ฉันพบมาก แต่ไม่สามารถรับตำแหน่งที่จะเพิ่มแอตทริบิวต์ใหม่แทนชื่อในสรุปการชำระเงิน
Rohit Goel

1
ระวังถ้าคุณมีผลิตภัณฑ์ที่กำหนดค่าได้คุณจะต้องแทนที่คลาสนี้ด้วย: Magento\ConfigurableProduct\CustomerData\ConfigurableItemและสำหรับผลิตภัณฑ์ที่จัดกลุ่ม:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier

@FranckGarnier ฉันเพิ่งตรวจสอบดูเหมือนว่าเราไม่จำเป็นต้องแทนที่ชั้นเรียนเหล่านี้ เพิ่มเฉพาะ!-- ko text: product_sku --><!-- /ko -->sku จะแสดงสำหรับผลิตภัณฑ์ที่กำหนดค่าได้ เวอร์ชั่น Magento ของฉันคือ 2.1.5
Khoa TruongDinh

1
เหมาะสำหรับ product_sku แต่ถ้าคุณต้องการเพิ่มข้อมูลพิเศษที่ไม่มีอยู่ให้ระวังเกี่ยวกับคลาสเหล่านี้ให้ลองใช้ปลั๊กอินแทน
Franck Garnier

7

ประการแรกคำอธิบายที่ดีมากจาก @Khoa TruongDinh เกี่ยวกับการรับรายการในเทมเพลต minicart

ฉันจะเปลี่ยนพวกเขาเพื่อเพิ่มหรือลบรายละเอียดผลิตภัณฑ์ได้อย่างไร

ฉันพบวิธีที่คุณสามารถขยายเทมเพลต minicart ด้วยแอตทริบิวต์ที่กำหนดเองของผลิตภัณฑ์ ก่อนอื่นคุณต้องแทนที่ผู้ขาย / magento / module-checkout / CustomerData / DefaultItem.phpด้วยการตั้งค่า DI

สร้างแอป / รหัส / ผู้ขาย / โมดูล / 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 () และเพิ่มcustom_attributeด้วยคีย์ผลิตภัณฑ์product_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()งานจะดึง sku ดังนั้นในขณะที่ฉันไม่ต้องการ\Magento\Catalog\Model\Product $productModelคว้าสิ่งนั้นฉันจะใช้เพื่อดึงข้อมูลผลิตภัณฑ์อื่น ๆ ในที่สุดฉันก็เริ่มการตั้งค่าและทำงานดังนั้นวิธีการของคุณจะทำงานได้อย่างมีเสน่ห์!
Circlesix

1
สำหรับแอตทริบิวต์ที่กำหนดเองที่คุณต้องการในการโหลดสินค้าที่มีคุณลักษณะทั้งหมดแล้วดึงพวกเขาด้วย$productModel $this->helperถ้ามันใช้งานได้คุณสามารถโหวตคำตอบของฉันได้
Miroslav Petroff

1
ฉันทำและพวกเขาให้ฉันลงคะแนนเพียงครั้งเดียว ถ้าฉันสามารถทำเครื่องหมายคำตอบของคุณถูกต้องเช่นเดียวกับของ Khoa ฉันจะ ฉันจะโพสต์ไปรอบ ๆ และดูว่าเราจะได้รับคะแนนเสียงมากขึ้นสำหรับคุณเพราะฉันยังไม่เห็นใครตอบปัญหานี้ได้ทุกที่อื่นและอันนี้เคาะออกสวน
Circlesix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.