製品のリストの属性を「デフォルト値を使用」に設定します


10

商品のリストとストアビューのリストで画像を「デフォルト値を使用」に設定したい。製品ごとに個別に行う方法を知っています。setData(attributeName、false)なので、製品リストをループできます。問題:本当に遅い。

$attrArray=array('thumbnail','small_image','image');
$products = array(170,171,172);
$stores = array(17,18,19);
foreach ($stores as $store_id) {
    foreach ($products as $product_id) {
        foreach ($attrArray as $attr) { 
            $product = Mage::getModel('catalog/product')
            ->load($product_id)->setStoreId($store_id)
            ->setData($attr, false)
            ->save();
        }
    }
}

Mage :: getSingleton( 'catalog / product_action')-> updateAttributes($ products、$ attrArray、$ store_id);を使用しようとしました。代わりに、同じことを行うはずですが、製品のリストに渡ります。それは実際に何かをします:私のすべての画像は「画像なし」に設定されていますが、期待どおり「デフォルト値を使用」に設定されていません。

$attrArray = array('thumbnail'=>false,'small_image'=>false,'image'=>false);
$products = array(170,171,172);
$stores = array(17,18,19);
foreach ($stores as $store_id) {
    Mage::getSingleton('catalog/product_action')
    ->updateAttributes($products, $attrArray, $store_id);
}

この周りの誰かがアイデアを持っているなら、それは私がいくつかの時間を節約するのに本当に役立つかもしれません!ありがとう。

回答:


8

基本的に、属性値を「デフォルト値を使用する」に設定すると、ストアIDの特定の製品について、その属性のデータベース内の行を削除する必要があります。
これを行う簡単なソリューションを次に示します。データベースを直接変更する必要があり、一部の人々はこれは大きな「ノーノー」であると言いますが、うまくいきます。

$attrArray=array('thumbnail','small_image','image');
$products = array(170,171,172);
$stores = array(17,18,19);
$productsAsString = implode(',', $products);
$storesAsString = implode(',', $stores);
//get access to the resource
$resource = Mage::getSingleton('core/resource');
//get access to the db write connection
$connection = $resource->getConnection('core_write');
//model for retrieving attributes
$eavConfig = Mage::getModel('eav/config');
$tables = array();
//get the association between attribute ids and the tables where their values are stored
//group them by table name so you will run a single query for each table
foreach ($attrArray as $attributeCode){
    $attribute = $eavConfig->getAttribute('catalog_product', $attributeCode);
    if ($attribute){
        $tableName = $resource->getTableName('catalog/product') . '_' . $attribute->getBackendType();
        $tables[$tableName][] = $attribute->getId();
    }
}
//for each table delete the attribute values in the specified store for the specified products
foreach ($tables as $tableName => $attributeIds){
    $attributeIdsAsString = implode(',', $attributeIds);
    $q = "DELETE FROM {$tableName}
                WHERE
                    attribute_id IN ({$attributeIdsAsString}) AND
                    entity_id IN ({$productsAsString}) AND
                    store_id IN ({$storesAsString})";
    $connection->query($q);
}

これはそれでなければなりません。しかし、私が自信過剰でこれが機能しない場合は、最初にデータベースをバックアップしてください。


1
どうもありがとう。今はもう必要ありませんし、テストサーバーもないので、まだテストしていませんが、後で間違いなく役に立ちます!
エステバン

コードを保証します。うまくいきます!
mpw 2014

それはうまくそして速く働きます!
エレクトロイド2016年

Magento 2のすべての製品属性に「デフォルト値を使用する」チェックボックスをオンにしたいのですが、製品属性値に問題があります。デフォルトのストアビューから表示されますが、「デフォルト値を使用する」チェックボックスがオンに設定されていない属性がいくつかあります。したがって、フロントエンドで反映されないすべてのストアビューのこれらの製品属性値を更新するたびに。
Himmat Paliwal 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.