我对Integrity constraint violation creating Product in Magento有类似的问题(未答复),但我正在创建一个自定义Observer,它挂钩到catalog_product_save_after事件 - 基于本教程:http://fishpig.co.uk/blog/custom-tabs-magento-product-admin.html
但是,每当保存新产品时,我都会收到此错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '22-1' for key 'UNQ_CATALOGINVENTORY_STOCK_ITEM_PRODUCT_ID_STOCK_ID'
config.xml如下所示:
<adminhtml>
<events>
<catalog_product_save_after>
<observers>
<a1web_save_product_data>
<type>singleton</type>
<class>metricimperial/observer</class>
<method>saveProductData</method>
</a1web_save_product_data>
</observers>
</catalog_product_save_after>
</events>
</adminhtml>
班级的大纲是这样的:
<?php
class A1web_MetricImperialConverter_Model_Observer
{
/**
* Flag to stop observer executing more than once
*
* @var static bool
*/
static protected $_singletonFlag = false;
* @param Varien_Event_Observer $observer
*/
public function saveProductData(Varien_Event_Observer $observer)
{
if (!self::$_singletonFlag) {
self::$_singletonFlag = true;
$product = $observer->getEvent()->getProduct();
//Custom updates made to product object here
$product->save();
}
catch (Exception $e) {
Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
}
}
}
/**
* Retrieve the product model
*
* @return Mage_Catalog_Model_Product $product
*/
public function getProduct()
{
return Mage::registry('product');
}
/**
* Shortcut to getRequest
*
*/
protected function _getRequest()
{
return Mage::app()->getRequest();
}
}
产品使用我正在添加的自定义产品数据正确保存 - 一旦产品保存,相同产品的后续保存就不会出现错误。只有在首次创建产品时才会发生错误。
提前致谢
答案 0 :(得分:26)
不要使用$product->save()
尝试使用资源模型,而是$product->getResource()->save($product)
。
$product->save()
的原因将重新触发所有保存事件,因此运行保存cataloginventory_stock并抛出错误的任何内容。
答案 1 :(得分:1)
在这种情况下,我建议使用catalog_product_save_after
事件不。相反,尝试使用{/ 1}} 将POST数据应用于产品后触发,但 catalog_product_prepare_save
之前调用。这样你就不必为了保存或丑陋->save()
而烦恼!
此外,使用$_singletonFlag
,您可以在Observer事件中获得 HTTP请求对象。无需catalog_product_prepare_save
。活泉!