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

magento.stackexchange https://magento.stackexchange.com/questions/8681

  •  16-10-2019
  •  | 
  •  

Вопрос

Я хочу установить изображения для «использования значения по умолчанию» для списка продукта и для списка представления магазина. Я знаю, как сделать это индивидуально для каждого продукта: 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 ($ продукты, $ 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);
}

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

Это было полезно?

Решение

По сути, настройка значения атрибута для «использования значений по умолчанию» означает, что вы должны удалить строку в базе данных для этого атрибута для конкретного продукта для идентификатора магазина.
Вот простое решение, которое делает это. Это требует прямого изменения базы данных напрямую, и некоторые люди скажут, что это большой «нет-нет», но это работает.

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

Это должно быть. Но в случае, если я чрезмерно уверен, и это не работает, сначала поддерживает вашу базу данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top