Erstens eine sehr gute Erklärung von @Khoa TruongDinh über den Ablauf des Abrufens von Elementen in einer Minicart-Vorlage.
Wie kann ich sie ändern, um Produktdetails hinzuzufügen oder zu entfernen?
Ich habe einen Weg gefunden, wie Sie die Minicart-Vorlage mit benutzerdefinierten Attributen des Produkts erweitern können. Dazu müssen Sie zuerst vendor / magento / module-checkout / CustomerData / DefaultItem.php mit den DI-Einstellungen überschreiben
Erstellen Sie app / code / Vendor / Module / etc / di.xml, um das DefaultItem-Objekt zu überschreiben
<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>
Erstellen Sie dann ein neues Objekt, um die Methode doGetItemData () zu überschreiben, und fügen Sie custom_attribute mit dem Schlüssel product_custom_attribute hinzu
Datei: 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()),
];
}
}
Beachten Sie, dass ich spritze
\ Magento \ Catalog \ Model \ Product $ productModel
auf die Konstruktmethode, da ich vollständige Produktdaten laden muss, um auf mein custom_attribute zuzugreifen. Wenn es einen besseren Weg gibt, sag es mir bitte.
Und schließlich können Sie das neue Attribut in anzeigen
view / frontend / web / template / minicart / item / default.html:
<div class="product-item-details">
<!-- ko text: product_custom_attribute --><!-- /ko -->