1

我想在所有产品中显示一个新的选择属性选项。

我有每个产品都使用一个名为“bracket_size”的选择框属性。该属性具有三个选项:

支架尺寸选项

(/admin/catalog_product_attribute/edit/)

大多数产品只选择了以下两个选项:

产品属性配置

(/admin/catalog_product/edit/)

如果我在该屏幕中选择“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()在线。

我怎样才能做到这一点?

4

1 回答 1

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();
于 2012-11-15T17:19:17.497 回答