以编程方式保存产品时,我遇到了问题。
在产品集合或模型(按属性)的帮助下加载产品,设置一些值然后保存它,我会失去等级和组价格。
$productList = Mage::getModel ( 'catalog/product' )->getCollection ()
->addFieldToFilter('color', $color)
->load();
foreach($productList as $product) {
$product->setColor($newColor);
$product->save();
}
可以通过执行以下操作之一来解决此问题:
1.Reroad每个产品:
$productList = Mage::getModel ( 'catalog/product' )->getCollection ()
->addFieldToFilter('color', $color)
->load();
foreach($productList as $product) {
$product = Mage::helper('catalog/product')->getProduct($product->getId());
$product->setColor($newColor);
$product->save();
}
2.Load tier and group price(source):
$productList = Mage::getModel ( 'catalog/product' )->getCollection ()
->addFieldToFilter('color', $color)
->load();
foreach($productList as $product) {
$product->getTierPrice();
$product->getGroupPrice();
$product->setColor($newColor);
$product->save();
}
重新加载的最小变量(例如)层价格属性(从Mage_Catalog_Model_Product_Type_Price :: getTierPrice()中提取:
$attribute = $product->getResource()->getAttribute('tier_price');
if($attribute){
$attribute->getBackend()->afterLoad($product);
}
3.添加虚拟值(来源):
$productList = Mage::getModel ( 'catalog/product' )->getCollection ()
->addFieldToFilter('color', $color)
->load();
foreach($productList as $product) {
$product->setTierPrice ( array (
'website_id' => 0,
'cust_group' => 2,
'price_qty' => 3,
'price' => 10
) );
$product->setGroupPrice ( array (
'website_id' => 0,
'cust_group' => 2,
'price' => 10
) );
$product->setColor($newColor);
$product->save();
}
所有这些变通方法都有一个问题:更多的数据库调用。 当经常运行更新大量产品的脚本时,只有不的更多数据库调用才能丢失层和组价格。
可以在构建集合时添加层级价格:
$productList = Mage::getModel ( 'catalog/product' )->getCollection ()
->addFieldToFilter('color', $color)
->addTierPriceData()
->load();
foreach($productList as $product) {
$product->setColor($newColor);
$product->save();
}
但是通过这样做,在保存时会出现约束违规错误。在这种情况下,Magento似乎试图再次保存完全相同的等级价格。
是否有人知道在产品集合使用的同一查询中加载层和组价格的解决方案,并且在保存时不会触发约束违规?
我还在StackExchange的Magento部分发布了这个问题: https://magento.stackexchange.com/questions/51848/saving-product-deletes-tier-price-and-group-price