我有一个像
这样的脚本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>
答案 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)
{
}
}