为什么magento在上次添加的报价项没有错误时从销售报价中删除错误信息

时间:2012-04-24 11:47:54

标签: magento

我一直在查看Magento的代码(1.6.2社区版),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);

哪个位于 Mage_CatalogInventory_Model_Observer 类中 的 /app/code/core/Mage/CatalogInventory/Model/Observer.php 行:489

这给我带来了一个特殊的错误,试试这个(确保在后端设置“没有延迟”):

  1. 将产品添加到购物车
  2. 将另一个产品添加到购物车。
  3. 进入管理员并更改第一个产品数量,以使购物车中的请求数量不足。
  4. 返回购物车页面。
  5. 结果
    添加的第一个产品显示“请求的项目在此数量中不可用”错误,但仍显示Checkout方法!继续前进,最终给出一个丑陋的js警报说“并非所有项目都在请求的数量中可用”。

    深入挖掘我看到似乎每个报价项目(购物车项目)都添加到报价(购物车)中,重置整个报价的错误状态。

    这是故意的吗?我偶然发现了一个真正的错误吗? 这个无用的评论是什么意思? 提前谢谢。

    编辑:请参阅以下答案以获取解决方法和解释。

2 个答案:

答案 0 :(得分:4)

我必须发布一个跟进,我的核心黑客有一个不幸的副作用(另一个错误):

  1. 将商品添加到购物车中并保留一定数量(确保库存)。
  2. 进入管理面板并减少库存,以便不再使用剩余数量。
  3. 返回购物车页面并刷新,您会收到预期的错误。
  4. 尝试更新购物车并将请求的数量减少到实际可用的数量,您会注意到更新不起作用,#3中的错误会重新显示。
  5. 显然,这种特殊逻辑对于那种情况是必要的。

    实际缺陷是报价错误信息集合不区分报价项目。因此,_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系统以维护报价项目标识,但是这种解决方法将没有任何核心攻击。

    <?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>
    

答案 1 :(得分:1)

我们最近也注意到了这个问题并写了类似的解释。我们还根据Raif提供的大纲(http://www.branded3.com/b3labs/magento-core-bug-multiple-basket-items-stock/ - 组建了一个模块来解决这个问题 - 对于那些不确定如何将其变成模块的人来说。