Mar 28, 2015
kalpesh

Magento bug – Checkout cart 500 error – Redirect loops

Magento checkout cart gives 500 error and redirect loops when there is a shopping cart rule with Category condition.

I found a bug in Magento which redirects shopping cart indefinitely causing it 500 internal server error. This can be a serious bug as customer will not able to shop if this happens. I noticed this happens when there is a shopping cart rule which have Category in conditions of the rule.

If total quantity equals or greater than 1 for a subselection of items in cart matching ALL of these conditions:
Category is 125

So for example you have a shopping cart rule where you want to give some discount or free product if at least one product is chosen from specific Category, this triggers the error in frontend shopping cart. Main reason here is Category condition. If you remove category condition then the error should go away. But if you want to keep the category condition and still want Magento to handle the shopping cart promotion rule, check the code changes below:

To solve this I copied below file to my local
app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Combine.php

and edited the function validate:

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
/**
     * Validate a condition with the checking of the child value
     * @param Varien_Object $object
     *
     * @return bool
     */
    public function validate(Varien_Object $object)
    {
        /** @var Mage_Catalog_Model_Product $product */
        $product = $object->getProduct();
        if (!($product instanceof Mage_Catalog_Model_Product)) {
            $product = Mage::getModel('catalog/product')->load($object->getProductId());
        }

        $valid = parent::validate($object);

        /* Kalpesh commented whole block, as it causes redirect loop and Segmentation fault in apache
        if (!$valid && $product->getTypeId() == Mage_Catalog_Model_Product_Type_Configurable::TYPE_CODE) {
            $children = $object->getChildren();
            //$valid = $children && $this->validate($children[0]); //Kalpesh commented, issue....
        }*/


        return $valid;
    }

Hope this helps to some troubled souls!

11 Comments

  • You saved my ass with this one!! Thank you kalpesh!!!

  • Hi,

    Thank you for this fix, I spent a few hours trying to work out what was wrong before finding this post.

    I have just discovered though, that by using this fix, it breaks the free shipping rule, have you come across this? I am using the WebShopApps ProductMatirx.

    Cheers,
    Tim

  • There is a patch for this
    https://gist.github.com/piotrekkaminski/54529dadb0bc01a62a2d

    It is marked for EE but the fix worked for us.

    app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Subselect.php

    - if (parent::validate($item)) {
    + if (Mage_Rule_Model_Condition_Combine::validate($item)) {

    • That worked for me on CE 1.9.2.0!
      Thanks!!!!

    • This saved my time. Worked great.

      Thanks For Posting.

  • Hi,

    Thanks for taking the time to post this.
    It worked on CE 1.9.2.1 :)

  • Solution not working for Magento version 1.9.2.2. Specifically for “Confugurable” products. dont know its a magento default bug or some specially third party bug. we have install all the latest “SUPEE” patches aswell. Still issue persist.

  • Dude, took me hours of googling to finally find this answer. Fantastic solution, built off of that other solution by Phil on magentoexchange that didn’t quite work. My only question is by removing this block could this mess up validation or do any unintended consequences?

    Thanks!

    • AFAIK I didn’t had any issue, but I would still recommend to do proper testing before making the change on production.

  • Hi kalpesh,

    I need your help can you please check my website where when I click add to cart button its display 500 error.

    Website link: https://www.originalswat.com/

    • Hi gautam. It’s impossible to know what the problem is without looking at the server error log. If using apache, it should be probably at /var/log/httpd/error_log or /var/log/apache2/error.log

Leave a comment

 

Welcome to my Blog

Kalpesh MehtaHelping Magento developers in their day-to-day development problems since 2011. Most of the problems and solutions here are my own experiences while working on different projects. Enjoy the blog and don't forget to throw comments and likes/+1's/tweets on posts you like. Thanks for visiting!

Certifications