April 09, 2014

April 09, 2014
In this article, we are going to discuss about How to add two add to cart buttons with different redirect options at once in Magento. If we want to add two types of "Add to cart" buttons. One for adds the product in the cart, but stays on the product description or product list page, and another one to add the product in the cart and redirects to the "My Cart" page.

Magento has the possibility to set from admin, how to react if a product is added in the cart. There is a setting in the administration interface:

"After Adding a Product Redirect to Shopping Cart – Yes/No".


But the issue is, how can someone use two "Add to cart" buttons in the same time, with different actions (one to redirect to shopping cart, and one to stay on the product list or detail page) after the products has been added in the cart.

There is a solution, but for this, the Checkout-CartController has to be overridden.

Step 1 : Create your module folders and files

  1. Magento/app/code/local/MyNameSpace/MyCheckout/etc/config.xml
  2. Magento/app/code/local/MyNameSpace/MyCheckout/controllers/CartController.php
  3. Magento/app/etc/modules/MyNameSpace_MyCheckout.xml


Step 2 : Edit /etc/config.xml

Go to Magento/app/code/local/MyNameSpace/MyCheckout/etc/config.xml and paste the following xml into it:

<?xml version="1.0"?>
<config>
    <modules>
        <MyNameSpace_Mycheckout>
            <version>0.1.0</version>
        </MyNameSpace_Mycheckout>
    </modules>
    <frontend>
        <routers>
            <MyNameSpace_Mycheckout>
                <use>standard</use>
                <args>
                    <module>MyNameSpace_Mycheckout</module>
                    <frontName>mycheckout</frontName>
                </args>
            </MyNameSpace_Mycheckout>
        </routers>
    </frontend>
    <global>
        <routers>
            <checkout>
                <rewrite>
                    <cart>
                        <to>mycheckout/cart</to>
                        <override_actions>true</override_actions>
                        <actions>
                            <add>
                                <to>mycheckout/cart/add</to>
                            </add>
                        </actions>
                    </cart>
                </rewrite>
            </checkout>
        </routers>
    </global>
</config>

Step 3 : Edit /controllers/CartController.php

Paste the following php code into Magento/app/code/local/MyNameSpace/MyCheckout/controllers/CartController.php

<?php
require_once 'Mage/Checkout/controllers/CartController.php';
class MyNameSpace_Mycheckout_CartController extends Mage_Checkout_CartController
{
    /**
     * Add product to shopping cart action
     */
    public function addAction()
    {
        $cart   = $this->_getCart();
        $params = $this->getRequest()->getParams();
        try {
            if (isset($params['qty'])) {
                $filter = new Zend_Filter_LocalizedToNormalized(
                    array('locale' => Mage::app()->getLocale()->getLocaleCode())
                );
                $params['qty'] = $filter->filter($params['qty']);
            }

            $product = $this->_initProduct();
            $related = $this->getRequest()->getParam('related_product');

            /**
             * Check product availability
             */
            if (!$product) {
                $this->_goBack();
                return;
            }

            $cart->addProduct($product, $params);
            if (!empty($related)) {
                $cart->addProductsByIds(explode(',', $related));
            }

            $cart->save();

            $this->_getSession()->setCartWasUpdated(true);

            /**
             * @todo remove wishlist observer processAddToCart
             */
            Mage::dispatchEvent('checkout_cart_add_product_complete',
                array('product' => $product, 'request' => $this->getRequest(), 'response' => $this->getResponse())
            );

            if (!$this->_getSession()->getNoCartRedirect(true)) {
                if (!$cart->getQuote()->getHasError()){
                    $message = $this->__('%s was added to your shopping cart.', Mage::helper('core')->htmlEscape($product->getName()));
                    $this->_getSession()->addSuccess($message);
                }
                if ($returnUrl = $this->getRequest()->getParam('return_url')) {
                    // clear layout messages in case of external url redirect
                    if ($this->_isUrlInternal($returnUrl)) {
                        $this->_getSession()->getMessages(true);
                    }
                    $this->getResponse()->setRedirect($returnUrl);
                } elseif (!Mage::getStoreConfig('checkout/cart/redirect_to_cart')
                    && !$this->getRequest()->getParam('in_cart')
                    && $backUrl = $this->_getRefererUrl()) {

                    $this->getResponse()->setRedirect($backUrl);
                } else {
                    if (($this->getRequest()->getActionName() == 'add') && !$this->getRequest()->getParam('in_cart')) {
                        $this->_getSession()->setContinueShoppingUrl($this->_getRefererUrl());
                    }

                    if($this->getRequest()->getParam('noCheckoutYet')=="yes")
                        $this->getResponse()->setRedirect($this->_getRefererUrl());
                    else
                        $this->_redirect('checkout/cart');
                }
            }
        }
        catch (Mage_Core_Exception $e) {
            if ($this->_getSession()->getUseNotice(true)) {
                $this->_getSession()->addNotice($e->getMessage());
            } else {
                $messages = array_unique(explode("\n", $e->getMessage()));
                foreach ($messages as $message) {
                    $this->_getSession()->addError($message);
                }
            }

            $url = $this->_getSession()->getRedirectUrl(true);
            if ($url) {
                $this->getResponse()->setRedirect($url);
            } else {
                $this->_redirectReferer(Mage::helper('checkout/cart')->getCartUrl());
            }
        }
        catch (Exception $e) {
            $this->_getSession()->addException($e, $this->__('Cannot add the item to shopping cart.'));
            $this->_goBack();
        }
    }
}

Step 4 : Edit Magento/app/etc/modules/MyNameSpace_MyCheckout.xml

<?xml version="1.0"?>
<config>
    <modules>
    <MyNameSpace_Mycheckout>
            <active>true</active>
            <codePool>local</codePool>
    </MyNameSpace_Mycheckout>
    </modules>
</config>

Step 5 : Edit Magento/app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml

Add th following lines to the xml:

<camelweb_mycheckout_cart_index>
    <update handle="checkout_cart_index"/>
</camelweb_mycheckout_cart_index>

Step 6 : Add the second "Add to cart" button from the template file

Edit Magento/app/design/frontend/[myinterface]/[mytheme]/template/catalog/product/view/addtocart.phtml

<?php $_product = $this->getProduct() ?>

<?php if($_product->isSaleable()): ?>
    <div class="add-to-cart">
        <?php if(!$_product->isGrouped()): ?>
        <label for="qty"><?php echo $this->__('Qty:') ?></label>
        <input type="text" name="qty" id="qty" maxlength="12" value="<?php echo $this->getMinimalQty($_product) ?>" title="<?php echo $this->__('Qty') ?>" class="input-text qty" />
        <?php endif; ?>
        <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="productAddToCartForm.submit()"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
        <br />
        <!--The second Add to cart link-->
        <a href="<?php echo Mage::getUrl('checkout/cart/add', array('product' => $_product->getId(), 'noCheckoutYet'=>'yes')) ?>">Add to cart 2</a>
        <?php echo $this->getChildHtml('', true, true) ?>
    </div>
<?php endif; ?>

Step 7 : Be sure, that in the Administration interface "After Adding a Product Redirect to Shopping Cart" is set to Yes

Please note, that the second link will add only one product at a time.

This solution has been tested on Magento ver. 1.4.1.1

0 comments:

Post a Comment