Magento Enterprise 1.14.1.0-ショッピングカートの価格ルール-プロモーション-致命的なエラー関数のネストレベルが最大に達しました


8

私はMagento Enterprise 1.14.1.0のショッピングカート価格ルールをいじってみましたが、問題に遭遇しました。

定義されたカテゴリから3つのアイテムを購入し、15ポンド以上使った場合、10ポンドの割引が適用されるような単純なルールを作成しようとしました。以下の私の設定を参照してください。

ルール情報 条件 行動

私のバスケットには、IDのカテゴリーから3つのアイテムと、ID 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セクションをそのセクションから削除すると、ConditionMagentoが異常動作しなくなりました。誰かがこのプロモーションを構成する正しい方法を教えてくれたり、なぜ私が致命的であるのかについていくつかの光を当てることができますか?

これは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 kbで提供されます。

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. うまくいけば、私が見ているような恐ろしいエラーがあります

私は同じショッピングカートルールを再作成し、バニラ1.41.1.0インストールに問題なく適用できました。ルールをトリガーするためにカートに追加しようとしている商品タイプはどれですか。特にgithub.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…に
B00MER

どちらの製品も構成可能です。私は走っただけでmagerun index:reindex:all違いはありませんでした。私は今日も明日も仕事で忙しいですが、それでも複製に失敗した場合は、木曜日にDBダンプを提供できます。
ルークロジャース

それが非常に大きくない限り、DBダンプが役に立ちます。1.14.1.0が最新であるため、私は認識しており、プロモーションルールでもいくつかの奇妙な点を経験しています。バグである可能性があります。
B00MER 2015

クールです。数時間でお届けします。ありがとうございました。
ルークロジャース

投稿の更新を確認してください。DBダンプへのリンクといくつかのメモがあります。
ルークロジャース

回答:


7

これに飛び込むために変更を取った。クリーンなMagento Enterprise 1.14.1.0をインストールしました

あなたのルールはまだ最初のものなしで破り>15 ruleます...

その起源は製品のサブセレクションにあります。

自分自身を繰り返し呼び出すこれら2つの関数。

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's
Jeroen

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.