4

MagentoでProductを作成するIntegrity制約違反(未回答)と同様の問題がありますが、このチュートリアルに基づいて、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();
    }
}

製品は、追加するカスタム製品データとともに正しく保存されます。製品が保存されると、同じ製品の後続の保存でエラーは発生しません。製品が最初に作成されたとき、エラーが発生します。

前もって感謝します

4

2 に答える 2

26

使用する代わりに$product->save()、リソース モデル a la を使用してみてください$product->getResource()->save($product)

その理由は$product->save()、すべての保存イベントを再トリガーするため、cataloginventory_stock を保存しているものを実行してエラーをスローすることです。

于 2013-01-04T07:11:17.380 に答える
1

この場合、イベントを使用しないことをお勧めします。catalog_product_save_after代わりに 、POST データが製品に適用された後、呼び出されるcatalog_product_prepare_saveに呼び出されるwhich を使用してみてください。そうすれば、保存や醜いことをいじる必要はありません! ->save()$_singletonFlag

また、Observer Event 内でHTTP Requestcatalog_product_prepare_saveオブジェクトを取得します。の必要はありません。ウット!Mage::app()->getRequest()

于 2013-07-10T15:23:32.320 に答える