在抬头微型购物车中获取产品SKU


10

我希望能够SKU在Magento 2网站的微型购物车中展示该产品。但是我不确定如何使用KnockoutJS其他产品信息。被调用的模板在这里:

vendor / magento / module-checkout / view / frontend / web / template / minicart / item / 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>

所以我的直接问题是:产品集的值在哪里?如何更改它们以添加或删除产品详细信息?

Answers:


12

据我所知,header minicart将从客户数据中获取数据

供应商/ magento /模块结帐/视图/前端/ web / js /视图/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
      }
    ],
    .......
  }
}

导航到 vendor / 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(),
           .....
    }

供应商/ magento /模块结帐/CustomerData/AbstractItem.php

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

为了获得SKU项,我认为我们需要向中添加数据getItemData()(应该尝试使用Plugin)。然后覆盖模板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。


谢谢!在这个问题上填写了大量的“方法”!
circleix

@Khoa TruongDinh感谢您的出色回答。这很完美。您能否在“结帐摘要”部分中告诉我我们该如何做?我发现了很多东西,但无法在结帐摘要中找到添加新属性而不是名称的位置。
罗希特·戈尔

1
请注意,如果您具有可配置的产品,则还需要覆盖此类:Magento\ConfigurableProduct\CustomerData\ConfigurableItem对于分组产品:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier

我刚刚检查过的@FranckGarnier似乎我们不需要重写这些类。仅添加!-- ko text: product_sku --><!-- /ko -->,将显示可配置产品的sku。我的Magento版本是2.1.5。
Khoa TruongDinh'4

1
适用于product_sku,但如果需要添加本机不存在的其他信息,请注意这些类,请尝试使用插件。
Franck Garnier

7

首先,@ Khoa TruongDinh很好地解释了在微型购物车模板中获取商品的流程。

如何更改它们以添加或删除产品详细信息?

我找到了一种方法,可以使用产品的自定义属性扩展minicart模板。为此,您首先需要使用DI首选项覆盖vendor / magento / module-checkout / CustomerData / DefaultItem.php

创建应用程序/代码/供应商/模块/etc/di.xml或覆盖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

文件:app /代码/供应商/模块/首选项/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抓住它,但我将使用它来抓住其他产品信息。我终于启动并运行了该首选项,因此您的方法确实可以发挥作用!
circleix

1
对于自定义属性,您需要$productModel使用所有属性加载产品,然后使用进行检索$this->helper。如果工作正常,您可以投票支持我的答案。
米罗斯拉夫·彼得罗夫

1
我做到了,他们只让我投票一次。如果我能像科阿那样将您的答案标记为正确的话,我也会。我将在附近发布消息,看看我们是否能为您获得更多选票,因为我还没有看到任何人在其他任何地方回答过这个问题,而这个问题把它淘汰了。
circleix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.