Magento Enterprise 1.14.1.0-购物车价格规则-促销-致命错误达到最大功能嵌套级别


8

我一直在玩Magento Enterprise 1.14.1.0的购物车价格规则,偶然发现了一个问题。

我正在尝试创建一条简单的规则,如果您从定义的类别中购买任意3件商品,并且花费超过15英镑,您将获得10英镑的折扣。请参阅下面的配置。

规则信息 条件 动作

在我的购物篮中,我有id类别的3个项目和id类别的51个项目3。

启用此规则并查看购物篮时,会收到致命错误。这是堆栈跟踪的一部分。如您所见,我已经提高xdebug.max_nesting_level到了令人恐惧的水平。

Fatal error: Maximum function nesting level of '18000' reached, aborting! in /dev/builds/1_14_1_0/lib/Varien/Object.php on line 344 Call Stack:
0.0003 348680 1. {main}() /dev/builds/1_14_1_0/index.php:0
0.0020 694956 2.Mage::run() /dev/builds/1_14_1_0/index.php:89
0.0068 1819640 3.Mage_Core_Model_App->run() /dev/builds/1_14_1_0/app/Mage.php:684
0.0509 9129168 4.Mage_Core_Controller_Varien_Front->dispatch() /dev/builds/1_14_1_0/app/code/core/Mage/Core/Model/App.php:354
0.0626 11074424 5. Mage_Core_Controller_Varien_Router_Standard->match() /dev/builds/1_14_1_0/app/code/core/Mage/Core/Controller/Varien/Front.php:172
0.0658 11765288 6. Mage_Core_Controller_Varien_Action->dispatch() /dev/builds/1_14_1_0/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250
0.1314 16963044 7. Mage_Checkout_CartController->indexAction() /dev/builds/1_14_1_0/app/code/core/Mage/Core/Controller/Varien/Action.php:418
0.3065 27313592 8. Mage_Checkout_Model_Cart->save() /dev/builds/1_14_1_0/app/code/core/Mage/Checkout/controllers/CartController.php:144
0.3195 28006864 9. Mage_Sales_Model_Quote->collectTotals() /dev/builds/1_14_1_0/app/code/core/Mage/Checkout/Model/Cart.php:458
0.3827 32507432 10. Mage_Sales_Model_Quote_Address->collectTotals() /dev/builds/1_14_1_0/app/code/core/Mage/Sales/Model/Quote.php:1331
0.6151 37466752 11. Mage_SalesRule_Model_Quote_Freeshipping->collect() /dev/builds/1_14_1_0/app/code/core/Mage/Sales/Model/Quote/Address.php:1013
0.6245 37839108 12. Mage_SalesRule_Model_Validator->processFreeShipping() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Quote/Freeshipping.php:74
0.6247 37839784 13. Mage_SalesRule_Model_Validator->_canProcessRule() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Validator.php:249
0.6282 37960924 14. Mage_Rule_Model_Abstract->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Validator.php:223
0.6418 38895940 15. Mage_Rule_Model_Condition_Combine->validate() /dev/builds/1_14_1_0/app/code/core/Mage/Rule/Model/Abstract.php:353
0.6420 38896372 16. Mage_SalesRule_Model_Rule_Condition_Product_Subselect->validate() /dev/builds/1_14_1_0/app/code/core/Mage/Rule/Model/Condition/Combine.php:307
0.6421 38896772 17. Mage_SalesRule_Model_Rule_Condition_Product_Combine->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Subselect.php:117
0.6428 38898084 18. Mage_SalesRule_Model_Rule_Condition_Product_Subselect->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Combine.php:219
0.6429 38898484 19. Mage_SalesRule_Model_Rule_Condition_Product_Combine->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Subselect.php:117
0.6433 38898572 20. Mage_SalesRule_Model_Rule_Condition_Product_Subselect->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Combine.php:219
0.6434 38898972 21. Mage_SalesRule_Model_Rule_Condition_Product_Combine->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Subselect.php:117
0.6439 38899060 22. Mage_SalesRule_Model_Rule_Condition_Product_Subselect->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Combine.php:219
0.6440 38899460 23. Mage_SalesRule_Model_Rule_Condition_Product_Combine->validate() /dev/builds/1_14_1_0/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product/Subselect.php:117

当我从那时的Magento中删除该If total quantity is 3部分时,它Condition不再是怪胎了。有人可以指出正确的方式来配置此促销活动,并阐明为什么我会致命吗?

这是Magento的香草装置,我担心我这么容易折断购物车。

更新资料

我正在运行mysql

Server version: 5.5.41-0ubuntu0.12.04.1 (Ubuntu)

和PHP一样

PHP 5.3.10-1ubuntu3.15 with Suhosin-Patch (cli) (built: Oct 29 2014 12:16:30) 
    Copyright (c) 1997-2012 The PHP Group
    Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
        with the ionCube PHP Loader v4.0.10, Copyright (c) 2002-2011, by ionCube Ltd., and
        with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

更新2

数据库转储位于此处,约为130kb。

http://www.lukerodgers.co.uk/files/vanilla_1_14_1_0.sql.gz

  • 是使用mysql创建的,以root @ localhost的身份运行,没有密码
  • Magento管理控制台的用户名是admin,密码是password1
  • 你将需要更新web/unsecure/base_url,并web/secure/base_url在core_config_data以指向您的安装实例。

复制

  1. 作为客人,在您的购物篮中添加1个绿色礼帽
  2. 然后将3个绿色靴子放入您的购物篮
  3. 希望我看到一个可怕的错误

我重新创建了相同的购物车规则,并且能够在Vanilla 1.41.1.0安装上毫无问题地应用。您尝试将哪些产品类型添加到购物车以触发规则?您是否尝试过做一个全面的重新指数和/或添加任何调试代码,特别是github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/...
— B00MER

两种产品都是可配置的。我只是跑了一个magerun index:reindex:all,没有什么区别。我今天和明天都在忙碌,但是如果您仍然无法复制,那么在星期四我可以提供数据库转储,如果这样好?
— 路加·罗杰斯

数据库转储会有所帮助,只要它不是很大即可。自从我知道最新的1.14.1.0版本以来,并且在促销规则方面也遇到了一些奇怪的问题。可能是一个错误。
— B00MER 2015年

太好了,我会在几个小时内为您解决。谢谢。
— 路加·罗杰斯

检查帖子的更新。它具有指向数据库转储的链接和一些注意事项。
— 路加·罗杰斯

Answers:


7

拿了零钱深入研究。安装了干净的Magento Enterprise 1.14.1.0

您的规则仍然没有第一个就打破>15 rule...

它的起源在产品子选择中。

这两个函数反复调用自己。

Mage_SalesRule_Model_Rule_Condition_Product_Combine->validate()
Mage_SalesRule_Model_Rule_Condition_Product_Subselect->validate()

更详细:

Mage_SalesRule_Model_Rule_Condition_Product_Subselect:118

foreach ($object->getQuote()->getAllVisibleItems() as $item) {
    if (parent::validate($item)) { // Call parent

Mage_SalesRule_Model_Rule_Condition_Product_Combine:216

$valid = parent::validate($object);
if (!$valid && $product->getTypeId() == Mage_Catalog_Model_Product_Type_Configurable::TYPE_CODE) {
    $children = $object->getChildren();
    $valid = $children && $this->validate($children[0]); // call upper function, I not aware I'm really calling Product_Select::validate()

如您所见,如果产品是可配置的(两种产品都适用),则再次调用扩展功能。等等,等等,等等,等等。

这确实是一个Magento错误,因为它不会检查它是否是传递给该函数的有效项目。

通常情况下,该函数是通过Mage_Sales_Model_Quote_Address和一起调用的,Mage_Sales_Model_Quote_Item因此我们可以为其构建修复程序。两者都有一个getQuote()函数。

如果您要解决此问题,可以通过添加这些树线来解决。

Mage_SalesRule_Model_Rule_Condition_Product_Subselect

/**
 * validate
 *
 * @param Varien_Object $object Quote
 * @return boolean
 */
public function validate(Varien_Object $object)
{
    // Check if recursion is the case, ask parent to handle
    // *** START FIX
    if ($object instanceof Mage_Sales_Model_Quote_Item) {
        return parent::validate($object);
    }
    // *** END FIX

    if (!$this->getConditions()) {
        return false;
    }

您可以将此文件复制到app / code / local / Mage / SalesRule / Model / Rule / Condition / Product / Subselect.php

因此,我的最后检查是查看它是否也适用于Magento CE 1.9.1.0。情况也是如此,因为父功能是在CE版本中实现的。Magento CE 1.9.0.1不受影响,它没有父功能!所以我猜想Magento EE 1.13.1.0也是免费的,因为它们是彼此固有的。

您应该在您的Magento Enterprise帐户中创建一个票证并提供信息,以便他们可以为此打补丁。


因此,它是在Magento CE 1.9.1.0及以上,我已经错过了最后一次... ...怪文件会在Magento的错误
— 吉荣

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.