встановити атрибути "використовувати значення за замовчуванням" для списку продуктів


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 ('каталог / продуктування') -> 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

В основному, встановити значення атрибута на "Використовувати значення за замовчуванням" означає, що вам потрібно видалити рядок у базі даних для цього атрибута, для конкретного продукту, для ідентифікатора магазину.
Ось просте рішення, яке це робить. Для цього потрібно змінити базу даних безпосередньо, і деякі люди скажуть, що це велике "Ні-Ні", але воно працює.

$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

це працює добре і швидко!
електроїд

Я хочу встановити "Використовувати значення за замовчуванням" для всіх атрибутів продукту в Magento 2, у мене виникають проблеми зі значенням атрибутів продукту, вони відображаються з виду магазину за замовчуванням, але мало атрибутів встановлено як "Використовувати значення за замовчуванням", як встановлено . Тому щоразу, коли я оновлюю ці атрибути продукту, цінність для всіх представлень даних магазину не відображається на фронті.
Himmat Paliwal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.