3

私はMagentoのコード(1.6.2 Community Edition)を調べてきましたが、OMGはひどく実行された混乱ですが、ここではそれについて怒鳴りません。

このコードを見てください:

// Delete error from item and its quote, if it was set due to qty lack
$this->_removeErrorsFromQuoteAndItem($quoteItem, Mage_CatalogInventory_Helper_Data::ERROR_QTY);

これは/app/code/core/Mage/CatalogInventory/Model/Observer.phpのMage_CatalogInventory_Model_Observerクラスに あります 行:489

これは私に特有のバグを生成します、これを試してください(「バックオーダーなし」がバックエンドに設定されていることを確認してください):

  1. カートに商品を追加する
  2. カートに別の商品を追加します。
  3. 管理者になり、カート内の要求された数量が十分でないように、最初の製品の数量を変更します。
  4. ショッピングカートのページに戻ります。

結果
最初に追加された商品には、「この数量ではリクエストされた商品はありません」というエラーが表示されますが、チェックアウト方法は引き続き表示されます。先に進むと、最終的に「要求された数量ですべてのアイテムが利用できるわけではありません」という醜いjsアラートが表示されます。

深く掘り下げると、見積もり(カート)に追加されたすべての見積もりアイテム(カートアイテム)が見積もり全体のエラー状態をリセットしているように見えます。

これは意図的なものですか?本物のバグに遭遇したことがありますか?この役に立たないコメントはどういう意味ですか?前もって感謝します。

編集:回避策と説明については、以下の回答を参照してください。

4

2 に答える 2

4

フォローアップを投稿する必要があります。私のコアハックには不幸な副作用がありました(別のバグ):

  1. アイテムを一定の数量でカートに追加します(在庫があることを確認してください)。
  2. 管理パネルに移動し、在庫を減らして、残りの数量がなくなるようにします。
  3. カートページに戻って更新すると、予期したエラーが発生します。
  4. カートを更新して、要求された数量を実際に利用可能な数量に減らしてみてください。更新が機能せず、#3のエラーが再表示されます。

したがって、この特定のロジックは、そのシナリオに必要なようです。

実際の欠陥は、見積もりエラー情報コレクションが見積もりアイテムを区別しないことです。したがって、_removeErrorsFromQuoteAndItem関数は、別の見積もりアイテムからのエラー(まだエラーになっている)を含む、すべての数量関連のエラーをカートから削除します。

コアハックなしで機能する回避策を見つけました。このイベントオブザーバーをsales_quote_item_qty_set_afterイベントに添付してください。

public function reinitQuoteErrorState(Varien_Event_Observer $observer)
{
    $item = $observer->getEvent()->getItem();
    /** @var $item Mage_Sales_Model_Quote_Item */

    $quote = $item->getQuote();
    /** @var $quote Mage_Sales_Model_Quote */

    // Quote not loaded, do nothing since our changes are transient
    if (!$quote) return;

    // Quote already has error state, nothing to do.
    if ($quote->getHasError()) return;

    foreach ($quote->getAllItems() as $quoteItem)
    {
        if ($errorItems = $quoteItem->getErrorInfos())
        {
            foreach ($errorItems as $errorItem)
            {
                if ($errorItem['code'] == Mage_CatalogInventory_Helper_Data::ERROR_QTY)
                {
                    $quote->addErrorInfo(
                        'error',
                        'cataloginventory',
                        Mage_CatalogInventory_Helper_Data::ERROR_QTY,
                        Mage::helper('cataloginventory')->__('Not all products are available in the requested quantity')
                    );

                    return;
                }
            }
        }
    }
}

:このイベントハンドラーを持つモジュールは、/ app / etc / modules /内のモジュールXMLファイルのタグ(例:/app/etc/modules/MyCompany_MyModule.xml)に追加して、このハンドラーがMage_CatalogInventory_Model_Observerの後に呼び出されるようにする必要があります。 ::checkQuoteItemQtyバグがあります。

実際の解決策は、見積もりerrorInfoシステムを修正して見積もり項目のIDを維持することですが、この回避策はコアハックなしで実行できます。

<?xml version="1.0" encoding="utf-8"?>
<config>
    <modules>
        <MyCompany_MyModule>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </MyCompany_MyModule>
    </modules>
</config>
于 2012-05-12T12:49:40.393 に答える
1

私たちも最近この問題に気づき、同様の説明を書きました。また、Raifが提供する概要( http://www.branded3.com/b3labs/magento-core-bug-multiple-basket-items-stock/)に基づいて、この問題を修正するためのモジュールをまとめました。これをモジュールに変える方法。

于 2012-07-23T08:10:07.050 に答える