Magento系統自帶了大概7種運費方式:平價、運費表、免運費、ups、usps、fedex、dhl等。不過這些依然沒法知足咱們的需求,這時候就須要建立一個shipping module 來實現了。建立一個shipping module 很簡單,須要繼承Mage_Shipping_Model_Carrier_Abstract抽象類, 實現Mage_Shipping_Model_Carrier_Interface接口類,這樣就能利用函數collectRates來自定義計算運費的方式。這樣就能夠建立一個插件來自定義shipping method。php
首先,添加模塊信息,建立文件app/etc/modules/Xbc_Ship.xmlhtml
<?xml version="1.0"?> <config> <modules> <Xbc_Ship> <active>true</active> <codePool>local</codePool> <depends> <Mage_Shipping /> </depends> <version>1.1.0</version> </Xbc_Ship> </modules> </config> |
添加模塊配置信息,建立文件app/code/local/Xbc/Ship/etc/config.xmlmysql
<?xml version="1.0"?> <config> <modules> <Xbc_Ship> <version>1.1.0</version> </Xbc_Ship> </modules> <global> <helpers> <ship> <class>Xbc_Ship_Helper</class> </ship> </helpers> <resources> <ship_setup> <setup> <module>Xbc_Ship</module> </setup> <connection> <use>core_setup</use> </connection> </ship_setup> <ship_write> <connection> <use>core_write</use> </connection> </ship_write> <ship_read> <connection> <use>core_read</use> </connection> </ship_read> </resources> <models> <ship> <class>Xbc_Ship_Model</class> <resourceModel>ship_mysql4</resourceModel> </ship> </models> </global> <default> <carriers> <cm_dhl> <active>1</active> <debug>0</debug> <model>ship/carrier_cm_dhl</model> <name>DHL</name> <title>DHL</title> <description>DHL</description> <sort_order>0</sort_order> </cm_dhl> </carriers> </default> </config> |
建立文件app/code/local/Hofan/Ship/Model/Carrier/Cm/Dhl.php。web
<?php class Xbc_Ship_Model_Carrier_Cm_Dhl extends Mage_Shipping_Model_Carrier_Abstract implements Mage_Shipping_Model_Carrier_Interface { protected $_code = 'cm_dhl'; /** * Collect rates for this shipping method based on information in $request * * @param Mage_Shipping_Model_Rate_Request $data * @return Mage_Shipping_Model_Rate_Result */ public function collectRates(Mage_Shipping_Model_Rate_Request $request){ //if this shipping method disabled if (!$this->getConfigFlag('active')) { return false; } $result = Mage::getModel('shipping/rate_result'); $method = Mage::getModel('shipping/rate_result_method'); $method->setCarrier($this->_code); $method->setCarrierTitle($this->getConfigData('title')); $method->setMethod($this->_code); $method->setMethodTitle($this->getConfigData('name')); $debug = $this->getConfigData('debug'); $rate = $this->getConfigData('rate'); //get find the country id $country_id = $request->getDestCountryId(); //Get all items $items = $request->getAllItems(); $weight = $request->getPackageWeight(); foreach ($items as $item){ $_product = $item->getProduct(); if ($_product instanceof Mage_Catalog_Model_Product) { $product = Mage::getModel('catalog/product')->load($_product->getId()); if($_weight = $product->getWeight()){ } } } //get price $shippingPrice = 100; $method->setPrice($shippingPrice); $method->setCost($shippingPrice); $result->append($method); return $result; } /** * Get allowed shipping methods * * @return array */ public function getAllowedMethods() { return array($this->_code=>$this->getConfigData('name')); } } |
若是完成了上面的步驟,你能夠添加後臺配置文件。建立文件app/code/local/Xbc/Ship/etc/system.xmlsql
<?xml version="1.0"?> <config> <sections> <carriers translate="label" module="ship"> <groups> <cm_dhl translate="label"> <label>Hofan DHL</label> <frontend_type>text</frontend_type> <sort_order>0</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> <model>ship/carrier_cm_dhl</model> <fields> <active translate="label"> <label>Enabled</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_yesno</source_model> <sort_order>10</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </active> <debug translate="label"> <label>Debug Mode</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_yesno</source_model> <sort_order>20</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </debug> <title translate="label"> <label>Title</label> <frontend_type>text</frontend_type> <sort_order>30</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </title> <name translate="label"> <label>Method Name</label> <frontend_type>text</frontend_type> <sort_order>40</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </name> <description translate="label"> <label>Description</label> <frontend_type>textarea</frontend_type> <sort_order>50</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </description> <sort_order translate="label"> <label>Sort Order</label> <frontend_type>text</frontend_type> <sort_order>100</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </sort_order> </fields> </cm_dhl> </groups> </carriers> </sections> </config> |
該插件在Magento CE 1.6.2上測試經過。app