我想在所有产品中显示一个新的选择属性选项。
我的产品每个都使用名为“bracket_size”的选择框属性。该属性有三个选项:
(/管理/ catalog_product_attribute /编辑/)
大多数产品只选择了两个选项:
(/管理/ catalog_product /编辑/)
如果我在该屏幕中选择“18mm”,则会在前端显示。
我想创建一个升级脚本,将所有产品设置为显示“18mm”选项。
我一直在选择所有产品,获取它们并更新它们的属性值:
$options = Mage::getSingleton('eav/config')->getAttribute('catalog_product', 'bracket_size')->getSource()->getAllOptions(false);
$option18mmId = $options[0]['value'];
foreach (Mage::getModel('catalog/product')->getCollection() as $product) {
// Get a writable product
$product = Mage::getModel('catalog/product')->load($product->getId());
// All products in these attribute sets should have bracket sizes
$bracketSizeValue = $product->getBracketSize(); // string containing option IDs - something like '645,345'
if (isset($bracketSizeValue)) {
// Get options currently selected for this product
$optionIds = explode(',', $bracketSizeValue);
// Check if the option is already included in this product
if (!in_array($option18mmId, $optionIds)) {
// If not, rebuild the attribute value to add it
array_unshift($optionIds, $option18mmId);
// Add it back to the product
$product->setData('bracket_size', implode(',', $optionIds));
$product->save();
}
}
}
但这不起作用。它抛出一个错误:
Warning: Invalid argument supplied for foreach() in /.../public/app/code/core/Mage/Eav/Model/Entity/Abstract.php on line 1068
在$product->save()
行。
我该怎么做?
答案 0 :(得分:1)
如果您尝试在设置/更新脚本中保存产品,则需要先禁用更新模式并设置当前商店ID:
$app = Mage::app();
$app->setUpdateMode(false);
$app->setCurrentStore($app::ADMIN_STORE_ID);
理想情况下,它会在保存之前完成,然后在保存后重新恢复:
$app->setCurrentStore(null);
$app->setUpdateMode(true);
然后,您还可以优化代码,删除每个产品的加载和保存,并在收集项目上进行。
加载具有所需属性的集合:
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToSelect('bracket_code');
保存对收集项目的更改:
$collection->save();