You must have wondered how to add a new Shipping Module in Magento especially if you don’t find your preferred payment module in existing Magento installation with your preferred Shipping Module. Adding a new Magento Shipping Module in not difficult but requires little bit of programming at your end. In this article i am going to elaborate on how to add a new Shipping module to your existing Magento Installation.
Few Notes:
- Just Replace all instances of ‘YourCompany’ with your company name.
- Replace ‘NewModule’ with the Payment Module name.
- Ensure that the path of the PHP include_path is
/app/code/local/
- Clean your cache after modifying the config xml files.
Set The Configuration
You need to createapp/code/local/YourCompany/NewModule/etc/config.xml
file and write the following lines of code in it.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?xml version="1.0"?> <config> <modules> <!-- declare module's version information --> <YourCompany_NewModule> <!-- this version number will be used for database upgrades --> <version>0.1.0</version> </YourCompany_NewModule> </modules> <global> <!-- declare model group for new module --> <models> <!-- model group alias to be used in Mage::getModel() --> <newmodule> <!-- base class name for the model group --> <class>YourCompany_NewModule_Model</class> </newmodule> </models> <!-- declare resource setup for new module --> <resources> <!-- resource identifier --> <newmodule_setup> <!-- specify that this resource is a setup resource and used for upgrades --> <setup> <!-- which module to look for install/upgrade files in --> <module>YourCompany_NewModule</module> </setup> <!-- specify database connection for this resource --> <connection> <!-- do not create new connection, use predefined core setup connection --> <use>core_setup</use> </connection> </newmodule_setup> </resources> </global> </config> |
app/etc/modules/YourCompany_NewModule.xml
file1 2 3 4 5 6 7 8 9 10 11 12 13 | <config> <!-- ... --> <modules> <!-- ... --> <!-- declare YourCompany_NewModule module --> <YourCompany_NewModule> <active>true</active> <codePool>local</codePool> </YourCompany_NewModule> <!-- ... --> </modules> <!-- ... --> </config> |
Adding Information Into Adapter
Now, createapp/code/local/YourCompany/NewModule/Model/Carrier/ShippingMethod.php
file and put the following code in it. You can always set the
ShippingMethod name of your choice, depending upon for which Payment
Gateway you are making a module.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <?php /** * Our test shipping method module adapter */ class YourCompany_NewModule_Model_Carrier_ShippingMethod extends Mage_Shipping_Model_Carrier_Abstract { /** * unique internal shipping method identifier * * @var string [a-z0-9_] */ protected $_code = 'newmodule'; /** * 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) { // skip if not enabled if (!Mage::getStoreConfig('carriers/'.$this->_code.'/active')) { return false; } /** * here we are retrieving shipping rates from external service * or using internal logic to calculate the rate from $request * you can see an example in Mage_Usa_Model_Shipping_Carrier_Ups::setRequest() */ // get necessary configuration values $handling = Mage::getStoreConfig('carriers/'.$this->_code.'/handling'); // this object will be returned as result of this method // containing all the shipping rates of this method $result = Mage::getModel('shipping/rate_result'); // $response is an array that we have foreach ($response as $rMethod) { // create new instance of method rate $method = Mage::getModel('shipping/rate_result_method'); // record carrier information $method->setCarrier($this->_code); $method->setCarrierTitle(Mage::getStoreConfig('carriers/'.$this->_code.'/title')); // record method information $method->setMethod($rMethod['code']); $method->setMethodTitle($rMethod['title']); // rate cost is optional property to record how much it costs to vendor to ship $method->setCost($rMethod['amount']); // in our example handling is fixed amount that is added to cost // to receive price the customer will pay for shipping method. // it could be as well percentage: /// $method->setPrice($rMethod['amount']*$handling/100); $method->setPrice($rMethod['amount']+$handling); // add this rate to the result $result->append($method); } return $result; } } |
How To Develop Admin Module For Shipping Customizations
Once, you are done with the above steps, you need to inform Magento that there is a new Payment Module which needs to be configured and displayed in admin. In order to do so, you need to createapp/code/local/YourCompany/NewModule/etc/system.xml
file and put the following lines of code in it.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | <?xml version="1.0"?> <config> <sections> <carriers> <groups> <newmodule translate="label" module="shipping"> <label>Carrier Name</label> <frontend_type>text</frontend_type> <sort_order>13</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> <fields> <account translate="label"> <label>Account number</label> <frontend_type>text</frontend_type> <sort_order>7</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </account> <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>1</show_in_store> </active> <contentdesc translate="label"> <label>Package Description</label> <frontend_type>text</frontend_type> <sort_order>12</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </contentdesc> <!-- If the free_shipping_enable flag enable, the system will check free_shipping_subtotal to give free shipping otherwise will use shopping cart price rule behaviour --> <free_shipping_enable translate="label"> <label>Free shipping with minimum order amount</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_enabledisable</source_model> <sort_order>21</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </free_shipping_enable> <free_shipping_subtotal translate="label"> <label>Minimum order amount for free shipping</label> <frontend_type>text</frontend_type> <sort_order>22</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </free_shipping_subtotal> <dutiable translate="label"> <label>Shipment Dutiable</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_yesno</source_model> <sort_order>13</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </dutiable> <gateway_url translate="label"> <label>Gateway URL</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> </gateway_url> <handling_type translate="label"> <label>Calculate Handling Fee</label> <frontend_type>select</frontend_type> <source_model>shipping/source_handlingType</source_model> <sort_order>10</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_action translate="label"> <label>Handling Applied</label> <frontend_type>select</frontend_type> <source_model>shipping/source_handlingAction</source_model> <sort_order>11</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> </handling_action> <handling_fee translate="label"> <label>Handling fee</label> <frontend_type>text</frontend_type> <sort_order>12</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </handling_fee> <max_package_weight translate="label"> <label>Maximum Package Weight (Please consult your shipping carrier for maximum supported shipping weight)</label> <frontend_type>text</frontend_type> <sort_order>13</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </max_package_weight> <id translate="label"> <label>Access ID</label> <frontend_type>text</frontend_type> <backend_model>adminhtml/system_config_backend_encrypted</backend_model> <sort_order>5</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </id> <password translate="label"> <label>Password</label> <frontend_type>text</frontend_type> <backend_model>adminhtml/system_config_backend_encrypted</backend_model> <sort_order>6</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </password> <shipping_intlkey translate="label"> <label>Shipping key (International)</label> <frontend_type>text</frontend_type> <backend_model>adminhtml/system_config_backend_encrypted</backend_model> <sort_order>8</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </shipping_intlkey> <shipping_key translate="label"> <label>Shipping key</label> <frontend_type>text</frontend_type> <backend_model>adminhtml/system_config_backend_encrypted</backend_model> <sort_order>8</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> </shipping_key> <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> <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> <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>1</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>1</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>1</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> </newmodule> </groups> </carriers> </sections> </config> |
Please leave me a comment and let me know if you run into any problems implementing the above code.
No comments:
Post a Comment