我必须发布一个跟进,我的核心黑客有一个不幸的副作用(另一个错误):
- 将一定数量的商品添加到购物车(确保有货)。
- 进入管理面板并减少库存,以便不再有剩余数量。
- 返回购物车页面并刷新,您会收到预期的错误。
- 尝试更新购物车并将请求的数量减少到实际可用的数量,您会注意到更新不起作用并且重新显示来自 #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有错误。
真正的解决方案是修复报价错误信息系统以维护报价项目身份,但这种解决方法无需任何核心黑客攻击即可。
<?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>