Lấy SKU sản phẩm trong giỏ hàng nhỏ tiêu đề


10

Tôi muốn có thể hiển thị sản phẩm SKUtrong giỏ hàng nhỏ của trang web Magento 2. Nhưng tôi không chắc cách sử dụng KnockoutJSđể lấy thêm thông tin sản phẩm. Mẫu đang được gọi là ở đây:

nhà cung cấp / magento / kiểm tra mô-đun / xem / frontend / web / template / minicart / item / default.html

Và chứa mã như:

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

Vì vậy, câu hỏi trực tiếp của tôi sẽ là: các giá trị cho bộ sản phẩm ở đâu và làm cách nào tôi có thể thay đổi chúng xung quanh để thêm hoặc xóa chi tiết sản phẩm?

Câu trả lời:


12

Theo tôi biết, minicart tiêu đề sẽ lấy dữ liệu từ dữ liệu khách hàng

nhà cung cấp / magento / kiểm tra mô-đun / xem / frontend / web / 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');
    ......
}

Nhìn vào dữ liệu khách hàng js vendor/magento/module-customer/view/frontend/web/js/customer-data.js, chúng tôi có thể lấy dữ liệu khách hàng từ bộ nhớ cục bộ. Ví dụ: trong bảng điều khiển trình duyệt của bạn, hãy chạy dòng : localStorage.getItem('mage-cache-storage'), chúng tôi cũng có thể lấy thông tin giỏ hàng. nhập mô tả hình ảnh ở đây

{
  "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
      }
    ],
    .......
  }
}

Điều hướng đến nhà cung cấp / magento / kiểm tra mô-đun / 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(),
           .....
    }

nhà cung cấp / magento / kiểm tra mô-đun / CustomerData / AbstractItem.php

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

Để có được mục SKU, tôi nghĩ rằng chúng ta cần thêm dữ liệu vào getItemData()(Nên thử với Plugin ). Và sau đó ghi đè lên mẫu html vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html

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

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

Cập nhật phiên bản Magento 2.1.0

Trong Magento 2.1.0, bạn chỉ cần ghi đè default.html. Điều này là do phương pháp doGetItemDatađã có sản phẩm sku.


Cảm ơn bạn! Điền vào một tấn 'hows' cho câu hỏi này!
circleix

@Khoa TruongDinh cảm ơn câu trả lời tuyệt vời. Điều này hoạt động hoàn hảo. Bạn có thể vui lòng cho tôi biết làm thế nào chúng ta có thể làm điều này tương tự trong phần tóm tắt thanh toán. Tôi đã tìm thấy rất nhiều nhưng không thể có được một vị trí để thêm thuộc tính mới thay vì tên trong bản tóm tắt thanh toán.
Rohit Goel

1
Hãy cẩn thận, nếu bạn có các sản phẩm có thể định cấu hình, bạn cũng cần ghi đè lớp này: Magento\ConfigurableProduct\CustomerData\ConfigurableItemvà đối với sản phẩm được nhóm:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier

@FranckGarnier Tôi vừa kiểm tra dường như chúng ta không cần ghi đè các lớp này. Chỉ thêm !-- ko text: product_sku --><!-- /ko -->, sku sẽ hiển thị cho sản phẩm cấu hình. Phiên bản Magento của tôi là 2.1.5.
Khoa TruongDinh

1
Đúng cho sản phẩm_sku, nhưng nếu bạn cần thêm thông tin bổ sung không có mặt, hãy cẩn thận về các lớp này, thay vào đó hãy thử sử dụng plugin.
Franck Garnier

7

Thứ nhất, lời giải thích rất hay từ @Khoa TruongDinh về dòng nhận vật phẩm trong mẫu minicart.

Làm cách nào để thay đổi chúng xung quanh để thêm hoặc xóa chi tiết sản phẩm?

Tôi đã tìm thấy một cách làm thế nào bạn có thể mở rộng mẫu minicart với các thuộc tính tùy chỉnh của sản phẩm. Để làm điều đó trước tiên, bạn cần ghi đè nhà cung cấp / magento / kiểm tra mô-đun / CustomerData / DefaultItem.php bằng DI Preferences

Tạo ứng dụng / mã / Nhà cung cấp / Mô-đun / etc / di.xml ot ghi đè đối tượng 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>

Sau đó tạo ra đối tượng mới để ghi đè doGetItemData () phương pháp và add custom_attribute với phím product_custom_attribute

Tệp: ứng dụng / mã / Nhà cung cấp / Mô-đun / Tùy chọn / 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()),
        ];
    }
}

Lưu ý rằng tôi đang tiêm

\ Magento \ Catalog \ Model \ Product $ sản phẩmModel

đến phương thức xây dựng vì tôi cần tải dữ liệu sản phẩm đầy đủ để truy cập custom_attribution của mình. Nếu có một cách tốt hơn xin vui lòng cho tôi biết.

Và cuối cùng bạn có thể hiển thị thuộc tính mới trong

xem / frontend / web / template / minicart / item / default.html:

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

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

Sử dụng 'product_sku' => $this->item->getProduct()->getSku()không có tác dụng để kéo sku, vì vậy trong khi tôi không cần phải \Magento\Catalog\Model\Product $productModellấy nó, tôi sẽ sử dụng nó để lấy một số thông tin sản phẩm khác. Cuối cùng tôi đã có sự ưu tiên và chạy, vì vậy phương pháp của bạn hoạt động như một cơ duyên!
circleix

1
Đối với các thuộc tính tùy chỉnh, bạn cần $productModeltải sản phẩm với tất cả các thuộc tính và sau đó truy xuất chúng với $this->helper. Nếu nó hoạt động bạn có thể nâng cao câu trả lời của tôi.
Miroslav Petroff

1
Tôi đã làm, và họ chỉ cho tôi bỏ phiếu một lần. Nếu tôi có thể đánh dấu câu trả lời của bạn là chính xác như tôi sẽ làm. Tôi sẽ đăng xung quanh và xem liệu chúng tôi có thể nhận được nhiều phiếu bầu hơn cho bạn không, vì tôi vẫn chưa thấy ai trả lời vấn đề này ở bất kỳ nơi nào khác và điều này đánh bật nó ra khỏi công viên.
circleix
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.