我在使用一个应该按网站更新价格的模块时遇到了问题。
在我的模块顶部,我有:
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
这应该意味着当我调用模块(该模块有一个前端)时,我可以以“管理员”身份更新价格等。然而,这并没有发生。目前,我已经做了一些绝望的努力来让它工作 - 看看数字格式是否会出错或索引未重新索引、缓存问题和其他任何问题。
以下代码片段实际上产生了正确的数字,但它只是没有保存到数据库中。有什么想法吗?
$product = Mage::getModel('catalog/product')->
setStoreId($storeId)->setWebsiteId($websites[$store])->
loadByAttribute('sku',$price['SKU']);
$oldprice=(float)str_replace(",","",$product->getPrice());
if($newprice!=$oldprice) {
Mage::log($product->getPrice());
$product->setPrice(number_format($newprice,4,".",""));
Mage::log($product->getPrice());
$product->getResource()->saveAttribute($product, 'price');
$product->save();
Mage::log($product->getPrice());
unset($product);
}
假设您正在使用模块类中的方法更新产品价格,示例代码如下:-
public function updateProductPrices ($sku, $newPrice) {
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$websites = Mage::app()->getWebsites();
$product = Mage::getModel('catalog/product')
$productId = $product->getIdBySku($sku);
foreach ($websites as $_eachWebsite) {
$_websiteId = $_eachWebsite->getWebsiteId();
$websiteObj = new Mage_Core_Model_Website();
$websiteObj->load($_websiteId);
$storeIds = $websiteObj->getStoreIds();
if (count($storeIds)) {
foreach ($storeIds as $_eachStoreId) {
$product->setStoreId($_eachStoreId)
->load($productId);
$oldPrice = $product->getPrice();
if ($oldPrice != $newPrice) {
$product->setPrice($newPrice);
$product->save();
}
}
}
unset($storeIds, $websiteObj, $_websiteId);
}
unset($product);
}
希望有帮助。
尝试:
$product->setPrice($newprice)->save();
我遇到了类似的问题,我认为知识渴望的答案中有一个错误。该代码实际上不会针对每个网站进行更新,而是为每个网站更新一个唯一的价格
我所说的错误实际上是用类似的代码发生在我身上的,并且其他产品属性将与默认值取消链接(至少,这是发生在我身上的事情)。
以下是基于Knowledge Craving的解决方案的建议,我只是修改了一点
public function updateProductPrices ($sku, $newPrice, $websiteId) {
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
$product = Mage::getModel('catalog/product')
$productId = $product->getIdBySku($sku);
$websiteObj = new Mage_Core_Model_Website();
$websiteObj->load($websiteId);
$storeIds = $websiteObj->getStoreIds();
if (count($storeIds)) {
foreach ($storeIds as $_eachStoreId) { //Does it need to do for each storeview, price being anyway website scope?
$product->load($productId);
$oldPrice = $product->getPrice();
if ($oldPrice != $newPrice) { //actually, this if would not be necessary as you anyway want to update, right?
$product->setStoreId($_eachStoreId)
->setPrice($newPrice)
->save();
}
}
}
unset($productId, $storeIds, $websiteObj, $product);
}