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

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

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

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

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

参考资料

Adding New Shipping Module In Magento

发表评论

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