установить атрибуты «использовать значение по умолчанию» для списка продуктов

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

Если у кого-то здесь есть идея, это может помочь мне сэкономить время! Спасибо.

Esteban
источник

Ответы:

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
работает хорошо и быстро!
Electroid
Я хочу установить «Использовать значение по умолчанию», отмеченный для всех атрибутов продукта в Magento 2, у меня возникла проблема со значением атрибутов продукта, они отображаются в представлении магазина по умолчанию, но для некоторых атрибутов не установлено значение «Использовать значение по умолчанию», как отмечено , Поэтому всякий раз, когда я обновляю эти атрибуты продукта, значение для всех представлений магазина не отражается во внешнем интерфейсе.
Химмат Паливал