以编程方式更新Magento中的产品价格 - 为foreach()

时间:2016-03-17 18:25:16

标签: php magento

我正在尝试以编程方式更新自定义模块中的产品价格。这是我的代码:

Mage::setIsDeveloperMode(true); // for debug only
try
{
    $product = Mage::getModel('catalog/product')->load($productId);
    $product->setPrice($newPrice);
    $product->save();
}
catch (Exception $ex)
{
    echo "Error: ". $ex->getMessage();
}

执行此代码时,我得到以下异常:

  

警告:为foreach()提供的参数无效   /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php   在1180行

system.log文件中,我看到了所有这些条目:

  

2016-03-17T18:01:06 + 00:00 ERR(3):警告:提供的参数无效   for foreach()in   /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php   在线1180 2016-03-17T18:01:06 + 00:00 ERR(3):可恢复的错误:   争论3传递给   Mage_Catalog_Model_Resource_Abstract :: _ canUpdateAttribute()必须是   类型数组,null给定,调用   /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php   在1225行并定义于   /home/www-data/public_html/app/code/core/Mage/Catalog/Model/Resource/Abstract.php   543号线2016-03-17T18:01:06 + 00:00 ERR(3):可恢复错误:   争论3传递给   Mage_Eav_Model_Entity_Abstract :: _ canUpdateAttribute()必须是   type array,null给定,调用   /home/www-data/public_html/app/code/core/Mage/Catalog/Model/Resource/Abstract.php   在545行并在中定义   /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php   在1254号线2016-03-17T18:01:06 + 00:00 ERR(3):警告:   array_key_exists()期望参数2为数组,在给定的位置为null   /home/www-data/public_html/app/code/core/Mage/Eav/Model/Entity/Abstract.php   在第1256行

知道可能导致这种情况的原因是什么?我的dev magento设置上的相同代码有效,但在生产magento中,这个错误开始出现,所以我有点困惑。

4 个答案:

答案 0 :(得分:18)

您可以尝试设置商店:

法师::应用程序() - > setCurrentStore(Mage_Core_Model_App :: ADMIN_STORE_ID);

答案 1 :(得分:1)

尝试以下代码。需要通过商店ID。这似乎是问题所在。

$array_product = array($productId);
Mage::getSingleton('catalog/product_action')->updateAttributes($array_product, array('price' => $newPrice), $storeId);

答案 2 :(得分:0)

$storeId='store_id';

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

$productIds = array('products_ids');

$products = Mage::getModel('catalog/product')->getCollection();
$products->addStoreFilter();
$products->addAttributeToSelect('*');
$products->addAttributeToFilter('entity_id', array('in' => $productIds));
foreach($products as $product)
{
    $price=$product->setPrice('price');
    Mage::app()->setCurrentStore($storeId);
    $product->save(); 
}

试试这段代码,它对我有用。

答案 3 :(得分:-1)

如果您以编程方式更新产品,请尽量注意,然后尽量避免使用magento保存功能,这对于单个产品来说是完美的,但是当您使用大量产品时,它会使您的网站变慢。请使用我的下面的代码然后通过SSH重新索引magento。它会对你有用。

$write = Mage::getSingleton('core/resource')->getConnection('core_write');


$write->query("
                      UPDATE catalog_product_entity_decimal val
                      SET  val.value = (".$productPrice['Price'].")
                      WHERE  val.attribute_id = (
                         SELECT attribute_id FROM eav_attribute eav
                         WHERE eav.entity_type_id = 4 
                           AND eav.attribute_code = 'price'
                        )
                        AND val.entity_id = '".$product->getId()."'
                    ");