Ürün SKU'sunu başlık mini arabasına alma


10

Ürünü SKUbir Magento 2 sitesinin mini arabasında gösterebilmek istiyorum . Ancak KnockoutJSek ürün bilgilerini almak için nasıl kullanılacağından emin değilim . Aranan şablon burada:

satıcı / Magento / modül-çıkış / görüş / kullanıcı arayüzü / web / şablon / minicart / madde / default.html'dir

Ve şöyle kod içerir:

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

Yani doğrudan sorum şu olurdu: ürün grubunun değerleri nerede ve ürün ayrıntılarını eklemek veya kaldırmak için bunları nasıl değiştirebilirim?

Yanıtlar:


12

Bildiğim kadarıyla, başlık minicart verileri müşteri verilerinden alacak

satıcı / Magento / modül çıkış / görünüşüdür / ön / ağ / js / görünüşüdür / minicart.js

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

Müşteri verilerine bakın js vendor/magento/module-customer/view/frontend/web/js/customer-data.js, müşteri verilerini yerel depolama alanından alabiliriz. Örneğin, tarayıcı konsolunuzda şu satırı çalıştırın:, localStorage.getItem('mage-cache-storage')alışveriş sepeti bilgilerini de alabiliriz. resim açıklamasını buraya girin

{
  "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 adresine gidin.

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(),
           .....
    }

satıcı / Magento / modül çıkış / CustomerData / AbstractItem.php

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

SKU maddesini almak için getItemData()( Eklenti ile denemeliyiz ) veri eklememiz gerektiğini düşünüyorum . Ve sonra html şablonunu geçersiz kılın 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 sürümünü güncelleyin

Magento 2.1.0'da yalnızca geçersiz kılmanız gerekir default.html. Bunun nedeni, yöntemin doGetItemDatazaten ürün sku'suna sahip olmasıdır.


Teşekkür ederim! Bu soru üzerine bir sürü “nasıl yapılır” yazdı!
circlesix

@Khoa TruongDinh harika cevap için teşekkürler. Mükemmel çalışıyor. Bunu, ödeme özeti bölümünde nasıl yapabileceğimizi söyleyebilir misiniz? Çok buldum ama ödeme özeti adı yerine yeni özniteliği eklemek için bir yer alamıyorum.
Rohit Goel

1
Dikkatli olun, yapılandırılabilir ürünleriniz varsa, bu sınıfı da geçersiz kılmanız gerekir: Magento\ConfigurableProduct\CustomerData\ConfigurableItemve gruplandırılmış ürün için:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier

@FranckGarnier Az önce kontrol ettim, bu sınıfları geçersiz kılmamıza gerek yok. Sadece ekleyin !-- ko text: product_sku --><!-- /ko -->, sku yapılandırılabilir ürün için gösterilecektir. Benim Magento versiyonum 2.1.5.
Khoa TruongDinh

1
Product_sku için doğru, ancak yerel olarak mevcut olmayan, bu sınıflar konusunda dikkatli olan ek bilgilere ihtiyacınız varsa, bunun yerine eklentileri kullanmayı deneyin.
Franck Garnier

7

Öncelikle, @Khoa TruongDinh'den miniart şablonunda öğe alma akışı hakkında çok iyi bir açıklama.

ürün ayrıntılarını eklemek veya kaldırmak için bunları nasıl değiştirebilirim?

Miniart şablonunu ürünün özel nitelikleriyle nasıl genişletebileceğinizin bir yolunu buldum. Bunu yapmak için önce DI Tercihleri ile vendor / magento / module-checkout / CustomerData / DefaultItem.php'yi geçersiz kılmanız gerekir

Oluştur app / kod / Satıcı / Modül / etc / di.xml ot geçersiz DefaultItem nesne

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

Ardından doGetItemData () yöntemini geçersiz kılmak için yeni nesne oluşturun ve product_custom_attribute anahtarıyla custom_attribute ekleyin

Dosya: app / code / Tedarikçi / Modül / Tercihler / 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()),
        ];
    }
}

Enjekte ettiğime dikkat edin

\ Magento \ Katalog \ Model \ Ürün $ productModel

custom_attribute'a erişmek için tam ürün verilerini yüklemem gerektiğinden construct yöntemine gidin. Daha iyi bir yol varsa lütfen söyle.

Ve son olarak yeni özelliği

görünümü / kullanıcı arayüzü / web / şablon / minicart / item / default.html'dir:

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

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

Kullanmak 'product_sku' => $this->item->getProduct()->getSku()sku çekmek için çalışır, bu yüzden i \Magento\Catalog\Model\Product $productModelkapmak gerek yok , ben diğer bazı ürün bilgileri kapmak için kullanacaktır. Sonunda tercihi çalıştırdım, bu yüzden yönteminiz bir cazibe gibi çalışıyor!
circlesix

1
Özel özellikler $productModeliçin, ürünü tüm özelliklerle yüklemeniz ve ardından birlikte almanız gerekir $this->helper. Eğer çalışıyorsa cevabımı iptal edebilirsiniz.
Miroslav Petroff

1
Yaptım ve sadece bir kez oy kullanmama izin verdiler. Eğer cevabınızı Khoa kadar doğru olarak işaretleyebilseydim yapardım. Etrafta yayınlayacağım ve sizin için daha fazla oy alabilir miyiz, henüz herhangi bir kişinin bu soruna başka bir yerde cevap verdiğini görüyorum ve bu parktan çıkarıyor.
circlesix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.