1

新しい選択属性オプションをすべての製品で表示できるようにしたいと考えています。

「bracket_size」というセレクト ボックス属性を使用する商品があります。この属性には 3 つのオプションがあります。

ブラケットサイズオプション

(/admin/catalog_product_attribute/edit/)

ほとんどの製品では、これらのオプションのうち 2 つしか選択されていません。

商品属性設定

(/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 に答える