系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
在这篇文章中,我们将演示如何使用运输方法创建Magento 2模块。如果您已经熟悉Magento 1,那么所有示例都将非常清楚。创建运输方式非常简单,所以让我们举个例子。
首先,您需要创建一个Magento模块。您应该创建目录结构,如下面的屏幕截图所示:
Magento 2模块二极管结构
创建模块后,您应该使用 shell 脚本启用模块:
php -f /bin/magento module:enable Inchoo_Shipping
此外,您可以使用命令检查是否启用模块(此脚本将打印所有已启用模块的列表):
php -f /bin/magento module:status
让我们从一个处理运输方法的类开始。首先,运输方法应在文件配置.xml中定义,如下面的屏幕截图所示。没有它,它就无法工作。xml 中的主节点是“默认”节点,节点“承运人”的子节点应与运输类“Inchoo\Shipping\Model\Carrier\Example”中的属性 $_code 具有相同的名称。
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd"> <default> <carriers> <example> <active>1</active> <sallowspecific>0</sallowspecific> <model>Inchoo\Shipping\Model\Carrier\Example</model> <name>Inchoo Example Shipping</name> <price>15.00</price> <title>Inchoo Example</title> <type>I</type> <specificerrmsg>This shipping method is not available. To use this shipping method, please contact us.</specificerrmsg> </example> </carriers> </default> </config>
在我们的配置中.xml您会注意到XML节点“模型”,它定义了php类“Inchoo\Shipping\Model\Carrier\Example”。此型号类按运输方式收费。在此类中应实现所有用于运输计算的逻辑。
此外,每种运输方式都应该在管理中具有配置选项。您可以通过 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> <section id="carriers" translate="label" type="text" sortOrder="320" showInDefault="1" showInWebsite="1" showInStore="1"> <group id="example" translate="label" type="text" sortOrder="0" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Inchoo Example</label> <field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Enabled</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="name" translate="label" type="text" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Method Name</label> </field> <field id="price" translate="label" type="text" sortOrder="5" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Price</label> <validate>validate-number validate-zero-or-greater</validate> </field> <field id="handling_type" translate="label" type="select" sortOrder="7" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Calculate Handling Fee</label> <source_model>Magento\Shipping\Model\Source\HandlingType</source_model> </field> <field id="handling_fee" translate="label" type="text" sortOrder="8" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Handling Fee</label> <validate>validate-number validate-zero-or-greater</validate> </field> <field id="sort_order" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Sort Order</label> </field> <field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Title</label> </field> <field id="sallowspecific" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Ship to Applicable Countries</label> <frontend_class>shipping-applicable-country</frontend_class> <source_model>Magento\Shipping\Model\Config\Source\Allspecificcountries</source_model> </field> <field id="specificcountry" translate="label" type="multiselect" sortOrder="91" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Ship to Specific Countries</label> <source_model>Magento\Directory\Model\Config\Source\Country</source_model> <can_be_empty>1</can_be_empty> </field> <field id="showmethod" translate="label" type="select" sortOrder="92" showInDefault="1" showInWebsite="1" showInStore="0"> <label>Show Method if Not Applicable</label> <source_model>Magento\Config\Model\Config\Source\Yesno</source_model> </field> <field id="specificerrmsg" translate="label" type="textarea" sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="1"> <label>Displayed Error Message</label> </field> </group> </section> </system> </config>
发货类别应类似于以下示例:
<?php namespace Inchoo\Shipping\Model\Carrier; use Magento\Quote\Model\Quote\Address\RateRequest; use Magento\Shipping\Model\Rate\Result; class Example extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements \Magento\Shipping\Model\Carrier\CarrierInterface { /** * @var string */ protected $_code = 'example'; /** * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory * @param \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory * @param array $data */ public function __construct( \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory, \Psr\Log\LoggerInterface $logger, \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory, \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory, array $data = [] ) { $this->_rateResultFactory = $rateResultFactory; $this->_rateMethodFactory = $rateMethodFactory; parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data); } /** * @return array */ public function getAllowedMethods() { return ['example' => $this->getConfigData('name')]; } /** * @param RateRequest $request * @return bool|Result */ public function collectRates(RateRequest $request) { if (!$this->getConfigFlag('active')) { return false; } /** @var \Magento\Shipping\Model\Rate\Result $result */ $result = $this->_rateResultFactory->create(); /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */ $method = $this->_rateMethodFactory->create(); $method->setCarrier('example'); $method->setCarrierTitle($this->getConfigData('title')); $method->setMethod('example'); $method->setMethodTitle($this->getConfigData('name')); /*you can fetch shipping price from different sources over some APIs, we used price from config.xml - xml node price*/ $amount = $this->getConfigData('price'); $method->setPrice($amount); $method->setCost($amount); $result->append($method); return $result; } }
为了正确地为运输方法编写php类,您应该尊重一些Magento 2规则。每个Magento 2运输类都应该扩展“\Magento\Shipping\Model\Carrier\AbstractCarrier”并实现“\Magento\Shipping\Model\Carrier\CarrierInterface”。
在运输模型中,您需要创建至少两个 php 方法:“getAllowedMethods”和“collectRates”。抽象类和接口需要此方法。此外,您应该使用值定义属性 $_code。在我们的例子中,这就是“例子”。它与配置.xml和节点结构有关。
Php 方法 “collectRates” 接受参数 “$request”,它是类 “Magento\Quote\Model\Quote\Address\RateRequest” 的实例。此类包含有关购物车/报价、重量、送货地址等物料的所有信息。在此方法中,您可以实现运费计算的所有逻辑。通过此方法,您可以调用其他服务进行运费计算,但这取决于您的集成。
您可以在下面的屏幕截图中看到更多信息。
装运请求对象
如果您按照我写的格式实现了所有内容,您将能够在结帐时看到运输方式。