Magento Enterprise 1.14.1.0 - Правила цен в корзине - Акция - Неустранимая ошибка Достигнут максимальный уровень вложенности функций

8

Я играл с Правилами цен в корзине для Magento Enterprise 1.14.1.0 и натолкнулся на проблему.

Я пытался создать простое правило, чтобы вы получали скидку в 10 фунтов стерлингов, если вы покупаете 3 любых предмета из определенной категории и потратили более 15 фунтов стерлингов. Смотрите мою конфигурацию ниже.

Информация о правиле условия действия

В моей корзине 3 предмета из категории с идентификатором 5и 1 предмет из категории с идентификатором 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

Когда я удаляю If total quantity is 3раздел из Conditionтогдашнего Magento, больше не волнуюсь. Может ли кто-нибудь указать мне, как правильно настроить эту акцию, а также пролить свет на то, почему я фатален?

Это ванильная установка 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

Дамп базы данных доступен здесь, его размер составляет ~ 130 КБ.

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 Green Bowler в корзину
  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
Круто, я сделаю это для тебя через несколько часов. Спасибо.
Люк Роджерс
Проверьте обновления на пост. Там есть ссылка на дамп БД и несколько заметок.
Люк Роджерс

Ответы:

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;
    }

Вы можете скопировать этот файл в приложение / 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's
Jeroen