Today's task was to auto select shipping method based on customer group. For this website only approved and logged in customers were allowed to proceed to checkout.
Because of multi-store magento website first I created configuration setting as:
file: /trunk/wholesale/app/code/local/Technooze/Checkout/etc/system.xml
<?xml version="1.0"?> <config> <sections> <checkout translate="label" module="checkout"> <label>Checkout</label> <tab>sales</tab> <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> <groups> <shippingmethod translate="label"> <label>Shipping</label> <frontend_type>text</frontend_type> <sort_order>200</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>1</show_in_store> <fields> <autoselect_shipping translate="label"> <label>Auto select shipping based on customer group</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_yesno</source_model> <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> </autoselect_shipping> </fields> </shippingmethod> </groups> </checkout> </sections> </config>
Now we can enable this feature only on selected websites. Another step was to override method's available block:
file: /trunk/wholesale/app/code/local/Technooze/Checkout/etc/config.xml
<global> ... <blocks> <technooze_checkout> <class>Technooze_Checkout_Block</class> </technooze_checkout> <checkout> <rewrite> <onepage_shipping_method_available>Technooze_Checkout_Block_Onepage_Shipping_Method_Available</onepage_shipping_method_available> </rewrite> </checkout> </blocks> ... </global>
Then override getShippingRates() method:
File: /trunk/wholesale/app/code/local/Technooze/Checkout/Block/Onepage/Shipping/Method/Available.php
<?php class Technooze_Checkout_Block_Onepage_Shipping_Method_Available extends Mage_Checkout_Block_Onepage_Shipping_Method_Available { public function getShippingRates() { $rates = parent::getShippingRates(); $selected = $this->getAddressShippingMethod(); $select = Mage::getStoreConfig('checkout/shippingmethod/autoselect_shipping'); $groupId = Mage::getSingleton('customer/session')->getCustomerGroupId(); /* * Groups: * 0: Guest * 1: T member * 2: S account customer * 3: S proforma customer * 4: SF sale customer * 5: newsletter testers */ if($select){ $selected = false; } foreach($rates as $code => $_rates){ foreach ($_rates as $_rate){ if(empty($selected)){ switch($groupId){ case 0: break; case 1: break; case 2: if($_rate->getCode() === 'flatrate_flatrate'){ $quote = $this->getQuote()->getShippingAddress(); $quote->setShippingMethod($_rate->getCode()); $quote->save(); $selected = $this->getAddressShippingMethod(); // below code will only display selected option, comment out this if you want to display all options return array($code => $rates[$code]); } break; case 3: if($_rate->getCode() === 'tablerate_bestway'){ $quote = $this->getQuote()->getShippingAddress(); $quote->setShippingMethod($_rate->getCode()); $quote->save(); $selected = $this->getAddressShippingMethod(); // below code will only display selected option, comment out this if you want to display all options return array($code => $rates[$code]); } break; case 4: break; case 5: break; default: } } } } return $rates; } }
Thanks to magepsycho for his blog post: http://www.blog.magepsycho.com/hide-other-shipping-methods-when-free-shipping-is-enabled/