atur atribut ke 'gunakan nilai default' untuk daftar produk

10

Saya ingin mengatur gambar untuk 'menggunakan nilai default' untuk daftar produk, dan untuk daftar tampilan toko. Saya tahu bagaimana melakukannya secara individual untuk setiap produk: setData (attributeName, false), dan dengan demikian saya dapat melakukan perulangan pada daftar produk saya. Masalah: ini terlalu lambat.

$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();
        }
    }
}

Jadi saya sudah mencoba menggunakan Mage :: getSingleton ('catalog / product_action') -> updateAttributes ($ produk, $ attrArray, $ store_id); sebagai gantinya, yang seharusnya melakukan hal yang sama tetapi lebih dari daftar produk. Ini benar-benar melakukan sesuatu: semua gambar saya sekarang disetel ke 'tidak ada gambar', tetapi tidak untuk 'Gunakan nilai default' seperti yang diharapkan.

$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);
}

Jika seseorang di sekitar sini punya ide, itu bisa sangat membantu saya menghemat waktu! Terima kasih.

Esteban
sumber

Jawaban:

8

Pada dasarnya, menetapkan nilai atribut ke 'Gunakan nilai default' berarti Anda harus menghapus baris dalam database untuk atribut itu, untuk produk tertentu, untuk id toko.
Berikut ini adalah solusi sederhana untuk itu. Membutuhkan mengubah database secara langsung dan beberapa orang akan mengatakan bahwa ini adalah 'Tidak-Tidak' yang besar tetapi berfungsi.

$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);
}

Seharusnya begitu. Tetapi jika saya terlalu percaya diri dan ini tidak berhasil, buat cadangan database Anda terlebih dahulu.

Marius
sumber
1
Terima kasih banyak, saya belum mengujinya, karena saya tidak membutuhkannya lagi dan tidak memiliki server uji untuk saat ini, tetapi pasti akan berguna nanti!
Esteban
Saya akan menjamin kode. Bekerja dengan baik!
mpw
ini bekerja dengan baik dan cepat!
electroid
Saya ingin mengatur "Gunakan nilai default" diperiksa untuk semua atribut produk di Magento 2, saya mengalami masalah dengan nilai atribut produk, mereka ditampilkan dari tampilan toko default tetapi beberapa atribut tidak diatur ke "Gunakan nilai default" seperti dicentang . Jadi setiap kali saya memperbarui nilai atribut produk ini untuk semua tampilan toko yang tidak tercermin di tampilan depan.
Himmat Paliwal