产品属性未在观察者中更新

时间:2014-06-03 15:18:57

标签: magento magento-1.7 magento-1.8

我有一个像

这样的脚本
require_once('app/Mage.php'); //Path to Magento
umask(0);
Mage::app("default");
Mage::app ()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$productCollection = Mage::getResourceModel('catalog/product_collection');
$productCollection->addAttributeToSelect('*');
$productCollection->addAttributeToFilter('sku','headlight1');
$productCollection->load();

foreach($productCollection as $_product) 
{     
   echo $_product->getPrice();   
        echo "----";
   echo $_product->getwholesaleprice(); 
        echo "<br>";

   $wholesalePrice = (float)(($_product->getPrice())*5)/100;
   echo "Wholesale price>>>".$wholesalePrice;
   echo "<br><br>";

    $product = Mage::getModel('catalog/product')->load($_product->getEntityId());
    $product->setData('wholesaleprice', $wholesalePrice)->getResource()->saveAttribute($product, 'wholesaleprice'); 
} 

这在magento root中运行良好,但相同的代码在catalog_product_save_before事件的Observer中不起作用。

在config.xml中,我有以下代码

<?xml version="1.0"?>
<config>
    <modules>
        <Namespace_Priceupdate>
            <version>1.0.0</version>
        </Namespace_Priceupdate>
    </modules>
   <global>
        <models>
            <priceupdate>
                <class>Namespace_Priceupdate_Model</class>
            </priceupdate>            
        </models>     
        <events>        
             <catalog_product_save_before>
                <observers>
                     <priceupdate>
                        <type>singleton</type>
                        <class>Namespace_Priceupdate_Model_Observer</class>
                        <method>updateWholeSalePrice</method>
                     </priceupdate>
                </observers>
            </catalog_product_save_before>       
        </events>       
   </global>            
</config>

2 个答案:

答案 0 :(得分:3)

我认为你的代码在观察者中起作用,但有一个问题。您正在观察catalog_product_save_before并在那里创建产品的其他实例

$product = Mage::getModel('catalog/product')->load($_product->getEntityId());

并对其进行更改。并且您的更改将保存在数据库中 但是产品的当前实例(传递给观察者的实例)并不知道您所做的更改。它仍然包含旧数据,这些旧数据将保存在刚修改的值上。

我认为您应该在观察者中使用此代码。

public function updateWholeSalePrice($observer) {
    $product = $observer->getEvent()->getProduct();
    $_product->getPrice();   
    $_product->getWholesaleprice(); 
    $wholesalePrice = (float)(($_product->getPrice())*5)/100;
    $product->setWholesaleprice($wholesalePrice);
}

上面的代码意味着您只需修改属性wholesaleprice的值,然后让magento使用此新值进行保存。

答案 1 :(得分:1)

要加载观察者,您需要设置以下文件

config.xml文件

<global>
        <events>
            <catalog_product_save_before>
                <observers>
                    <npm_product>
                        <type>singleton</type>
                        <class>Npm_Product_Model_Observer</class>
                        <method>before_product_save</method>
                    </npm_product>
                </observers>
            </catalog_product_save_before>
        </events>
<global>

和observer.php

<?php
class Npm_Product_Model_Observer extends Varien_Event_Observer
{
    public function before_product_save($observer)
    {
    }
}