So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu

Veröffentlicht: 2020-04-07

Häufig ist in Magento 2 die Anzahl der Standardproduktattribute, die zum Einrichten von Bedingungen verwendet werden können, begrenzt. Zusätzliche Anpassungen wären erforderlich, um die geschäftlichen Anforderungen zu erfüllen.

In diesem Artikel erfahren Sie, wie Sie dies erreichen und benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzufügen.

Anmerkungen:

  1. Sehen Sie sich das vollständige Codebeispiel auf GitHub an.
  2. Der erste Teil des Beispiels, der das Attribut „Volumengewicht“ als Filter zu den Versandkosten hinzufügt, ist hier verfügbar.
  3. Das Originalmodul Magento 2 Shipping Suite Ultimate ist erforderlich.

Lassen Sie uns direkt darüber sprechen, was genau getan werden soll, um das Ziel zu erreichen.

Inhaltsverzeichnis

  • Schritt-für-Schritt-Anleitung zum Hinzufügen benutzerdefinierter Produktattribute
    • Schritt 1. Erstellen Sie ein neues Modul, indem Sie die Basisdateien hinzufügen
    • Schritt 2. Erstellen Sie eine Modulstruktur
    • Schritt 3. Benutzeroberfläche
      • Bilden
      • Netz

Schritt-für-Schritt-Anleitung zum Hinzufügen benutzerdefinierter Produktattribute

Schritt 1. Erstellen Sie ein neues Modul, indem Sie die Basisdateien hinzufügen

Beginnen Sie mit der Benennung des Moduls:

 > app/code/MageWorx/ShippingRateByProductAttribute/registration.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'MageWorx_ShippingRateByProductAttribute', __DIR__ );

Ermitteln und deklarieren Sie dann seine Anforderungen. Sie müssen unserem Modul auch einen Namen für den Komponisten und die Set-Version geben und eine kurze Beschreibung hinzufügen:

 > app/code/MageWorx/ShippingRateByProductAttribute/composer.json { "name": "mageworx/module-shipping-rate-by-product-attribute", "description": "Shipping Rules Extension: Adds product attribute to the Rates", "require": { "magento/module-shipping": ">=100.1.0 < 101", "magento/module-ui": ">=100.1.0 < 102", "mageworx/module-shippingrules": ">=2.7.1" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "MageWorx\\ShippingRateByProductAttribute\\": "" } } }

Außerdem können wir den anfänglichen Namen und die Version in der Magento 2-Konfiguration festlegen und die Sequenz deklarieren:

 > app/code/MageWorx/ShippingRateByProductAttribute/etc/module.xml <?xml version="1.0"?> <!-- /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="MageWorx_ShippingRateByProductAttribute" setup_version="1.0.0"> <sequence> <module name="MageWorx_ShippingRules" /> </sequence> </module> </config>

Schritt 2. Erstellen Sie eine Modulstruktur

Nehmen wir an, wir haben ein Produktattribut namens „shippingnew“, das von der Administratorseite erstellt wurde. Es ist ein Dropdown-Eingabetyp und hat einige Optionen mit den Namen „A, B, C, D“ usw. Diese Optionen beschreiben, wie wir unsere Artikel nach Zonen versenden. Jeder Wert hat seinen eigenen Preis, und Produkte mit dem höchsten Preis ändern die Kosten der Versandmethode während des Bezahlvorgangs.

Zunächst müssen wir eine separate Tabelle für unsere erweiterten Bedingungen für die Versandkosten erstellen. Später werden wir sie mithilfe der regulären Erweiterungsattribute des Modells hinzufügen (das Modell „Shipping Rate“ erweitert `\Magento\Framework\Model\AbstractExtensibleModel` ).

 > app/code/MageWorx/ShippingRateByProductAttribute/Setup/InstallSchema.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Setup; use Magento\Framework\DB\Ddl\Table; use Magento\Framework\Setup\InstallSchemaInterface; use Magento\Framework\Setup\ModuleContextInterface; use Magento\Framework\Setup\SchemaSetupInterface; /** * Class InstallSchema */ class InstallSchema implements InstallSchemaInterface { /** * Installs DB schema for a module * * @param SchemaSetupInterface $setup * @param ModuleContextInterface $context * @return void * @throws \Zend_Db_Exception */ public function install(SchemaSetupInterface $setup, ModuleContextInterface $context) { $installer = $setup; $installer->startSetup(); $ratesTable = $installer->getTable(\MageWorx\ShippingRules\Model\Carrier::RATE_TABLE_NAME); /** * Create table 'mageworx_shippingrules_rates_shippingnew' */ $table = $installer->getConnection()->newTable( $installer->getTable('mageworx_shippingrules_rates_shippingnew') )->addColumn( 'rate_id', Table::TYPE_INTEGER, null, ['unsigned' => true, 'nullable' => false], 'Rate Id' )->addColumn( 'shippingnew', Table::TYPE_TEXT, '120', ['nullable' => false], 'shippingnew attribute value' )->addForeignKey( $installer->getFkName('mageworx_shippingrules_rates_shippingnew', 'rate_id', $ratesTable, 'rate_id'), 'rate_id', $ratesTable, 'rate_id', Table::ACTION_CASCADE )->addIndex( $installer->getIdxName( 'mageworx_shippingrules_rates_product_attributes', ['rate_id', 'shippingnew'], \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE ), ['rate_id', 'shippingnew'], ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE] )->setComment( 'Product Attributes For Shipping Suite Rates' ); $installer->getConnection()->createTable($table); } }

Wir haben unsere Tabelle wie folgt benannt: `'mageworx_shippingrules_rates_shippingnew'`. Es hat nur 2 Spalten. Einer davon wird als Fremdschlüssel verwendet. Es ist die Spalte „rate_id“, die mit der regulären Tabelle „mageworx_shippingrules_rates“ aus dem Modul MageWorx Shipping Suite Ultimate für Magento 2 verknüpft wird. Eine weitere Spalte enthält Werte aus dem Attribut „shippingnew“.

Bevor wir einen Beobachter dazu bringen, unsere benutzerdefinierten Daten in die Tabelle zu laden/zu speichern/zu löschen, müssen wir mindestens zwei Modelle erstellen – ein reguläres Modell und ein Ressourcenmodell.

 > app/code/MageWorx/ShippingRateByProductAttribute/Model/ShippingNew.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Model; use Magento\Framework\Model\AbstractModel; /** * Class ShippingNew */ class ShippingNew extends AbstractModel { /** * Prefix of model events names * * @var string */ protected $_eventPrefix = 'mageworx_shippingnew'; /** * Parameter name in event * * In observe method you can use $observer->getEvent()->getObject() in this case * * @var string */ protected $_eventObject = 'shippingnew'; /** * Set resource model and Id field name * * @return void */ protected function _construct() { parent::_construct(); $this->_init('MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ShippingNew'); $this->setIdFieldName('rate_id'); } }

Anmerkungen:

  1. ` _eventPrefix ` wird verwendet, um unsere Modellereignisse zu erkennen.
  2. `_eventObject` wird verwendet, um Daten im Ereignisobjekt zu speichern. Mit diesem Namen können wir unser Modell aus dem Ereignisobjekt erhalten.
  3. `$this->_init( 'MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ ShippingNew' );` verknüpft unser Modell mit dem entsprechenden Ressourcenmodell.
  4. `$this->setIdFieldName( 'rate_id' );` beschreibt, welches Feld aus der Tabelle als Schlüssel verwendet werden muss (normalerweise nennen wir es id)
 > app/code/MageWorx/ShippingRateByProductAttribute/Model/ResourceModel/ShippingNew.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Model\ResourceModel; use Magento\Framework\Model\ResourceModel\Db\AbstractDb; /** * Class ShippingNew */ class ShippingNew extends AbstractDb { /** * Resource initialization * * @return void */ protected function _construct() { $this->_init('mageworx_shippingrules_rates_shippingnew', 'rate_id'); } /** * @param $rateId * @param int $shippingNew * @return int * @throws \Magento\Framework\Exception\LocalizedException */ public function insertUpdateRecord($rateId, int $shippingNew) { $rowsAffected = $this->getConnection()->insertOnDuplicate( $this->getMainTable(), [ 'rate_id' => $rateId, 'shippingnew' => $shippingNew ] ); return $rowsAffected; } /** * @param $rateId * @return int * @throws \Magento\Framework\Exception\LocalizedException */ public function deleteRecord($rateId) { $rowsAffected = $this->getConnection()->delete( $this->getMainTable(), [ 'rate_id = ?' => $rateId ] ); return $rowsAffected; } }

Anmerkungen:

  1. $this->_init( 'mageworx_shippingrules_rates_shippingnew' , 'rate_id' ); Legen Sie den Haupttabellennamen und den ID-Feldnamen fest.
  2. Die öffentliche Funktion insertUpdateRecord($rateId, int $shippingNew) ist die Methode, die uns helfen könnte, den Attributwert in unserer benutzerdefinierten Tabelle zu aktualisieren.
  3. Die öffentliche Funktion deleteRecord($rateId) dient zum Entfernen der Spalte.

Später werden wir diese Methoden bei unseren Beobachtern anwenden.

Lassen Sie uns nun unsere neuen Daten als Erweiterungsattribut zum Versandtarifmodell hinzufügen:

 > app/code/MageWorx/ShippingRateByProductAttribute/etc/extension_attributes.xml <?xml version="1.0"?> <!-- /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd"> <!-- Rate Extension --> <extension_attributes for="MageWorx\ShippingRules\Api\Data\RateInterface"> <attribute code="shippingnew" type="int"> <join reference_table="mageworx_shippingrules_rates_shippingnew" reference_field="rate_id" join_on_field="rate_id"> <field>shippingnew</field> </join> </attribute> </extension_attributes> </config>

Wir sollten uns auch um den regulären Betrieb unserer benutzerdefinierten Bedingung kümmern:

 > app/code/MageWorx/ShippingRateByProductAttribute/etc/events.xml <?xml version="1.0"?> <!-- /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> <!-- Add Extension Attributes to the Rates Collection --> <!-- Save custom attribute value during rate saving --> <event name="mageworx_shippingrules_rate_save_after"> <observer name="mageworx_save_shippingnew_attribute" instance="MageWorx\ShippingRateByProductAttribute\Observer\SaveShippingNewRateAttribute" /> </event> <!-- Add custom attribute value to the rates collection --> <event name="rates_collection_render_filters_before"> <observer name="mageworx_add_shippingnew_attribute" instance="MageWorx\ShippingRateByProductAttribute\Observer\AddShippingNewToRatesCollection" /> </event> <!-- Take care of filtering the rates grid --> <event name="mageworx_suitable_rates_collection_load_before"> <observer name="mageworx_filter_rates_by_shippingnew_attribute" instance="MageWorx\ShippingRateByProductAttribute\Observer\FilterRatesCollectionByShippingNewAttribute" /> </event> <!-- 3 event observers for the Export/Import rates with custom attribute in conditions --> <event name="mageworx_rates_export_collection_join_linked_tables_after"> <observer name="mageworx_join_shipping_new_table_to_export_rates_collection" instance="MageWorx\ShippingRateByProductAttribute\Observer\JoinShippingNewTableToExportRatesCollection" /> </event> <event name="mageworx_filter_rates_data_before_insert"> <observer name="mageworx_remove_shipping_new_before_insert" instance="MageWorx\ShippingRateByProductAttribute\Observer\RemoveShippingNewBeforeInsert" /> </event> <event name="mageworx_shippingrules_import_insert_rates"> <observer name="mageworx_shippingrules_import_insert_update_shipping_new" instance="MageWorx\ShippingRateByProductAttribute\Observer\InsertUpdateShippingNewDuringImport" /> </event> </config>

Das erste Ereignis dient zum Speichern/Aktualisieren/Löschen des benutzerdefinierten Attributwerts in der Ratenbedingung.

Die zweiten beiden Ereignisse dienen zum Hinzufügen dieses Attributwerts zur Sammlung.

Die letzten drei Ereignisse sind für die Import/Export-Funktionalität.

Lassen Sie uns sie einzeln genauer analysieren:

 > app/code/MageWorx/ShippingRateByProductAttribute/Observer/SaveShippingNewRateAttribute.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; use Magento\Framework\Exception\LocalizedException; use MageWorx\ShippingRules\Api\Data\RateInterface; /** * Class SaveShippingNewRateAttribute * * Saves custom attribute (`shippingnew`) values after model was saved */ class SaveShippingNewRateAttribute implements ObserverInterface { /** * @var \MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ShippingNew */ private $resource; /** * @var \Magento\Framework\Message\ManagerInterface */ private $messagesManager; /** * SaveVolumeWeightRateAttribute constructor. * * @param \MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ShippingNew $resource * @param \Magento\Framework\Message\ManagerInterface $messagesManager */ public function __construct( \MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ShippingNew $resource, \Magento\Framework\Message\ManagerInterface $messagesManager ) { $this->resource = $resource; $this->messagesManager = $messagesManager; } /** * @param Observer $observer * @return void */ public function execute(Observer $observer) { /** @var RateInterface $model */ $model = $observer->getEvent()->getData('rate'); if (!$model instanceof RateInterface) { return; } $shippingNewValue = $model->getData('shippingnew') !== '' ? $model->getData('shippingnew') : null; if ($shippingNewValue === null) { try { $this->resource->deleteRecord($model->getRateId()); } catch (LocalizedException $deleteException) { $this->messagesManager->addErrorMessage( __('Unable to delete the Shipping Category for the Rate %1', $model->getRateId()) ); } } else { try { $this->resource->insertUpdateRecord($model->getRateId(), $shippingNewValue); } catch (LocalizedException $saveException) { $this->messagesManager->addErrorMessage( __('Unable to save the Shipping Category for the Rate %1', $model->getRateId()) ); } } return; } }

So einfach ist das. Wenn wir einen Kurs speichern, müssen wir auch den Wert des benutzerdefinierten Attributs speichern. Falls sein Wert gleich "null" ist, löschen Sie einfach einen Datensatz.

 > app/code/MageWorx/ShippingRateByProductAttribute/Observer/AddShippingNewToRatesCollection.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; /** * Class AddShippingNewToRatesCollection * * Adds custom attribute to the rates collection. * It will be used later during quote validation. */ class AddShippingNewToRatesCollection implements ObserverInterface { /** * Join custom table to the rates collection to obtain the `shippingnew` attribute anywhere in the code. * * @param Observer $observer * @return void */ public function execute(Observer $observer) { /** @var \MageWorx\ShippingRules\Model\ResourceModel\Rate\Collection $collection */ $collection = $observer->getEvent()->getData('collection'); if (!$collection instanceof \MageWorx\ShippingRules\Model\ResourceModel\Rate\Collection) { return; } if ($collection->isLoaded()) { return; } $joinTable = $collection->getTable('mageworx_shippingrules_rates_shippingnew'); $collection->getSelect() ->joinLeft( $joinTable, '`main_table`.`rate_id` = `' . $joinTable . '`.`rate_id`', ['shippingnew'] ); } }

Um die Validierung verfügbar zu machen, wenn ein Kunde zur Kasse oder zur Schätzung der Versandkosten geht, verbinden wir unsere Tabelle mit dem benutzerdefinierten Attribut mit der regulären Tariftabelle.

 > app/code/MageWorx/ShippingRateByProductAttribute/Observer/FilterRatesCollectionByShippingNewAttribute.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Observer; use Magento\Framework\Event\Observer; use Magento\Framework\Event\ObserverInterface; /** * Class FilterRatesCollectionByShippingNewAttribute * * Filter rates collection before we load it by custom attribute: shippingnew. * * For more details * * @see \MageWorx\ShippingRules\Model\Carrier\Artificial::getSuitableRatesAccordingRequest() * */ class FilterRatesCollectionByShippingNewAttribute implements ObserverInterface { /** * @param Observer $observer * @return void */ public function execute(Observer $observer) { /** @var \MageWorx\ShippingRules\Model\ResourceModel\Rate\Collection $collection */ $collection = $observer->getEvent()->getData('rates_collection'); if (!$collection instanceof \MageWorx\ShippingRules\Model\ResourceModel\Rate\Collection) { return; } /** @var \Magento\Quote\Model\Quote\Address\RateRequest $request */ $request = $observer->getEvent()->getData('request'); if (!$request instanceof \Magento\Quote\Model\Quote\Address\RateRequest) { return; } /** @var \Magento\Quote\Model\Quote\Item[] $items */ $items = $request->getAllItems() ?? []; $shippingCategories = []; foreach ($items as $item) { $value = $item->getProduct()->getData('shippingnew'); if ($value !== null) { $shippingCategories[] = $value; } } $shippingCategories = array_unique($shippingCategories); $joinTable = $collection->getTable('mageworx_shippingrules_rates_shippingnew'); $collection->getSelect() ->joinLeft( ['sn' => $joinTable], '`main_table`.`rate_id` = `sn`.`rate_id`', ['shippingnew'] ); $collection->getSelect()->where( "`sn`.`shippingnew` IN (?)", $shippingCategories ); } }

Dies ist der komplizierteste Beobachter in unserem Stack. Es wurde entwickelt, um alle Attributwerte (`$shippingCategories`) aus dem Warenkorb eines Kunden zu sammeln und fügt den Attributwert als Filter zur regulären Preissammlung hinzu (unsere Tabelle ist bereits verbunden). Um es einfach zu halten, habe ich es „Filter“ genannt. Wenn die Arbeit erledigt ist, sieht ein Kunde die tatsächlichen Versandkosten für die aktuellen Warenkorbartikel.

Weitere 3 Ereignisbeobachter dienen zum Hinzufügen und Empfangen benutzerdefinierter Daten während des Exports und Imports von Versandtarifen. Wir überspringen seinen Code im Blogbeitrag, aber er wird im Repository mit dem Quellcode verfügbar sein.


MageWorx Magento 2-Erweiterungen

Schritt 3. Benutzeroberfläche

Es ist an der Zeit, unser Attribut zum Raster und zum Formular der Versandkosten hinzuzufügen.

Bilden

 > app/code/MageWorx/ShippingRateByProductAttribute/view/adminhtml/ui_component/mageworx_shippingrules_rate_form.xml <?xml version="1.0" encoding="UTF-8"?> <!-- /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ --> <form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <fieldset name="conditions"> <field name="shippingnew"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">MageWorx\ShippingRateByProductAttribute\Model\Config\Source\ShippingCategory</item> <item name="config" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Shipping Category</item> <item name="dataType" xsi:type="string">int</item> <item name="formElement" xsi:type="string">select</item> <item name="dataScope" xsi:type="string">shippingnew</item> <item name="source" xsi:type="string">mageworx_shippingrules_rate_form.custom_attributes</item> </item> </argument> </field> </fieldset> </form>

Netz

 > app/code/MageWorx/ShippingRateByProductAttribute/view/adminhtml/ui_component/mageworx_shippingrules_rates_regular_listing.xml <?xml version="1.0"?> <!-- Copyright MageWorx. All rights reserved. See LICENSE.txt for license details. --> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Ui/etc/ui_configuration.xsd"> <columns name="mageworx_shippingrules_rates_columns"> <column name="shippingnew"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">MageWorx\ShippingRateByProductAttribute\Model\Config\Source\ShippingCategory</item> <item name="config" xsi:type="array"> <item name="filter" xsi:type="string">select</item> <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/select</item> <item name="dataType" xsi:type="string">select</item> <item name="label" xsi:type="string" translate="true">Shipping Category</item> <item name="visible" xsi:type="boolean">true</item> <item name="sortOrder" xsi:type="number">40</item> <item name="editor" xsi:type="string">select</item> </item> </argument> </column> </columns> </listing>

Wie Sie sehen können, verwenden wir das benutzerdefinierte Quellmodell in diesen Dateien. Lassen Sie es uns erstellen. Es lädt ein entsprechendes Attribut (`shippingnew`) und gibt uns alle verfügbaren Werte.

 > app/code/MageWorx/ShippingRateByProductAttribute/Model/Config/Source/ShippingCategory.php <?php /** * Copyright MageWorx. All rights reserved. * See LICENSE.txt for license details. */ namespace MageWorx\ShippingRateByProductAttribute\Model\Config\Source; use Magento\Framework\Exception\LocalizedException; /** * Class ShippingCategory * * Obtain options for specified product attribute */ class ShippingCategory extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource { /** * @var \Magento\Catalog\Api\ProductAttributeRepositoryInterface */ protected $productAttributeRepository; /** * @var \Psr\Log\LoggerInterface */ protected $logger; /** * ShippingCategory constructor. * * @param \Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository * @param \Psr\Log\LoggerInterface $logger */ public function __construct( \Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository, \Psr\Log\LoggerInterface $logger ) { $this->productAttributeRepository = $productAttributeRepository; $this->logger = $logger; } /** * @inheritDoc */ public function getAllOptions() { if (empty($this->_options)) { try { /** @var \Magento\Catalog\Api\Data\ProductAttributeInterface $attribute */ $attribute = $this->productAttributeRepository->get('shippingnew'); $this->_options = $attribute->usesSource() ? $attribute->getSource()->getAllOptions() : []; } catch (LocalizedException $localizedException) { $this->logger->critical($localizedException->getLogMessage()); } } return $this->_options; } }

Das Stück Code ist ziemlich einfach. Wir verwenden das Attribute-Repository, um unser Attribut zu laden und dann alle Optionen (Werte) daraus zu beziehen. Denken Sie daran, dass das Attribut mit dem Code „shippingnew“ im Admin-Panel erstellt werden muss und einen Dropdown-Eingabetyp mit vordefinierten Optionen (Werten) haben muss. Sie können dies über das Menü „Shops > Attribute > Produkt“ tun. Vergessen Sie nicht, dieses Attribut zu dem Attributsatz hinzuzufügen, den Sie für die Produkte verwenden.

Wenn alles fertig ist, müssen wir nur noch das Modul aktivieren und das `setup:upgrade` ausführen. Cache wird automatisch gelöscht.

Gehen Sie zum Tarifraster („Shops > Versandkosten“) und Sie sehen die neue Spalte:

So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog

Diese Bedingung ist im Preisformular verfügbar:

So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog

Wenn wir in der entsprechenden Versandart die Einstellung „Preisberechnung mit mehreren Tarifen“ auf „Tarif mit Höchstpreis verwenden“ setzen, wird bei der Versandpreisberechnung der Tarif mit dem höchsten Preis verwendet.

Hier ist ein kleines Beispiel, wie es im Format von Screenshots funktioniert:

  1. Richten Sie Ihre Produkte ein
So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog
  1. Richten Sie die Tarife ein
So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog
  1. Richten Sie den Preisberechnungsalgorithmus ein (im Formular Versandart)
So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog
  1. Überprüfen Sie den Versandpreis für die entsprechende Methode mit ausgewählten Produkten im Warenkorb (im Frontend).
So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog
So fügen Sie benutzerdefinierte Produktattribute als Filter für die Versandkosten hinzu | MageWorx-Blog

Das ist nicht alles, was das Modul Shipping Suite kann. Spielen Sie ruhig mit den Einstellungen, um das gewünschte Ergebnis zu erzielen.

Fragen beantworte ich gerne! Sie können daher gerne Ihre Kommentare in dem dafür vorgesehenen Feld unten hinterlassen.