1

我进行了一项新的批量操作,以根据算法刷新所选产品的某些属性。

我需要触发“catalog_product_save_before”,就好像我通过标准管理产品创建/版本保存我的产品一样。

非常感谢你的帮助。

代码示例:

<catalog_product_save_before>
    <observers>
        <SaponeWebConcept_AttributeToCategories>
            <type>singleton</type>
            <class>attributetocategories/observer</class>
            <method>beforeSave</method>
        </SaponeWebConcept_AttributeToCategories>
    </observers>
</catalog_product_save_before>

它在哪里工作(标准产品创建/版本)

$event = $observer->getEvent();
$product = $event->getProduct();
//And then I edit my product

没有的地方:我得到了我的$productID,加载它,然后保存,但上面的代码没有被触发。

$product = Mage::getModel('catalog/product')->load($productID);
//Some verifications
$product->save();

$productID设置在一个 foreach 中,我在其中获得了产品网格的所有选定产品 ID。

4

3 回答 3

2

大规模行动不会触发 catalog_product_save_before 事件。改用 catalog_product_attribute_update_before 事件,然后执行嵌套产品加载/保存

我只是在我的 magento 1.6.2 代码中完成了它,它运行良好。循环遍历产品 ID { $product = Mage::getModel('catalog/product')->load($productID); ...一些代码... $product->save(); }

确保在嵌套 $product->save() 调用之前设置对产品的所有重要更改,以便此事件处理程序具有正确状态的所有产品属性

于 2013-09-25T18:12:59.320 回答
0

我没有在代码中查找它,但我猜你的大规模行动根本没有触发保存。据我所知,集体行动保存会跳转到与常规保存相同的保存模型方法。

于 2013-06-12T22:39:52.177 回答
0

您需要调用setDataChanges()产品对象上的方法以指示某些内容已经/将要更改。

这是我的代码中的一个简单示例:

Mage::getModel('catalog/product')->load($productId)->setDataChanges(true)->save();

这本身看起来有点奇怪,但我有一个观察者,它会在产品保存方面发挥一些作用。

如果您看一下,Mage_Core_Model_Abstract::save()您可以看到它检查是否需要保存产品:

if (!$this->_hasModelChanged()) {
    return $this;
}

因此,如果您没有对产品进行任何更改或没有告诉它有数据更改,那么它假定没有任何内容可保存并且catalog_product_save_before不会被触发。

于 2014-01-13T16:44:30.470 回答