По-перше, дуже вдале пояснення від @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 -->