1

我创建了观察者以在产品保存时在表中插入产品属性

<adminhtml>
         <events>
        <catalog_product_save_after>
                <observers>
                    <Test_price_save_product_data>
                        <type>singleton</type>
                        <class>Magetest_test_Model_Observer</class>
                        <method>saveProductAttr</method>
                    </Test_price_save_product_data>
                </observers>
        </catalog_product_save_after>
    </events>
  </adminhtml>

saveProductAttr() 当产品保存在管理端时,这会在单独的表中插入产品属性。

现在我有单独的脚本来保存 7000 多个产品,如下所示

    set_time_limit(0);
    ini_set('memory_limit','1024M');
    ini_set('display_errors', 1);
    error_reporting(1);
    require_once 'app/Mage.php';

    Mage::setIsDeveloperMode(true);
    umask(0);
    Mage::app('admin');
    Mage::register('isSecureArea', 1);
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$products = Mage::getModel('catalog/product')->getCollection()->addFieldToFilter("type_id",Mage_Catalog_Model_Product_Type::TYPE_SIMPLE);

foreach($products->getData() as $val){
    $product = Mage::getModel('catalog/product')->loadByAttribute('sku',$val['sku']);
    if ($product) 
        {   
            $product->setData('status',1);
            $product->save();
        }
}

当我运行脚本时,它会一个一个地保存产品,但它不会触发“catalog_product_save_after”观察者。因为我需要使用这个观察者在另一个表中分别插入 7000 个产品属性。

我在这方面做错了什么?好心劝告。

4

2 回答 2

0

Observer 没有触发,因为 Magento 从不加载<frontend />应用程序的区域。至于解决方案,我们可以尝试将您的观察者移至该<global />区域。只有<global />在您运行命令行脚本时才会触发事件。

<global>
         <events>
        <catalog_product_save_after>
                <observers>
                    <Test_price_save_product_data>
                        <type>singleton</type>
                        <class>Magetest_test_Model_Observer</class>
                        <method>saveProductAttr</method>
                    </Test_price_save_product_data>
                </observers>
        </catalog_product_save_after>
    </events>
  </global>
于 2013-06-18T10:31:23.337 回答
0

这可能是因为产品没有被修改。在 Mage/Core/Model/Abstract.php 文件中,函数“save()”有以下代码 if (!$this->_hasModelChanged()) { return $this; }

如果您编辑该产品的任何字段:setData("name", "test");它将起作用。

于 2015-11-25T13:15:28.597 回答