当我尝试使用脚本在客户的 magento 安装上保存产品时,在调用 $product->save(); 后出现以下错误:
PHP Fatal error: Uncaught exception 'Exception' with message 'User Error: Some transactions have not been committed or rolled back
例如...
$_products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('supplier')->AddAttributeToFilter('supplier', $options[$vendor['old_supplier_name']]);
foreach($_products as $product){
$product->setData('supplier', $options[$vendor['new_supplier_name']]);
$product->save();
}
最佳答案
该错误源于以下事实:获取产品集合时,并未加载所有属性。对集合中的产品调用 save
可能会导致大问题。保存之前需要调用load
。此外,产品只能从管理商店保存。
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); //set the admin store;
$_products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('supplier')->AddAttributeToFilter('supplier', $options[$vendor['old_supplier_name']]);
foreach($_products as $product){
$product = Mage::getModel('catalog/product')->load($product->getId());
$product->setData('supplier', $options[$vendor['new_supplier_name']]);
$product->save();
}
但不要仅使用上面的代码来更新一个字段。实在是太慢了。
使用这个代替:
$_products = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('supplier')->AddAttributeToFilter('supplier', $options[$vendor['old_supplier_name']]);
Mage::getModel('catalog/product_action')->updateAttributes($_products->getAllIds(), array('supplier'=>$options[$vendor['new_supplier_name']]), 0);
现在一些解释。
updateAttributes
可用于批量更新产品属性。它需要 3 个参数。
- 要更新的产品 ID 数组
- 包含要更新的属性的数组
- 商店 ID。 0 表示默认值。
关于php - Magento 产品保存错误 事务尚未提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355367/