3

I have implemented free shipping method with minimum order $40.00 and also flat shipping.

When free shipping condition is true, then I don't want to show other shipping methods, how to do this?

I am not aware of Magento code.

1

You can set up just one Flat Shipping method and disable all other shipping methods at admin > system > configuration > shipping methods.

Then you can make the shipping free when subtotal is greater then $40 using cart rules, see admin > promotions > shopping cart rules.

Create a new rule with condition "subtotal is greater than 40" condition

and then select the action to be free shipping: free shipping

1

To achieve your concept, follow below steps

  1. Set sort order such that free-shipping appears first when multiple shipping method applies for an order. To do that, System->Configuration->Shipping Methods->Free Shipping (Tab)-> Sort Order->set this to 1, then set the same field for other shipping methods 2,3 etc.

  2. Add the following code snippet in app/design/frontend/Yourtheme/default/template/checkout/onepage/shipping_method/available.phtml before the end of foreach loop.

So finally your available.phtml would like

<?php /** @var $this Mage_Checkout_Block_Onepage_Shipping_Method_Available */ ?>
<?php $_shippingRateGroups = $this->getShippingRates(); ?>
<?php if (!$_shippingRateGroups): ?>
    <p><?php echo $this->__('Sorry, no quotes are available for this order at this time.') ?></p>
<?php else: ?>
    <dl class="sp-methods">
    <?php $shippingCodePrice = array(); ?>
    <?php $_sole = count($_shippingRateGroups) == 1; foreach ($_shippingRateGroups as $code => $_rates): ?>
        <dt><?php echo $this->escapeHtml($this->getCarrierName($code)) ?></dt>
        <dd>
            <ul>
            <?php $_sole = $_sole && count($_rates) == 1; foreach ($_rates as $_rate): ?>
                <?php $shippingCodePrice[] = "'".$_rate->getCode()."':".(float)$_rate->getPrice(); ?>
                <li>
                   <?php if ($_rate->getErrorMessage()): ?>
                    <ul class="messages"><li class="error-msg"><ul><li><?php echo $this->escapeHtml($_rate->getErrorMessage()) ?></li></ul></li></ul>
                   <?php else: ?>
                        <?php if ($_sole) : ?>
                        <span class="no-display"><input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>" checked="checked" /></span>
                        <?php else: ?>
                        <input name="shipping_method" type="radio" value="<?php echo $_rate->getCode() ?>" id="s_method_<?php echo $_rate->getCode() ?>"<?php if($_rate->getCode()===$this->getAddressShippingMethod()) echo ' checked="checked"' ?> class="radio"/>

                        <?php if ($_rate->getCode() === $this->getAddressShippingMethod()): ?>
                        <script type="text/javascript">
                            //<![CDATA[
                                lastPrice = <?php echo (float)$_rate->getPrice(); ?>;
                            //]]>
                        </script>
                        <?php endif; ?>

                        <?php endif; ?>
                        <label for="s_method_<?php echo $_rate->getCode() ?>"><?php echo $this->escapeHtml($_rate->getMethodTitle()) ?>
                        <?php $_excl = $this->getShippingPrice($_rate->getPrice(), $this->helper('tax')->displayShippingPriceIncludingTax()); ?>
                        <?php $_incl = $this->getShippingPrice($_rate->getPrice(), true); ?>
                        <?php echo $_excl; ?>
                        <?php if ($this->helper('tax')->displayShippingBothPrices() && $_incl != $_excl): ?>
                            (<?php echo $this->__('Incl. Tax'); ?> <?php echo $_incl; ?>)
                        <?php endif; ?>
                        </label>
                   <?php endif ?>
                </li>

            <?php endforeach; ?>
            </ul>
        </dd>
<!-- **Start Code snippet to appear freeshipping only** -->
<?php if($code==='freeshipping'):
break;
endif; ?>
<!-- **End** -->
    <?php endforeach; ?>
    </dl>
<script type="text/javascript">
//<![CDATA[
    <?php if (!empty($shippingCodePrice)): ?>
        var shippingCodePrice = {<?php echo implode(',',$shippingCodePrice); ?>};
    <?php endif; ?>

    $$('input[type="radio"][name="shipping_method"]').each(function(el){
        Event.observe(el, 'click', function(){
            if (el.checked == true) {
                var getShippingCode = el.getValue();
                <?php if (!empty($shippingCodePrice)): ?>
                    var newPrice = shippingCodePrice[getShippingCode];
                    if (!lastPrice) {
                        lastPrice = newPrice;
                        quoteBaseGrandTotal += newPrice;
                    }
                    if (newPrice != lastPrice) {
                        quoteBaseGrandTotal += (newPrice-lastPrice);
                        lastPrice = newPrice;
                    }
                <?php endif; ?>
                checkQuoteBaseGrandTotal = quoteBaseGrandTotal;
                return false;
            }
       });
    });
//]]>
</script>
<?php endif; ?>
  • And add the same code snippet in app/design/frontend/yourtheme/default/template/checkout/cart/shipping.phtml, To make it avail in cart page too. Here the important thing is sort order settings in admin (Don't forget to set that). – SIBHI S Aug 30 '14 at 14:53

Not the answer you're looking for? Browse other questions tagged or ask your own question.