Magento Enterprise 1.14.1.0 - Regras de preço do carrinho de compras - Promoção - Erro fatal Nível máximo de aninhamento de funções atingido

8

Venho brincando com as Regras de preço do carrinho de compras para Magento Enterprise 1.14.1.0 e deparei com um problema.

Eu estava tentando criar uma regra simples para que você recebesse um desconto de 10 libras se comprasse três itens de uma categoria definida e gastasse mais de 15 libras. Veja minha configuração abaixo.

Informações sobre regras Condições Ações

Na minha cesta, tenho 3 itens da categoria com identificação 5e 1 item da categoria com identificação 3.

Quando ativo essa regra e visualizo minha cesta, recebo o erro fatal. Aqui está uma seção do rastreamento de pilha. Como você pode ver, eu já subi xdebug.max_nesting_levelpara níveis horríveis.

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

Quando removo a If total quantity is 3seção do ConditionMagento, ele não fica mais assustado. Alguém poderia me indicar a maneira correta de configurar esta promoção, bem como esclarecer por que estou fatalizando?

Esta é uma instalação de baunilha do Magento, e estou preocupado por poder quebrar o carrinho de compras com tanta facilidade.

Atualizar

Estou executando o mysql como

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

E PHP como

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

Atualização 2

Um dump de banco de dados está disponível aqui, chega a ~ 130kb.

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

  • Foi criado com o mysql executando-o como root @ localhost sem senha
  • O nome de usuário do painel de administração Magento é admine a senha épassword1
  • Você precisa atualizar o web/unsecure/base_urle web/secure/base_urlem core_config_dataque ponto a sua instalação instância.

Replicar

  1. Como hóspede, adicione 1 Bowler Verde ao seu carrinho
  2. Adicione 3 Botas Verdes ao seu carrinho
  3. Espero ter um erro horrível como eu estou vendo
Luke Rodgers
fonte
Recriei suas mesmas regras de carrinho de compras e consegui aplicar sem problemas em uma instalação vanilla 1.41.1.0. Quais tipos de produtos você está tentando adicionar ao carrinho para acionar a regra? Você já tentou fazer um re-índice completo e / ou adicionar qualquer código de depuração, particularmente no github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER
Ambos os produtos são configuráveis. Acabei de executar um magerun index:reindex:alle não fez diferença. Estou super ocupado hoje e amanhã no trabalho, mas se você ainda não conseguir replicar, poderei fornecer um despejo de banco de dados na quinta-feira, se isso for bom?
Luke Rodgers
Um despejo de banco de dados ajudaria, desde que não seja muito grande. Desde a versão 1.14.1.0, estou ciente e já experimentei algumas esquisitices com as regras promocionais. É possível que seja um bug.
B00MER
Legal, eu vou conseguir isso em algumas horas. Obrigado.
Luke Rodgers
Verifique as atualizações da postagem. Tem um link para o dump do banco de dados e algumas notas.
Luke Rodgers

Respostas:

7

levou a mudança para mergulhar nisso. Instalou um Magento Enterprise 1.14.1.0 limpo

Sua regra ainda quebra sem o primeiro >15 rule...

Sua origem está na subseleção do produto.

Essas duas funções estão se chamando repetidamente.

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

Mais específico:

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()

Como você pode ver, se o produto é configurável (o que realmente vale para os dois produtos), chame a função estendida novamente. E assim por diante, e assim por diante, e assim por diante ...

Na verdade, é um bug do Magento porque não verifica se é um item válido passado para a função.

Normalmente, a função é chamada com Mage_Sales_Model_Quote_Addresse na recursão com, Mage_Sales_Model_Quote_Itempara que possamos criar uma correção para ela. Ambos também têm uma função getQuote ().

Se você deseja resolvê-lo no seu caso, é feito adicionando essas linhas de árvore.

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

Você pode copiar este arquivo para app / code / local / Mage / SalesRule / Model / Rule / Condition / Product / Subselect.php

Portanto, minha última verificação é para ver se isso também se aplica ao Magento CE 1.9.1.0. Esse também é o caso porque a função pai é implementada na edição da CE. Magento CE 1.9.0.1 não é afetado, ele não tem a função pai! Então, acho que o Magento EE 1.13.1.0 também está livre disso, porque eles são inerentes um ao outro.

Você deve criar um ticket na sua conta do Magento Enterprise e fornecer as informações para que eles possam fazer um patch para isso.

Jeroen
fonte
Assim, é no Magento CE 1.9.1.0 e acima, eu perdi a última vez ... estranho ... Vou registrar um bug no Magento's
Jeroen
2
Arquivado um bug
Jeroen