So fügen Sie benutzerdefinierte Felder zu Optionen in der Erweiterung „Erweiterte Produktoptionen“ hinzu
Veröffentlicht: 2020-09-08In diesem Artikel erfahren Sie, wie Sie ein „GTIN“-Feld für benutzerdefinierte Produktoptionen erstellen, es im Frontend der Produktseite anzeigen und in der Bestellung anzeigen.
Fahren wir ohne weiteres mit den Schritt-für-Schritt-Anleitungen fort.
Inhaltsverzeichnis
- Schritt 1. Neues Modul erstellen
- Schritt 2. Fügen Sie unser neues Feld zur Datenbank hinzu
- Schritt 3. Fügen Sie Logik zum Arbeiten mit dem Backend hinzu
- Schritt 4. Zeigen Sie unser Feld im Front-End der Produktseite an
- Schritt #5. Fügen Sie unsere Attributdaten zu den Bestelldetails in der Datenbank hinzu
- Schritt #6. Daten auf der Bestellseite im Admin-Panel anzeigen
Schritt 1. Neues Modul erstellen
Wie Sie ein Modul erstellen, haben wir in diesem Artikel ausführlich beschrieben. Lassen Sie uns diesen Teil also überspringen und direkt zu dem Code übergehen, den Sie zum Erstellen eines Add-Ons benötigen:
1.composer.json
{ "name": "mageworx/module-optiongtin", "description": "N/A", "require": { "magento/framework" : ">=100.1.0 <101", "magento/module-catalog": ">=101.0.0 <104" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "VendorName\\OptionGtin\\": "" } } }
2.etc/module.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="VendorName_OptionGtin" setup_version="1.0.0"> <sequence> <module name="Magento_Catalog"/> <module name="MageWorx_OptionBase"/> </sequence> </module> </config>
3.registrierung.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'VendorName_OptionGtin', __DIR__ );
Schritt 2. Fügen Sie unser neues Feld zur Datenbank hinzu
Nachdem wir ein leeres Modul erstellt haben, ist es an der Zeit, das neue Feld „GTIN“ zu erstellen und es der Datenbank in der entsprechenden Tabelle hinzuzufügen. Da wir ein Feld für Optionswerte hinzufügen, benötigen wir die Tabelle „catalog_product_option“.
Lassen Sie uns die folgende Datei erstellen:
app/code/VendorName/OptionGtin/Setup/InstallSchema.php
<?php namespace VendorName\OptionGtin\Setup; use Magento\Framework\Setup\InstallSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; use Magento\Framework\DB\Ddl\Table; class InstallSchema implements InstallSchemaInterface { public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) { $setup->startSetup(); $setup->getConnection()->addColumn( $setup->getTable('catalog_product_option'), 'gtin', [ 'type' => Table::TYPE_TEXT, 'nullable' => true, 'default' => null, 'comment' => 'Gtin (added by VendorName Option Gtin)', ] ); $setup->endSetup(); } }
Schritt 3. Fügen Sie Logik zum Arbeiten mit dem Backend hinzu
Wir verwenden den Pool-Modifier-Mechanismus, um unser neues Feld hinzuzufügen.
Fügen Sie nun die folgende Datei hinzu:
app/code/VendorName/OptionGtin/etc/adminhtml/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="MageWorx\OptionBase\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="mageworx-option-gtin" xsi:type="array"> <item name="class" xsi:type="string">VendorName\OptionGtin\Ui\DataProvider\Product\Form\Modifier\OptionGtin</item> <item name="sortOrder" xsi:type="number">72</item> </item> </argument> </arguments> </virtualType> </config>
Hier fügen wir unseren Modifikator dem gemeinsam genutzten Pool der Erweiterung „Erweiterte Produktoptionen“ hinzu – „MageWorx\OptionBase\Ui\DataProvider\Product\Form\Modifier\Pool“. „VendorName\OptionGtin\Ui\DataProvider\Product\Form\Modifier\OptionGtin“ ist unser Klassenmodifikator.
Der Code, der es ermöglicht, unser Feld zum app/code/VendorName/OptionGtin/Ui/DataProvider/Product/Form/Modifier/OptionGtin.php
, ist unten angegeben:
<?php namespace VendorName\OptionGtin\Ui\DataProvider\Product\Form\Modifier; use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier; use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\CustomOptions; use Magento\Ui\Component\Form\Element\Input; use Magento\Ui\Component\Form\Element\DataType\Number; use Magento\Ui\Component\Form\Field; use MageWorx\OptionBase\Ui\DataProvider\Product\Form\Modifier\ModifierInterface; class OptionGtin extends AbstractModifier implements ModifierInterface { /** * @var array */ protected $meta = []; /** * {@inheritdoc} */ public function modifyData(array $data) { return $data; } /** * {@inheritdoc} */ public function modifyMeta(array $meta) { $this->meta = $meta; $this->addFields(); return $this->meta; } /** * Adds fields to the meta-data */ protected function addFields() { $groupCustomOptionsName = CustomOptions::GROUP_CUSTOM_OPTIONS_NAME; $optionContainerName = CustomOptions::CONTAINER_OPTION; $commonOptionContainerName = CustomOptions::CONTAINER_COMMON_NAME; // Add fields to the option $optionFeaturesFields = $this->getOptionGtinFieldsConfig(); $this->meta[$groupCustomOptionsName]['children']['options']['children']['record']['children'] [$optionContainerName]['children'][$commonOptionContainerName]['children'] = array_replace_recursive( $this->meta[$groupCustomOptionsName]['children']['options']['children']['record']['children'] [$optionContainerName]['children'][$commonOptionContainerName]['children'], $optionFeaturesFields ); } /** * The custom option fields config * * @return array */ protected function getOptionGtinFieldsConfig() { $fields['gtin'] = $this->getGtinFieldConfig(); return $fields; } /** * Get gtin field config * * @return array */ protected function getGtinFieldConfig() { return [ 'arguments' => [ 'data' => [ 'config' => [ 'label' => __('GTIN'), 'componentType' => Field::NAME, 'formElement' => Input::NAME, 'dataType' => Number::NAME, 'dataScope' => 'gtin', 'sortOrder' => 65 ], ], ], ]; } /** * Check is current modifier for the product only * * @return bool */ public function isProductScopeOnly() { return false; } /** * Get sort order of modifier to load modifiers in the right order * * @return int */ public function getSortOrder() { return 32; } }
Versuchen wir nun, die Erweiterung zu installieren und zu überprüfen, ob alles angezeigt wird:
- php bin/magento module:enable VendorName_OptionGtin
- php bin/magento setup:upgrade
- php bin/magento cache:flush
Unser neues Feld wurde erfolgreich hinzugefügt:
Schritt 4. Zeigen Sie unser Feld im Front-End der Produktseite an
Die Mageworx Advanced Product Options-Erweiterung hat bereits alles, um Attribute anzuzeigen und mit ihnen zu arbeiten, die unser Modul hinzufügt. Alles, was wir tun müssen, ist das neue Attribut zum freigegebenen Datensatz hinzuzufügen.
Unser Modul MageWorx_OptionBase verwendet bereits die Methode getExtendedOptionsConfig()
. Es sammelt und zeigt alle benutzerdefinierten Attribute in einem Block am Frontend an. Öffnen Sie die Klasse app/code/MageWorx/OptionBase/Block/Product/View/Options.php
, um zu sehen, wie sie implementiert wird.
Beginnen wir mit der Erstellung eines Modells mit unserem Attribut:
app/code/VendorName/OptionGtin/Model/Attriburte/Option/Gtin.php
<?php namespace VendorName\OptionGtin\Model\Attribute\Option; use MageWorx\OptionBase\Model\Product\Option\AbstractAttribute; class Gtin extends AbstractAttribute { /** * @return string */ public function getName() { return 'gtin'; } }
Verwenden Sie nun den „Dependency Injection“-Mechanismus und fügen Sie unser Attribut zum gemeinsam genutzten Attributdatensatz der Erweiterung „Advanced Product Options“ hinzu.
app/code/VendorName/OptionGtin/etc/di.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <!-- Data --> <type name="MageWorx\OptionBase\Model\Product\Option\Attributes"> <arguments> <argument name="data" xsi:type="array"> <item name="gtin" xsi:type="object">VendorName\OptionGtin\Model\Attribute\Option\Gtin</item> </argument> </arguments> </type> </config>
Mit anderen Worten, wenn Sie die MageWorx\OptionBase\Model\Product\Option\Attributes
, werden Sie sehen, dass sie einfach alle Attributobjekte für das freigegebene Dataset sammelt.
Um Daten unseres neuen „GTIN“-Attributs anzuzeigen, haben wir uns entschieden, die Funktion firstrun()
aus app/code/MageWorx/OptionFeatures/view/base/web/js/catalog/product/features.js
. Es hat bereits alle erforderlichen Implementierungen, die am besten zu unserem Beispiel passen. Um zu vermeiden, dass die gesamte Datei überschrieben wird, wenden wir den „JavaScript-Mixins“-Mechanismus an, der uns hilft, nur die notwendige Funktion zu ändern.
Erstellen Sie die folgende Datei und definieren Sie dort unser Mixin: app/code/VendorName/OptionGtin/view/frontend/requirejs-config.js
var config = { config: { mixins: { 'MageWorx_OptionFeatures/js/catalog/product/features': { 'VendorName_OptionGtin/js/catalog/product/features-gtin-mixin' : true } } } };
Hier ist MageWorx_OptionFeatures/js/catalog/product/features
das Stammverzeichnis unserer Datei, deren Methode wir umschreiben müssen. VendorName_OptionGtin/js/catalog/product/features-gtin-mixin
ist die Datei, in der wir die Methode umschreiben werden.
Erstellen wir es also: app/code/VendorName/OptionGtin/view/frontend/web/js/catalog/product/features-gtin-mixin.js
define([ 'jquery', 'jquery/ui', 'mage/utils/wrapper' ], function ($, wrapper) { 'use strict'; return function (widget) { $.widget('mageworx.optionFeatures', widget, { /** * Triggers one time at first run (from base.js) * @param optionConfig * @param productConfig * @param base * @param self */ firstRun: function firstRun(optionConfig, productConfig, base, self) { //shareable link $('#mageworx_shareable_hint_icon').qtip({ content: { text: this.options.shareable_link_hint_text }, style: { classes: 'qtip-light' }, position: { target: false } }); $('#mageworx_shareable_link').on('click', function () { try { self.copyTextToClipboard(self.getShareableLink(base)); $('.mageworx-shareable-link-container').hide(); $('.mageworx-shareable-link-success-container').show(); setTimeout(function () { $('.mageworx-shareable-link-container').show(); $('.mageworx-shareable-link-success-container').hide(); }, 2000); } catch (error) { console.log('Something goes wrong. Unable to copy'); } }); setTimeout(function () { // Qty input $('.mageworx-option-qty').each(function () { $(this).on('change', function () { var optionInput = $("[data-selector='" + $(this).attr('data-parent-selector') + "']"); optionInput.trigger('change'); }); }); }, 500); // Option\Value Description & tooltip var extendedOptionsConfig = typeof base.options.extendedOptionsConfig != 'undefined' ? base.options.extendedOptionsConfig : {}; for (var option_id in optionConfig) { if (!optionConfig.hasOwnProperty(option_id)) { continue; } var description = extendedOptionsConfig[option_id]['description'], gtin = extendedOptionsConfig[option_id]['gtin'], gtinTitle = "Global Trade Item Number: ", $option = base.getOptionHtmlById(option_id); if (1 > $option.length) { console.log('Empty option container for option with id: ' + option_id); continue; } var $label = $option.find('label'); if(gtin != null && gtin.length > 0) { if ($label.length > 0) { $label .first() .after($('<p class="option-gtin-text"><span>' + gtinTitle + '</span>' + gtin + '</p>')); } else { $label = $option.find('span'); $label .first() .parent() .after($('<p class="option-gtin-text"><span>' + gtinTitle + '</span>' + gtin + '</p>')); } } if (this.options.option_description_enabled && !_.isEmpty(extendedOptionsConfig[option_id]['description'])) { if (this.options.option_description_mode == this.options.option_description_modes.tooltip) { var $element = $option.find('label span') .first(); if ($element.length == 0) { $element = $option.find('fieldset legend span') .first(); } $element.css('border-bottom', '1px dotted black'); $element.qtip({ content: { text: description }, style: { classes: 'qtip-light' }, position: { target: false } }); } else if (this.options.option_description_mode == this.options.option_description_modes.text) { if ($label.length > 0) { $label .first() .after($('<p class="option-description-text">' + description + '</p>')); } else { $label = $option.find('span'); $label .first() .parent() .after($('<p class="option-description-text">' + description + '</p>')); } } else { console.log('Unknown option mode'); } } if (this.options.value_description_enabled) { this._addValueDescription($option, optionConfig, extendedOptionsConfig); } } } }); return $.mageworx.optionFeatures; }; });
Im Allgemeinen können wir jetzt die folgenden Befehle ausführen:
- php bin/magento cache:flush
- php bin/magento setup:static-content:deploy (nur für Produktionsmodus)
und sehen, was wir haben. Aber fügen Sie zuerst einige Stile zu unserem neuen Attribut hinzu und lassen Sie es auf dem Frontend gut aussehen.
Erstellen Sie ein Layout und definieren Sie dort unsere neue Styles-Datei: app/code/VendorName/OptionGtin/view/frontend/layout/catalog_product_view.xml
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <head> <css src="VendorName_OptionGtin::css/gtin.css"/> </head> </page>
Es ist an der Zeit, eine Stildatei zu erstellen: app/code/VendorName/OptionGtin/view/frontend/web/css/gtin.css
.option-gtin-text span { color: #6cc308; font-weight: 700; }
Lassen Sie uns nun die zuvor beschriebenen Befehle ausführen und die Ergebnisse überprüfen:
Schritt #5. Fügen Sie unsere Attributdaten zu den Bestelldetails in der Datenbank hinzu
Wenn ein Kunde einen Kauf tätigt, wird eine Bestellung erstellt. Details zu den hinzugefügten Artikeln werden in die Tabelle sales_order_item
. Diese Tabelle enthält das Feld product_options
, das Informationen zu den ausgewählten Parametern eines hinzugefügten Artikels enthält. Dort sollten wir die Daten unseres neuen Attributs hinzufügen.
Wenn eine Bestellung erstellt wird, wird das Ereignis sales_quote_address_collect_totals_before
ausgelöst. Wir werden es verwenden, um unsere Daten zu Produktoptionen hinzuzufügen.
Lassen Sie uns das Ereignis definieren, indem Sie Folgendes erstellen: app/code/VendorName/OptionGtin/etc/events.xml
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <event name="sales_quote_address_collect_totals_before"> <observer name="mageworx_optiongtin_add_gtin_to_order" instance="VendorName\OptionGtin\Observer\AddGtinToOrder" /> </event> </config>
Erstellen Sie dann unseren Beobachter: app/code/VendorName/OptionGtin/Observer/AddGtinToOrder.php
<?php namespace VendorName\OptionGtin\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Catalog\Model\ProductRepository as ProductRepository; use MageWorx\OptionBase\Helper\Data as BaseHelper; class AddGtinToOrder implements ObserverInterface { /** * @var BaseHelper */ protected $baseHelper; protected $productRepository; /** * AddGtinToOrder constructor. * @param BaseHelper $baseHelper * @param ProductRepository $productRepository */ public function __construct( BaseHelper $baseHelper, ProductRepository $productRepository ) { $this->baseHelper = $baseHelper; $this->productRepository = $productRepository; } /** * Add product to quote action * Processing: gtin * * @param Observer $observer * @return $this */ public function execute(Observer $observer) { $quoteItems = $observer->getQuote()->getAllItems(); /** @var \Magento\Quote\Model\Quote\Item $quoteItem */ foreach ($quoteItems as $quoteItem) { $buyRequest = $quoteItem->getBuyRequest(); $optionIds = array_keys($buyRequest->getOptions()); $productOptions = $this->productRepository->getById($buyRequest->getProduct())->getOptions(); $quoteItemOptionGtins = []; $optionGtins = []; foreach ($productOptions as $option) { if ($option->getGtin()) { $quoteItemOptionGtins[$option->getOptionId()] = $option->getGtin(); } } foreach ($optionIds as $optionId) { $optionGtins[$optionId] = $optionId; } $optionGtins = array_intersect_key($quoteItemOptionGtins, $optionGtins); $infoBuyRequest = $quoteItem->getOptionByCode('info_buyRequest'); $buyRequest->setData('gtin', $optionGtins); $infoBuyRequest->setValue($this->baseHelper->encodeBuyRequestValue($buyRequest->getData())); $quoteItem->addOption($infoBuyRequest); } } }
Hier holen wir uns mit Hilfe des Observers die Liste aller Artikel der Bestellung und fügen die Daten unseres Attributs „GTIN“ dem sogenannten $infoBuyRequest
.
Um zu überprüfen, ob alles korrekt durchgeführt wurde, erstellen Sie eine Bestellung mit dem Produkt, dessen Optionen „GTIN“-Daten haben. Sie können überprüfen, ob die Daten in der sales_order_item table
sales_order_item der Datenbank -> Feld product_options
wurden:
Schritt #6. Daten auf der Bestellseite im Admin-Panel anzeigen
Es gibt verschiedene Möglichkeiten, die erforderlichen Informationen in der fertigen Vorlage anzuzeigen. Verwenden Sie zum Beispiel „js“. Wir haben in diesem Artikel mit „js“ gearbeitet. Arbeiten wir zur Abwechslung mal mit den Templates selbst und versuchen sie neu zu schreiben!
Ändern Sie die zuvor erstellte app/code/VendorName/OptionGtin/etc/adminhtml/di.xml
, indem Sie dort das Plugin hinzufügen:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <virtualType name="MageWorx\OptionBase\Ui\DataProvider\Product\Form\Modifier\Pool"> <arguments> <argument name="modifiers" xsi:type="array"> <item name="mageworx-option-gtin" xsi:type="array"> <item name="class" xsi:type="string">VendorName\OptionGtin\Ui\DataProvider\Product\Form\Modifier\OptionGtin</item> <item name="sortOrder" xsi:type="number">72</item> </item> </argument> </arguments> </virtualType> <!-- Plugins--> <type name="Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn"> <plugin name="mageworx-optiongtin-add-default-column" type="VendorName\OptionGtin\Plugin\AddDefaultColumn" sortOrder="5" disabled="false" /> </type> </config>
Erstellen Sie das Plugin selbst:
app/code/VendorName/OptionGtin/Plugin/AddDefaultColumn.php
<?php namespace VendorName\OptionGtin\Plugin; class AddDefaultColumn { /** * @param \Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn $subject * @param $result * @return array */ public function afterGetOrderOptions(\Magento\Sales\Block\Adminhtml\Items\Column\DefaultColumn $subject, $result) { if ($options = $subject->getItem()->getProductOptions()) { if (isset($result)) { foreach ($result as &$option) { if (array_key_exists($option['option_id'], $options['info_buyRequest']['gtin'])) { $option['gtin'] = $options['info_buyRequest']['gtin'][$option['option_id']]; } } } } return $result; } }
Dieses Plugin fügt Informationen über unser neues Attribut für Bestelloptionen hinzu, für die diese Daten vorhanden sind.
vendor/magento/module-sales/view/adminhtml/templates/items/column/name.phtml
ist verantwortlich für die Anzeige von Informationen zu Produktoptionen auf der Bestellseite im Admin-Panel.
Lassen Sie uns es umschreiben, um unsere „GTIN“ anzuzeigen. Dazu müssen wir den Block „column_name“ bzw. seine Vorlage umschreiben. Erstellen Sie ein Layout und eine Vorlage:
app/code/VendorName/OptionGtin/view/adminhtml/layout/sales_order_view.xml
<?xml version="1.0"?> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <body> <referenceBlock name="column_name"> <action method="setTemplate"> <argument name="template" xsi:type="string">VendorName_OptionGtin::items/column/name.phtml</argument> </action> </referenceBlock> </body> </page>
app/code/VendorName/OptionGtin/view/adminhtml/templates/items/column/name.phtml
<?php /* @var $block \Magento\Sales\Block\Adminhtml\Items\Column\Name */ ?> <?php if ($_item = $block->getItem()) : ?> <div class="product-title"> <?= $block->escapeHtml($_item->getName()) ?> </div> <div class="product-sku-block"> <span><?= $block->escapeHtml(__('SKU'))?>:</span> <?= /* @noEscape */ implode('<br />', $this->helper(\Magento\Catalog\Helper\Data::class)->splitSku($block->escapeHtml($block->getSku()))) ?> </div> <?php if ($block->getOrderOptions()) : ?> <dl class="item-options"> <?php foreach ($block->getOrderOptions() as $_option) : ?> <dt><?= $block->escapeHtml($_option['label']) ?>:</dt> <dd> <?php if (isset($_option['custom_view']) && $_option['custom_view']) : ?> <?= /* @noEscape */ $block->getCustomizedOptionValue($_option) ?> <?php else : ?> <?php $optionValue = $block->getFormattedOption($_option['value']); ?> <?php $dots = 'dots' . uniqid(); ?> <?php $ . uniqid(); ?> <?= $block->escapeHtml($optionValue['value'], ['a', 'br']) ?><?php if (isset($optionValue['remainder']) && $optionValue['remainder']) : ?> <span> ...</span> <span><?= $block->escapeHtml($optionValue['remainder'], ['a']) ?></span> <script> require(['prototype'], function() { $('<?= /* @noEscape */ $id; ?>').hide(); $('<?= /* @noEscape */ $id; ?>').up().observe('mouseover', function(){$('<?= /* @noEscape */ $id; ?>').show();}); $('<?= /* @noEscape */ $id; ?>').up().observe('mouseover', function(){$('<?= /* @noEscape */ $dots; ?>').hide();}); $('<?= /* @noEscape */ $id; ?>').up().observe('mouseout', function(){$('<?= /* @noEscape */ $id; ?>').hide();}); $('<?= /* @noEscape */ $id; ?>').up().observe('mouseout', function(){$('<?= /* @noEscape */ $dots; ?>').show();}); }); </script> <?php endif; ?> <?php endif; ?> </dd> <dt> <?php if (isset($_option['gtin']) && $_option['gtin']) : ?> <span>GTIN:</span> <?php endif; ?> </dt> <dd> <?php if (isset($_option['gtin']) && $_option['gtin']) : ?> <span> <?= $block->escapeHtml($_option['gtin']) ?></span> <?php endif; ?> </dd> <?php endforeach; ?> </dl> <?php endif; ?> <?= $block->escapeHtml($_item->getDescription()) ?> <?php endif; ?>
Wenn alles korrekt durchgeführt, gelöscht und kompiliert wurde, sehen Sie folgendes Ergebnis:
Wir hoffen, dass Sie diesen Artikel hilfreich finden. Sollten Sie Schwierigkeiten oder Probleme haben, teilen Sie uns dies bitte im Kommentarfeld unten mit.