วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง

เผยแพร่แล้ว: 2020-04-07

บ่อยครั้งใน Magento 2 จำนวนของแอตทริบิวต์ผลิตภัณฑ์มาตรฐานที่สามารถใช้ในการตั้งค่าเงื่อนไขมีจำกัด การปรับแต่งเพิ่มเติมจะต้องตอบสนองความต้องการทางธุรกิจ

จากบทความนี้ คุณจะได้เรียนรู้วิธีบรรลุเป้าหมายและเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองอัตราค่าจัดส่ง

หมายเหตุ:

  1. ดูตัวอย่างโค้ดทั้งหมดบน GitHub
  2. ส่วนแรกของตัวอย่างซึ่งเพิ่มแอตทริบิวต์ "น้ำหนักตามปริมาตร" เป็นตัวกรองอัตราค่าจัดส่ง มีให้ที่นี่
  3. จำเป็นต้องมีโมดูล Magento 2 Shipping Suite Ultimate ดั้งเดิม

มาพูดคุยกันตรงๆ ว่าต้องทำอย่างไรเพื่อให้บรรลุวัตถุประสงค์

สารบัญ

  • คำแนะนำทีละขั้นตอนในการเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเอง
    • ขั้นตอนที่ 1. สร้างโมดูลใหม่โดยเพิ่มไฟล์พื้นฐาน
    • ขั้นตอนที่ 2 สร้างโครงสร้างโมดูล
    • ขั้นตอนที่ 3 ส่วนต่อประสานผู้ใช้
      • รูปร่าง
      • กริด

คำแนะนำทีละขั้นตอนในการเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเอง

ขั้นตอนที่ 1. สร้างโมดูลใหม่โดยเพิ่มไฟล์พื้นฐาน

เริ่มต้นด้วยการตั้งชื่อโมดูล:

 > 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__ );

จากนั้นตรวจสอบและประกาศข้อกำหนด คุณจะต้องตั้งชื่อให้กับโมดูลของเราสำหรับผู้แต่ง ตั้งค่าเวอร์ชัน และเพิ่มคำอธิบายสั้นๆ:

 > 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\\": "" } } }

นอกจากนี้ เราสามารถตั้งชื่อเริ่มต้นและเวอร์ชันในการกำหนดค่า Magento 2 โดยประกาศลำดับ:

 > 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>

ขั้นตอนที่ 2 สร้างโครงสร้างโมดูล

สมมติว่าเรามีแอตทริบิวต์ผลิตภัณฑ์ชื่อ 'shippingnew' ซึ่งสร้างขึ้นจากฝั่งผู้ดูแลระบบ เป็นประเภทอินพุตแบบเลื่อนลงและมีตัวเลือกไม่กี่อย่างชื่อ 'A, B, C, D' ฯลฯ ตัวเลือกเหล่านี้จะอธิบายวิธีที่เราจัดส่งสินค้าตามโซน แต่ละค่ามีราคาของตัวเอง และผลิตภัณฑ์ที่มีราคาสูงสุดจะแก้ไขต้นทุนวิธีการจัดส่งระหว่างการชำระเงิน

ก่อนอื่น เราต้องสร้างตารางแยกต่างหากสำหรับเงื่อนไขการขยายอัตราค่าจัดส่งของเรา หลังจากนั้น เราจะเพิ่มโดยใช้แอตทริบิวต์ส่วนขยายปกติของโมเดล (โมเดล 'อัตราค่าจัดส่ง' ขยาย `\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); } }

เราตั้งชื่อตารางของเราดังนี้: `'mageworx_shippingrules_rates_shippingnew'' มีเพียง 2 คอลัมน์ หนึ่งในนั้นใช้เป็นกุญแจต่างประเทศ เป็นคอลัมน์ "rate_id" ซึ่งจะเชื่อมโยงกับตารางปกติ "mageworx_shippingrules_rates" จากโมดูล MageWorx Shipping Suite Ultimate สำหรับ Magento 2 อีกคอลัมน์หนึ่งจะประกอบด้วยค่าจากแอตทริบิวต์ "shippingnew"

ก่อนที่เราจะทำการโหลด/บันทึก/ลบข้อมูลที่เรากำหนดเองไปยังตารางของผู้สังเกตการณ์ เราต้องสร้างแบบจำลองอย่างน้อยสองแบบ – โมเดลปกติและแบบจำลองทรัพยากร

 > 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'); } }

หมายเหตุ:

  1. ` _eventPrefix ` จะถูกใช้เพื่อตรวจหาเหตุการณ์โมเดลของเรา
  2. `_eventObject` จะถูกใช้เพื่อเก็บข้อมูลในอ็อบเจกต์เหตุการณ์ การใช้ชื่อนี้ทำให้เราสามารถรับแบบจำลองของเราได้จากวัตถุเหตุการณ์
  3. `$this->_init( 'MageWorx\ShippingRateByProductAttribute\Model\ResourceModel\ ShippingNew' );` เชื่อมโยงแบบจำลองของเรากับแบบจำลองทรัพยากรที่เกี่ยวข้อง
  4. `$this->setIdFieldName( 'rate_id' );` อธิบายว่าฟิลด์ใดจากตารางที่ต้องใช้เป็นคีย์ (ปกติเราจะเรียกว่า 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; } }

หมายเหตุ:

  1. $this->_init( 'mageworx_shippingrules_rates_shippingnew' , 'rate_id' ); ตั้งชื่อตารางหลักและชื่อฟิลด์รหัส
  2. ฟังก์ชันสาธารณะ insertUpdateRecord($rateId, int $shippingNew) เป็นวิธีการ ซึ่งสามารถช่วยให้เราอัปเดตค่าแอตทริบิวต์ในตารางที่กำหนดเองได้
  3. ฟังก์ชันสาธารณะ deleteRecord($rateId) ออกแบบมาเพื่อลบคอลัมน์

ต่อมาเราจะใช้วิธีเหล่านี้กับผู้สังเกตการณ์ของเรา

ตอนนี้ มาเพิ่มข้อมูลใหม่ของเราเป็นแอตทริบิวต์ส่วนขยายในแบบจำลองอัตราค่าจัดส่ง:

 > 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>

เราควรดูแลการทำงานปกติของเงื่อนไขที่เรากำหนดเอง:

 > 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>

เหตุการณ์ แรก มีไว้สำหรับบันทึก/อัปเดต/ลบค่าแอตทริบิวต์ที่กำหนดเองในเงื่อนไขอัตรา

สอง เหตุการณ์ที่สองมีไว้สำหรับการเพิ่มค่าแอตทริบิวต์นี้ในคอลเล็กชัน

สามเหตุการณ์สุดท้าย มีไว้สำหรับฟังก์ชันนำเข้า/ส่งออก

มาวิเคราะห์กันโดยละเอียดยิ่งขึ้น:

 > 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; } }

มันง่ายอย่างนั้น เมื่อเราบันทึกอัตรา เราต้องดูแลการบันทึกค่าแอตทริบิวต์ที่กำหนดเองด้วย ในกรณีที่ค่าเท่ากับ `null' เพียงแค่ลบระเบียน

 > 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'] ); } }

เพื่อให้มีการตรวจสอบความถูกต้อง เมื่อลูกค้าไปที่จุดชำระเงินหรือการประเมินอัตราค่าจัดส่ง มาเข้าร่วมตารางของเรากับแอตทริบิวต์ที่กำหนดเองในตารางอัตราปกติ

 > 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 ); } }

นี่คือผู้สังเกตการณ์ที่ซับซ้อนที่สุดในกองของเรา ได้รับการออกแบบมาเพื่อรวบรวมค่าแอตทริบิวต์ทั้งหมด (`$shippingCategories`) จากรถเข็นของลูกค้า และเพิ่มค่าแอตทริบิวต์เป็นตัวกรองในการเก็บอัตราปกติ (ตารางของเราได้เข้าร่วมแล้ว) เพื่อให้ง่าย ฉันตั้งชื่อมันว่า 'ตัวกรอง' เมื่อทำงานเสร็จแล้ว ลูกค้าจะเห็นอัตราค่าจัดส่งตามจริงสำหรับสินค้าในรถเข็นปัจจุบัน

ผู้สังเกตการณ์เหตุการณ์อีก 3 รายได้รับการออกแบบมาเพื่อเพิ่มและรับข้อมูลที่กำหนดเองระหว่างการส่งออกและนำเข้าอัตราค่าจัดส่ง เราข้ามรหัสในโพสต์บล็อก แต่จะพร้อมใช้งานในที่เก็บพร้อมซอร์สโค้ด


MageWorx Magento 2 Extensions

ขั้นตอนที่ 3 ส่วนต่อประสานผู้ใช้

ได้เวลาเพิ่มแอตทริบิวต์ของเราลงในตารางและรูปแบบอัตราค่าจัดส่งแล้ว

รูปร่าง

 > 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>

กริด

 > 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>

อย่างที่คุณเห็น เราใช้โมเดลซอร์สแบบกำหนดเองในไฟล์เหล่านั้น มาสร้างมันกันเถอะ มันจะโหลดแอตทริบิวต์ที่เกี่ยวข้อง (`shippingnew`) และให้ค่าที่มีอยู่ทั้งหมดแก่เรา

 > 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; } }

ส่วนของรหัสนั้นค่อนข้างง่าย เราใช้ที่เก็บแอตทริบิวต์เพื่อโหลดแอตทริบิวต์ของเราแล้วรับตัวเลือก (ค่า) ทั้งหมดจากแอตทริบิวต์ โปรดทราบว่าแอตทริบิวต์ที่มีรหัส "shippingnew" ต้องสร้างในแผงการดูแลระบบ และต้องมีประเภทอินพุตแบบเลื่อนลงพร้อมตัวเลือก (ค่า) ที่กำหนดไว้ล่วงหน้า คุณสามารถทำได้จากเมนู 'ร้านค้า > คุณลักษณะ > สินค้า' อย่าลืมเพิ่มแอตทริบิวต์นี้ให้กับชุดแอตทริบิวต์ที่คุณใช้สำหรับผลิตภัณฑ์

เมื่อทุกอย่างเสร็จสิ้น เราเพียงแค่เปิดใช้งานโมดูลและเรียกใช้ `setup:upgrade' แคชจะถูกล้างโดยอัตโนมัติ

ไปที่ตารางอัตรา ('ร้านค้า > อัตราค่าจัดส่ง') แล้วคุณจะเห็นคอลัมน์ใหม่:

วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx

เงื่อนไขนั้นจะอยู่ในแบบฟอร์มอัตรา:

วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx

หากเราตั้งค่า 'การคำนวณราคาหลายอัตรา' เป็น 'อัตราการใช้ด้วยราคาสูงสุด' ในวิธีการจัดส่งที่สอดคล้องกัน อัตราที่มีราคาสูงสุดจะถูกใช้ในระหว่างการคำนวณราคาจัดส่ง

นี่เป็นตัวอย่างเล็กๆ น้อยๆ เกี่ยวกับวิธีการทำงานในรูปแบบของภาพหน้าจอ:

  1. ตั้งค่าผลิตภัณฑ์ของคุณ
วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx
  1. ตั้งค่าอัตรา
วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx
  1. ตั้งค่าอัลกอริธึมการคำนวณราคา (ในแบบฟอร์มวิธีการจัดส่ง)
วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx
  1. ตรวจสอบราคาจัดส่งสำหรับวิธีการที่เกี่ยวข้องกับสินค้าที่เลือกในรถเข็น (ที่ส่วนหน้า)
วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx
วิธีเพิ่มแอตทริบิวต์ผลิตภัณฑ์ที่กำหนดเองเป็นตัวกรองสำหรับอัตราค่าจัดส่ง | บล็อก MageWorx

นี่ไม่ใช่ทุกสิ่งที่โมดูล Shipping Suite สามารถทำได้ อย่าลังเลที่จะเล่นกับการตั้งค่าเพื่อให้ได้ผลลัพธ์ที่ต้องการ

ฉันยินดีที่จะตอบคำถามใด ๆ ! ดังนั้นโปรดแสดงความคิดเห็นของคุณในช่องด้านล่างโดยเฉพาะ