Magento商城里制作第三方自定义运费支付方式

Magento是一套专业开源的电子商务系统,获得过sourceforge的2008年最佳新项目奖。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。在设计上,包含相当全面,以模块化架构体系,让应用组合变得相当灵活,功能也相当丰富。其面向企业级应用,可处理更方面的需求,以及建设一个多种用途和适用面的电子商务网站。包括购物、航运、产品评论等等,充分利用开源的特性,提供代码库的开发,非常规范的标准,易于与第三方应用系统无缝集成。为了打开盈利途径,Magento同时具备收费的企业版本,积极谋求合作和第三方整合的工具,比如电子支付平台等。而这一篇就是关于制作自定义运费支付方式的。当然,本来打算将它做为插件,但对magento还不算太熟悉,所以再看以后有没有可能制作出一个第三方自定义运费支付方式的插件,而这一篇是修改核心源文件而实现的。

首先,编辑app/code/core/Mage/Shipping/etc/config.xml配置文件,在第181行里插入以下代码:

<internationalexpressmail>
               <active>0</active>
               <sallowspecific>0</sallowspecific>
               <model>shipping/carrier_internationalexpressmail</model>
               <name>International Express Mail Method</name>
               <price>5.00</price>
               <title>International Express Mail Method</title>
               <type>I</type>
               <specificerrmsg>This shipping method is currently unavailable. If you would like to ship using this shipping method, please contact us.</specificerrmsg>
               <handling_type>F</handling_type>
			</internationalexpressmail>

然后,编辑app/code/core/Mage/Shipping/etc/system.xml系统配置文件里里插入以下代码:

<internationalexpressmail translate="label">
				    <label>International Express Mail</label>
				    <frontend_type>text</frontend_type>
				    <sort_order>2</sort_order>
				    <show_in_default>1</show_in_default>
				    <show_in_website>1</show_in_website>
				    <show_in_store>1</show_in_store>
				    <fields>
				        <active translate="label">
				            <label>Enabled</label>
				            <frontend_type>select</frontend_type>
				            <source_model>adminhtml/system_config_source_yesno</source_model>
				            <sort_order>1</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </active>
				        <name translate="label">
				            <label>Method name</label>
				            <frontend_type>text</frontend_type>
				            <sort_order>3</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>1</show_in_store>
				        </name>
				        <price translate="label">
				            <label>Price</label>
				            <frontend_type>text</frontend_type>
				            <sort_order>5</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </price>
				        <handling_type translate="label">
				            <label>Calculate Handling Fee</label>
				            <frontend_type>select</frontend_type>
				            <source_model>shipping/source_handlingType</source_model>
				            <sort_order>7</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </handling_type>
				        <handling_fee translate="label">
				            <label>Handling Fee</label>
				            <frontend_type>text</frontend_type>
				            <sort_order>8</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </handling_fee>
				        <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>0</show_in_store>
						</sort_order>
						<title translate="label">
				            <label>Title</label>
				            <frontend_type>text</frontend_type>
				            <sort_order>2</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>1</show_in_store>
				        </title>
				        <type translate="label">
				            <label>Type</label>
				            <frontend_type>select</frontend_type>
				            <source_model>adminhtml/system_config_source_shipping_flatrate</source_model>
				            <sort_order>4</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </type>
				        <sallowspecific translate="label">
				            <label>Ship to applicable countries</label>
				            <frontend_type>select</frontend_type>
				            <sort_order>90</sort_order>
				            <frontend_class>shipping-applicable-country</frontend_class>
				            <source_model>adminhtml/system_config_source_shipping_allspecificcountries</source_model>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </sallowspecific>
				        <specificcountry translate="label">
				            <label>Ship to Specific countries</label>
				            <frontend_type>multiselect</frontend_type>
				            <sort_order>91</sort_order>
				            <source_model>adminhtml/system_config_source_country</source_model>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </specificcountry>
				        <showmethod translate="label">
				            <label>Show method if not applicable</label>
				            <frontend_type>select</frontend_type>
				            <sort_order>92</sort_order>
				            <source_model>adminhtml/system_config_source_yesno</source_model>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>0</show_in_store>
				        </showmethod>
				        <specificerrmsg translate="label">
				            <label>Displayed Error Message</label>
				            <frontend_type>textarea</frontend_type>
				            <sort_order>80</sort_order>
				            <show_in_default>1</show_in_default>
				            <show_in_website>1</show_in_website>
				            <show_in_store>1</show_in_store>
				        </specificerrmsg>
				    </fields>
				</internationalexpressmail>

最后,新建app/code/core/Mage/Shipping/Model/Carrier/Internationalexpressmail.php文件,插入以下代码:

<?php
class Mage_Shipping_Model_Carrier_Internationalexpressmail
    extends Mage_Shipping_Model_Carrier_Abstract
    implements Mage_Shipping_Model_Carrier_Interface
{

    protected $_code = 'internationalexpressmail';

    public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {
        if (!$this->getConfigFlag('active')) {
            return false;
        }

        $freeBoxes = 0;
        if ($request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getFreeShipping() && !$item->getProduct()->isVirtual()) {
                    $freeBoxes+=$item->getQty();
                }
            }
        }
        $this->setFreeBoxes($freeBoxes);

        $result = Mage::getModel('shipping/rate_result');
        if ($this->getConfigData('type') == 'O') { // per order
            $shippingPrice = $this->getConfigData('price');
        } elseif ($this->getConfigData('type') == 'I') { // per item
            $shippingPrice = ($request->getPackageQty() * $this->getConfigData('price')) - ($this->getFreeBoxes() * $this->getConfigData('price'));
        } else {
            $shippingPrice = false;
        }

        $shippingPrice = $this->getFinalPriceWithHandlingFee($shippingPrice);

        if ($shippingPrice !== false) {
            $method = Mage::getModel('shipping/rate_result_method');

            $method->setCarrier('internationalexpressmail');
            $method->setCarrierTitle($this->getConfigData('title'));

            $method->setMethod('internationalexpressmail');
            $method->setMethodTitle($this->getConfigData('name'));

            if ($request->getFreeShipping() === true || $request->getPackageQty() == $this->getFreeBoxes()) {
                $shippingPrice = '0.00';
            }

            $method->setPrice($shippingPrice);
            $method->setCost($shippingPrice);

            $result->append($method);
        }

        return $result;
    }

    public function getAllowedMethods()
    {
        return array('internationalexpressmail'=>$this->getConfigData('name'));
    }

}

这样,就实现了在magento支付过程中可以选择自定义的运费支付方式进行结算了。

Related Posts

    7 Responses to “Magento商城里制作第三方自定义运费支付方式”

    1. Benzing says:

      really…

      Fat women and girls always worried because of their ugly shaped bodies. They want to wear expensive and stylish outfits . http://thgyrsd.pimpblog.nl/54089/Green+Tea+For+Instant+Weight+Loss%3F.html but they can not wear these outwears…

    2. Hehmer says:

      Greate…

      It’s such a great site! http://www.zimbio.com/Soccer/articles/Biyc_ojdQRy/World+Football+Angry+River+Plate+fans+stage Great post, I just bookmarked it on Digg….

    3. ctilde says:

      Great One…

      I must say, its worth it! My link, http://cinderella.blogshells.com/,thanks haha…

    4. Kugenie says:

      Great One…

      I must say, its worth it! My link, http://misuperblog.com/christina,thanks haha…

    Leave a Reply