创建Shipping Module

Magento系统自带了大概7种运费方式:平价、运费表、免运费、ups、usps、fedex、dhl等。不过这些依然无法满足我们的需求,这时候就需要创建一个shipping module 来实现了。创建一个shipping module 很简单,需要继承Mage_Shipping_Model_Carrier_Abstract抽象类, 实现Mage_Shipping_Model_Carrier_Interface接口类,这样就能利用函数collectRates来自定义计算运费的方式。这样就可以创建一个插件来自定义shipping method。

添加模块配置信息

首先,添加模块信息,创建文件app/etc/modules/Xbc_Ship.xml

 <config><modules><xbc_ship><active>true</active>
      <codepool>local</codepool>            
            <depends><mage_shipping></mage_shipping></depends> 
      <version>1.1.0</version></xbc_ship></modules></config> 

添加模块配置信息,创建文件app/code/local/Xbc/Ship/etc/config.xml

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

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

 <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上测试通过。

参考资料

Adding New Shipping Module In Magento

发表评论

电子邮件地址不会被公开。 必填项已用*标注