Come aggiungere un campo personalizzato per i valori delle opzioni nelle opzioni avanzate del prodotto

Pubblicato: 2020-11-20

Dall'articolo precedente, hai imparato come creare campi di opzioni personalizzati Magento. Abbiamo anche scoperto come visualizzare i dati del campo sia nel front-end della pagina del prodotto che nella pagina dell'ordine nel pannello di amministrazione.

Che si fa?

Impariamo come aggiungere lo stesso campo GTIN personalizzato per i valori delle opzioni e visualizzarlo nel front-end della pagina del prodotto.

Sommario

  • Passo 1. Creazione di un nuovo modulo
    • 1. compositore.json
    • 2. ecc/modulo.xml
    • 3. registrazione.php
  • Passo 2. Aggiunta di un nuovo campo al database
  • Passaggio 3. Aggiunta di logica per lavorare con il backend
  • Passaggio 4. Aggiunta dell'impostazione per disabilitare la visualizzazione del campo GTIN per le opzioni avanzate del prodotto Config
  • Passaggio #5. Visualizzazione di un nuovo campo nel front-end della pagina del prodotto

Passo 1. Creazione di un nuovo modulo

Iniziamo con la creazione del nuovo modulo, il cui processo è stato trattato in dettaglio in questo post sul blog di Mageworx.

Quindi, senza ulteriori indugi, ecco il codice di cui avremo bisogno:

1. compositore.json

 { "name": "mageworx/module-optionvaluegtin", "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\\OptionValueGtin\\": "" } } }

2. ecc/modulo.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_OptionValueGtin" setup_version="1.0.0"> <sequence> <module name="Magento_Catalog"/> <module name="MageWorx_OptionBase"/> </sequence> </module> </config>

3. registrazione.php

 <?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'VendorName_OptionValueGtin', __DIR__ );

Passo 2. Aggiunta di un nuovo campo al database

È ora di creare il campo GTIN e aggiungerlo alla tabella corrispondente nel database.

Poiché stiamo aggiungendo un campo per i valori delle opzioni, sarà richiesta la tabella `catalog_product_option_type_value`.

Creiamo il seguente file:

`app/code/VendorName/OptionValueGtin/Setup/InstallSchema.php`

 <?php namespace VendorName\OptionValueGtin\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_type_value'), 'gtin', [ 'type' => Table::TYPE_TEXT, 'nullable' => true, 'default' => null, 'comment' => 'Gtin (added by MageWorx Option Value Gtin)', ] ); $setup->endSetup(); } }

Passaggio 3. Aggiunta di logica per lavorare con il backend

Usa il meccanismo di modifica del pool per aggiungere il campo a Magento all'opzione personalizzata.

Creiamo il seguente file:

`app/code/VendorName/OptionValueGtin/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-value-gtin" xsi:type="array"> <item name="class" xsi:type="string">MageWorx\OptionValueGtin\Ui\DataProvider\Product\Form\Modifier\OptionValueGtin</item> <item name="sortOrder" xsi:type="number">72</item> </item> </argument> </arguments> </virtualType> </config>

Qui:

Aggiungiamo il nostro modificatore al pool generale dell'estensione Advanced Product Options per Magento 2―

`MageWorx\OptionBase\Ui\DataProvider\Product\Form\Modifier\Pool`.

`VendorName\OptionValueGtin\Ui\DataProvider\Product\Form\Modifier\OptionValueGtin` è la classe del modificatore.

Sotto:

Vedi il codice che permette di aggiungere il nostro campo al modulo `app/code/VendorName/OptionValueGtin/Ui/DataProvider/Product/Form/Modifier/OptionValueGtin.php`:

 <?php namespace VendorName\OptionValueGtin\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 OptionValueGtin 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; // Add fields to the values $valueFeaturesFields = $this->getValueFieldsConfig(); $this->meta[$groupCustomOptionsName]['children']['options']['children']['record']['children'] [$optionContainerName]['children']['values']['children']['record']['children'] = array_replace_recursive( $this->meta[$groupCustomOptionsName]['children']['options']['children']['record']['children'] [$optionContainerName]['children']['values']['children']['record']['children'], $valueFeaturesFields ); } /** * The custom option fields config * * @return array */ protected function getValueFieldsConfig() { $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' => 92 ], ], ], ]; } /** * 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; } }

Ora, installa l'estensione e controlla che tutto sia fatto correttamente, ad es.

  • php bin/modulo magento: abilita VendorName_OptionValueGtin
  • php bin/configurazione magento: aggiornamento
  • php bin/magento cache:flush

Come puoi vedere, il campo appena aggiunto viene visualizzato ora:

Come aggiungere campi personalizzati per i prodotti su Magento 2 | Blog di Mageworx

Passaggio 4. Aggiunta dell'impostazione per disabilitare la visualizzazione del campo GTIN per le opzioni avanzate del prodotto Config

Che ne dici di confondere un po' il nostro articolo?

Mi offro di aggiungere alcune nuove funzionalità: la possibilità di abilitare/disabilitare la visualizzazione del campo GTIN per i valori delle opzioni sul front-end della pagina del prodotto.

Dovrai creare il file:

`app/code/VendorName/OptionValueGtin/etc/adminhtml/system.xml`

 <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd"> <system> <tab sortOrder="2001"> <label>MageWorx</label> </tab> <section translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1"> <label><![CDATA[Advanced Product Options]]></label> <tab>mageworx</tab> <resource>VendorName_OptionValueGtin::config_optionvaluegtin</resource> <group translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="1"> <label><![CDATA[Option Value GTIN]]></label> <field translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="1"> <label><![CDATA[Enable Option's Value 'GTIN']]></label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> </group> </section> </system> </config>

Per semplicità:

Aggiungeremo la nuova scheda GTIN Valore opzione alla configurazione della nostra estensione Opzioni prodotto avanzate. Dovresti anche essere in grado di creare una scheda nel tuo modulo.

La nuova classe di supporto dovrebbe essere creata. Lì otterremo i dati sull'impostazione.

Quindi, creiamo e riempiamo la seguente classe:

`app/code/VendorName/OptionValueGtin/Helper/Data.php`

 <?php namespace VendorName\OptionValueGtin\Helper; use Magento\Framework\App\Helper\AbstractHelper; use Magento\Store\Model\ScopeInterface; use Magento\Framework\App\Helper\Context; class Data extends AbstractHelper { const XML_PATH_DEFAULT_OPTION_VALUE_GTIN = 'mageworx_apo/optionvaluegtin/use_optionvaluegtin'; /** * Additional product attributes for product_attributes table * * @var array */ protected $additionalProductAttributes; /** * @param Context $context */ public function __construct( Context $context ) { parent::__construct($context); } /** * Check if option value GTIN enabled * * @param int|null $storeId * @return string */ public function isOptionValueGtinEnabled($storeId = null) { return $this->scopeConfig->getValue( self::XML_PATH_DEFAULT_OPTION_VALUE_GTIN, ScopeInterface::SCOPE_STORE, $storeId ); } }

Non dimenticare di salvare le modifiche e svuotare la cache.

L'impostazione dovrebbe essere visualizzata nel pannello di amministrazione.

Come aggiungere campi personalizzati per i prodotti su Magento 2 | Blog di Mageworx

Passaggio #5. Visualizzazione di un nuovo campo nel front-end della pagina del prodotto

Ricordi di cosa abbiamo parlato nell'articolo precedente?

Abbiamo menzionato che il nostro modulo MageWorx_OptionBase ha già il metodo `getExtendedOptionsConfig()` che raccoglie e visualizza tutti i nostri attributi personalizzati sul front-end tramite blocchi.

Per vedere come viene implementato, apri la classe seguente:

`app/codice/MageWorx/OptionBase/Block/Product/View/Options.php`

Adesso:

Crea un modello con il nostro attributo:

`app/code/VendorName/OptionValueGtin/Model/Attribute/OptionValue/Gtin.php`

 <?php namespace VendorName\OptionValueGtin\Model\Attribute\OptionValue; use MageWorx\OptionBase\Model\Product\Option\AbstractAttribute; class Gtin extends AbstractAttribute { /** * @return string */ public function getName() { return 'gtin'; } }

Tramite l' inserimento delle dipendenze , aggiungi l'attributo al blocco degli attributi generali dell'estensione Opzioni prodotto avanzate e crea il seguente file:

`app/code/VendorName/OptionValueGtin/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\Value\Attributes"> <arguments> <argument name="data" xsi:type="array"> <item name="gtin" xsi:type="object">VendorName\OptionValueGtin\Model\Attribute\OptionValue\Gtin</item> </argument> </arguments> </type> </config>

Adesso:

Crea il nostro nuovo blocco e un modello per esso:

`app/codice/VendorName/OptionValueGtin/Block/ValueGtin.php`

 <?php namespace MageWorx\OptionValueGtin\Block; use Magento\Framework\Json\EncoderInterface; use Magento\Framework\View\Element\Template; use Magento\Framework\View\Element\Template\Context; use MageWorx\OptionValueGtin\Helper\Data as Helper; class ValueGtin extends Template { /** * @var EncoderInterface */ protected $jsonEncoder; /** * @var Helper */ protected $helper; /** * @param Context $context * @param EncoderInterface $jsonEncoder * @param Helper $helper * @param array $data */ public function __construct( Context $context, EncoderInterface $jsonEncoder, Helper $helper, array $data = [] ) { parent::__construct( $context, $data ); $this->jsonEncoder = $jsonEncoder; $this->helper = $helper; } /** * @return string */ public function getJsonData() { $data = [ 'isOptionValueGtinEnabled' => $this->helper->isOptionValueGtinEnabled($this->_storeManager->getStore()) ]; return $this->jsonEncoder->encode($data); } }

Qui, abbiamo ottenuto i dati sull'impostazione dalla classe Helper.

Prossimo:

Usando il metodo `getJsonData()`, eseguiamo il rendering dei dati sul front-end usando il modello che stiamo per creare:

`app/code/VendorName/OptionValueGtin/view/frontend/templates/config.phtml`

 <?php /** @var \VendorName\OptionValueGtin\Block\ValueGtin $block */ ?> <script> require([ 'jquery', 'optionValueGtin', 'uiRegistry' ], function ($, optionValueGtin, registry) { var optionBase = registry.get('mageworxOptionBase'); if (optionBase) { optionBase.addUpdater(7, optionValueGtin(<?= /* @noEscape */ $block->getJsonData() ?>)); } else { var updaters = registry.get('mageworxOptionUpdaters'); if (!updaters) { updaters = {}; } updaters[7] = optionValueGtin(<?= /* @noEscape */ $block->getJsonData() ?>); registry.set('mageworxOptionUpdaters', updaters); } }); </script>

Abbiamo utilizzato il meccanismo dei mixin JavaScript per visualizzare i valori per il campo GTIN .

Qual è il prossimo?

Adottiamo un approccio diverso e creiamo un widget js, che verrà utilizzato per visualizzare i nuovi dati nella pagina del prodotto.

Definisci il nuovo js:

`app/code/VendorName/OptionValueGtin/view/frontend/requirejs-config.js`

 var config = { map: { '*': { optionValueGtin: 'VendorName_OptionValueGtin/js/option-value-gtin' } } };

È giunto il momento di creare il widget stesso. Conterrà tutta la logica nel lavoro con il nuovo attributo sul front-end.

Nel file di esempio, implementiamo la logica di visualizzazione del GTIN per le opzioni select, e per le opzioni radio e check box separatamente.

Queste saranno due logiche diverse poiché la logica nel lavoro e il markup di tali opzioni differiscono l'una dall'altra:

`app/code/VendorName/OptionValueGtin/view/frontend/web/js/option-value-gtin.js`

 define([ 'jquery', 'Magento_Catalog/js/price-utils', 'underscore', 'jquery/ui' ], function ($, utils, _) { 'use strict'; $.widget('mageworx.optionValueGtin', { options: { optionConfig: {} }, /** * * @param optionConfig * @param productConfig * @param base * @param self */ firstRun: function firstRun(optionConfig, productConfig, base, self) { if (parseFloat(this.options.isOptionValueGtinEnabled)) { var extendedOptionsConfig = typeof base.options.extendedOptionsConfig != 'undefined' ? base.options.extendedOptionsConfig : {}; for (var option_id in optionConfig) { if (!optionConfig.hasOwnProperty(option_id)) { continue; } var $option = base.getOptionHtmlById(option_id); this._addValueGtin($option, optionConfig, extendedOptionsConfig); } } }, /** * Add description to the values * @param $option * @param optionConfig * @param extendedOptionsConfig * @private */ _addValueGtin: function _addValueGtin($option, optionConfig, extendedOptionsConfig) { var self = this, $options = $option.find('.product-custom-option'); //selectable options $options.filter('select').each(function (index, element) { var $element = $(element), optionId = utils.findOptionId($element), value = extendedOptionsConfig[optionId]['values']; if ($element.attr('multiple') && !$element.hasClass('mageworx-swatch')) { return; } if (typeof value == 'undefined' || _.isEmpty(value)) { return; } var gtinTitle = 'GTIN: '; var $gtin = $('<div class="option-value-gtin"></div>', { style: 'display: none' }); var $label = $option.find('.control'); $element.parent().prepend($gtin); $element.on('change', function (e) { var valueId = $element.val(); if (!_.isUndefined(value[valueId]) && !_.isEmpty(value[valueId]['gtin']) ) { if ($label.length > 0) { $label .first() .after($gtin.text(gtinTitle + value[valueId]['gtin'])); } $gtin.show(); } else { $gtin.hide(); } }); if ($element.val()) { $element.trigger('change'); } }); $options.filter('input[type="radio"], input[type="checkbox"]').each(function (index, element) { var $element = $(element), optionId = utils.findOptionId($element), value = extendedOptionsConfig[optionId]['values']; if ($element.attr('multiple') && !$element.hasClass('mageworx-swatch')) { return; } if (typeof value == 'undefined' || _.isEmpty(value)) { return; } var gtinTitle = 'GTIN: '; var $gtin = $('<div class="option-value-gtin-redio-check"></div>'); var $label = $option.find('.control'); $element.parent().append($gtin); var valueId = $element.val(); if (!_.isUndefined(value[valueId]) && !_.isEmpty(value[valueId]['gtin'])) { $gtin.text(gtinTitle + value[valueId]['gtin']); } if ($element.val()) { $element.trigger('change'); } }); }, }); return $.mageworx.optionValueGtin; });

Che ne dici di aggiungere alcuni stili?

`app/code/VendorName/OptionValueGtin/view/frontend/web/css/valueGtin.css`

 .option-value-gtin, .option-value-gtin-redio-check { color: #1da0e0; font-weight: 700; margin-top: 5px; } .option-value-gtin-redio-check { display: contents; }

Resta solo da collegare il nostro blocco e gli stili.

Per questo, crea il seguente file:

`app/code/VendorName/OptionValueGtin/view/frontend/layout/catalog_product_view.xml`

 <?xml version="1.0"?> <page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <head> <css src="VendorName_OptionValueGtin::css/valueGtin.css"/> </head> <body> <referenceBlock name="product.info.options.wrapper"> <container name="vendorname.option.value.gtin.container" after="product.info.options"> <block class="VendorName\OptionValueGtin\Block\ValueGtin" name="vendorname.option.value.gtin" template="VendorName_OptionValueGtin::config.phtml"/> </container> </referenceBlock> </body> </page>

Abbiamo quasi finito.

Prima di eseguire il controllo finale, non dimenticare di svuotare la cache e distribuire nuovamente il contenuto statico:

  • php bin/magento cache:flush
  • php bin/magento static-content:deploy

E infine:

Accedi al pannello di amministrazione.

Crea un prodotto con opzioni personalizzate nel prodotto Magento.

Nel nostro esempio, ho aggiunto menu a discesa, campione, radio e casella di controllo.

Non dimenticare di compilare i nostri nuovi campi GTIN per i valori delle opzioni corrispondenti.

Salva il prodotto.

È ora di vedere come appare tutto sul front-end:

Come aggiungere campi personalizzati per i prodotti su Magento 2 | Blog di Mageworx

Cosa ne pensi del risultato?


Condividi il tuo feedback sull'articolo nel campo dei commenti qui sotto. Quanto è stato facile aggiungere campo a Magento alle opzioni personalizzate?

Prenota una demo dal vivo con Mageworx