Jak dodać niestandardowy atrybut produktu jako filtr stawek wysyłki
Opublikowany: 2020-04-07Często w Magento 2 liczba standardowych atrybutów produktu, które można wykorzystać do ustawienia warunków, jest ograniczona. Wymagane byłoby dodatkowe dostosowanie do potrzeb biznesowych.
Z tego artykułu dowiesz się, jak to osiągnąć i dodać niestandardowe atrybuty produktu jako filtr kosztów dostawy.
Uwagi:
- Zobacz pełny przykład kodu w serwisie GitHub.
- Pierwsza część przykładu, w której atrybut „Waga wolumenu” jest dodawany jako filtr do kosztów dostawy, jest dostępna tutaj.
- Wymagany jest oryginalny moduł Magento 2 Shipping Suite Ultimate.
Przejdźmy od razu do omówienia, co dokładnie należy zrobić, aby osiągnąć cel.
Spis treści
- Przewodnik krok po kroku dotyczący dodawania niestandardowego atrybutu produktu
- Krok 1. Utwórz nowy moduł, dodając pliki podstawowe
- Krok 2. Utwórz strukturę modułu
- Krok 3. Interfejs użytkownika
- Formularz
- Krata
Przewodnik krok po kroku dotyczący dodawania niestandardowego atrybutu produktu
Krok 1. Utwórz nowy moduł, dodając pliki podstawowe
Zacznij od nazwania modułu:
> 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__ );
Następnie wykryj i zadeklaruj jego wymagania. Będziesz także musiał nadać naszemu modułowi nazwę dla kompozytora, ustawić wersję i dodać krótki opis:
> 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\\": "" } } }
Dalej możemy ustawić początkową nazwę i wersję w konfiguracji Magento 2, zadeklarować sekwencję:
> 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>
Krok 2. Utwórz strukturę modułu
Załóżmy, że mamy atrybut produktu o nazwie „shippingnew”, który został utworzony po stronie administratora. Jest to rozwijany typ danych wejściowych i ma kilka opcji o nazwach 'A, B, C, D', itp. Te opcje opisują, w jaki sposób wysyłamy nasze przedmioty według stref. Każda wartość ma swoją własną cenę, a produkty o najwyższej cenie modyfikują koszt metody wysyłki podczas realizacji transakcji.
Przede wszystkim musimy stworzyć osobną tabelę dla naszych rozszerzonych warunków wysyłki. Później dodamy je za pomocą zwykłych atrybutów rozszerzeń modelu (model 'Shipping Rate' rozszerza `\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); } }
Nazwaliśmy naszą tabelę w następujący sposób: `'mageworx_shippingrules_rates_shippingnew'`. Ma tylko 2 kolumny. Jeden z nich służy jako klucz obcy. Jest to kolumna `rate_id`, która zostanie połączona ze zwykłą tabelą `mageworx_shippingrules_rates` z modułu MageWorx Shipping Suite Ultimate dla Magento 2. Kolejna kolumna będzie zawierała wartości z atrybutu `shippingnew`.
Zanim obserwator załaduje/zapisze/usunie nasze niestandardowe dane do tabeli, musimy utworzyć co najmniej dwa modele — model zwykły i model zasobów.
> 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'); } }
Uwagi:
- ` _eventPrefix ` będzie używany do wykrywania zdarzeń naszego modelu.
- `_eventObject` będzie używany do przechowywania danych w obiekcie zdarzenia. Używając tej nazwy możemy uzyskać nasz model z obiektu zdarzenia.
- `$this->_init( 'MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ ShippingNew' );` łączy nasz model z odpowiednim modelem zasobów.
- `$this->setIdFieldName( 'rate_id' );` opisuje, które pole z tabeli musi być użyte jako klucz (zazwyczaj nazywamy to 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; } }
Uwagi:
- $this->_init( 'mageworx_shippingrules_rates_shippingnew' , 'rate_id' ); ustaw nazwę głównej tabeli i nazwę pola identyfikatora.
- public function insertUpdateRecord($rateId, int $shippingNew) jest metodą, która może pomóc nam zaktualizować wartość atrybutu w naszej niestandardowej tabeli.
- public funkcja deleteRecord($rateId) służy do usuwania kolumny.
Później zastosujemy te metody u naszych obserwatorów.
Teraz dodajmy nasze nowe dane jako atrybut rozszerzenia do modelu kosztów dostawy:
> 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>
Powinniśmy również zadbać o regularne operacje naszej niestandardowej kondycji:
> 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>
Pierwsze zdarzenie dotyczy zapisania/aktualizacji/usunięcia wartości atrybutu niestandardowego w warunku stawki.
Drugie dwa zdarzenia służą do dodania tej wartości atrybutu do kolekcji.
Ostatnie trzy zdarzenia dotyczą funkcji importu/eksportu.
Przeanalizujmy je jeden po drugim bardziej szczegółowo:
> 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; } }
To takie proste. Gdy zapisujemy stawkę, musimy zadbać również o zapisanie wartości atrybutu niestandardowego. W przypadku, gdy jego wartość jest równa „null”, po prostu usuń rekord.
> 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'] ); } }
Aby umożliwić walidację, gdy klient przechodzi do kasy lub szacowania kosztów wysyłki, dołączmy naszą tabelę z niestandardowym atrybutem do tabeli stawek regularnych.
> 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 ); } }
To najbardziej skomplikowany obserwator w naszym stosie. Służy do zbierania wszystkich wartości atrybutów (`$shippingCategories`) z koszyka klienta i dodaje wartość atrybutu jako filtr do kolekcji stawek regularnych (nasza tabela jest już połączona). Aby to uprościć, nazwałem go „Filtr”. Po zakończeniu pracy klient zobaczy rzeczywiste stawki wysyłki dla bieżących pozycji koszyka.
Kolejne 3 obserwatorów zdarzeń są przeznaczone do dodawania i odbierania niestandardowych danych podczas eksportu i importu stawek wysyłki. Pomijamy jego kod w poście na blogu, ale będzie on dostępny w repozytorium z kodem źródłowym.
Krok 3. Interfejs użytkownika
Czas dodać nasz atrybut do siatki i do postaci stawek za wysyłkę.
Formularz
> 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>
Krata
> 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>
Jak widać, w tych plikach używamy niestandardowego modelu źródłowego. Stwórzmy to. Załaduje odpowiedni atrybut („shippingnew”) i poda nam wszystkie dostępne wartości.
> 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; } }
Ten fragment kodu jest dość prosty. Używamy repozytorium atrybutów, aby załadować nasz atrybut, a następnie uzyskać z niego wszystkie opcje (wartości). Pamiętaj, że atrybut z kodem `shippingnew` musi być utworzony w panelu administracyjnym i musi mieć rozwijany typ danych wejściowych z predefiniowanymi opcjami (wartościami). Możesz to zrobić z menu „Sklepy > Atrybuty > Produkt”. Nie zapomnij dodać tego atrybutu do zestawu atrybutów, którego używasz dla produktów.
Kiedy wszystko jest zrobione, wystarczy włączyć moduł i uruchomić `setup:upgrade`. Pamięć podręczna zostanie automatycznie wyczyszczona.
Przejdź do siatki stawek („Sklepy > Stawki wysyłki”), a zobaczysz nową kolumnę:
Warunek ten będzie dostępny w formularzu stawek:
Jeśli ustawimy opcję „Obliczanie ceny dla wielu stawek” na „Użyj stawki z ceną maksymalną” w odpowiedniej metodzie wysyłki, podczas obliczania ceny wysyłki zostanie użyta stawka z najwyższą ceną.
Oto mały przykład tego, jak to działa w formacie zrzutów ekranu:
- Skonfiguruj swoje produkty
- Ustaw stawki
- Ustaw algorytm kalkulacji ceny (w formularzu sposobu wysyłki)
- Sprawdź cenę wysyłki dla odpowiedniej metody z wybranymi produktami w koszyku (na froncie).
To nie wszystko, do czego jest zdolny moduł Shipping Suite. Zapraszam do zabawy z ustawieniami, aby uzyskać pożądany efekt.
Chętnie odpowiem na wszelkie pytania! Dlatego zachęcamy do pozostawienia komentarzy w dedykowanym polu poniżej.