Отримання 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>

Тож моїм прямим питанням було б: де значень для набору продуктів і як я можу їх змінити, щоб додати або видалити деталі продукту?

Відповіді:


12

Наскільки мені відомо, міні-заголовок отримає дані з даних клієнтів

vendor / magento / module-checkout / view / 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');
    ......
}

Погляньте на дані клієнтів 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 / модуль-замовлення / 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 дякую за чудову відповідь. Це працює ідеально. Скажіть, будь ласка, як ми можемо це зробити у розділі підсумків оформлення замовлення. Я знайшов багато, але не можу знайти місце, куди слід додати новий атрибут замість імені у підсумку оформлення замовлення.
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, але якщо вам потрібно додати додаткову інформацію, яка не присутня в оригіналі, уважно ставтесь до цих класів, спробуйте використовувати додатки.
Франк Гарньє

7

По-перше, дуже вдале пояснення від @Khoa TruongDinh про потік отримання елемента в шаблоні minicart.

як я можу їх змінити, щоб додати або видалити деталі продукту?

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

Створіть додаток / код / ​​Постачальник / Модуль / тощо / 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

Файл: додаток / код / ​​постачальник / модуль / налаштування / 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 \ Каталог \ Модель \ Продукт $ productModel

до методу конструювання, оскільки мені потрібно завантажити повні дані про продукт, щоб отримати доступ до свого custom_attribute. Якщо є кращий спосіб, будь ласка, скажіть мені.

І нарешті ви можете відобразити новий атрибут в

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

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

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

Використання 'product_sku' => $this->item->getProduct()->getSku()працює за те, щоб тягнути в череп, тому, хоча мені не потрібно, \Magento\Catalog\Model\Product $productModelщоб схопити це, я буду використовувати його, щоб захопити іншу інформацію про продукт. Нарешті я отримав перевагу і працював, тож ваш метод працює як шарм!
circleix

1
Для спеціальних атрибутів потрібно $productModelзавантажити продукт з усіма атрибутами, а потім отримати їх $this->helper. Якщо це працює, ви можете підтримати мою відповідь.
Мирослав Петрофф

1
Я це зробив, і вони дали мені лише один раз проголосувати. Якби я міг позначити Вашу відповідь правильною, а також Хоа, я б. Я опублікую повідомлення і побачу, чи зможемо ми отримати більше голосів за вас, так як я ще не бачив жодного відповіді на цю проблему деінде, і цей вибиває його з парку.
circleix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.