Получение товара 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>

Поэтому мой прямой вопрос будет таким: где значения для набора продуктов и как я могу изменить их, чтобы добавить или удалить сведения о продукте?

circlesix
источник

Ответы:

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');
    ......
}

Посмотрите данные о клиентах 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(),
           .....
    }

продавец / 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уже имеет товарный код.

Хоа ТруонгДинь
источник
Спасибо! Заполнено тонна «хау» по этому вопросу!
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
1
Подходит для product_sku, но если вам нужно добавить дополнительную информацию, отсутствующую в нативе, будьте осторожны с этими классами, попробуйте вместо этого использовать плагины.
Франк Гарнье
7

Во-первых, очень хорошее объяснение от @Khoa TruongDinh о том, как получить элемент в шаблоне мини-карты.

как я могу изменить их, чтобы добавить или удалить информацию о продукте?

Я нашел способ, как можно расширить шаблон миникарты с помощью пользовательских атрибутов продукта. Для этого сначала нужно переопределить vendor / magento / module-checkout / CustomerData / DefaultItem.php с настройками DI

Создать приложение / код / ​​поставщик / модуль / 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 / code / Vendor / Module / Preferences / 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 \ Каталог \ Модель \ 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