フォローアップを投稿する必要があります。私のコアハックには不幸な副作用がありました(別のバグ):
- アイテムを一定の数量でカートに追加します(在庫があることを確認してください)。
- 管理パネルに移動し、在庫を減らして、残りの数量がなくなるようにします。
- カートページに戻って更新すると、予期したエラーが発生します。
- カートを更新して、要求された数量を実際に利用可能な数量に減らしてみてください。更新が機能せず、#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>