definir atributos para 'usar o valor padrão' para uma lista de produtos

10

Quero definir as imagens para 'usar o valor padrão' para uma lista de produtos e para uma lista de exibição da loja. Eu sei como fazê-lo individualmente para cada produto: setData (attributeName, false), e para que eu possa fazer um loop na minha lista de produtos. Problema: é realmente muito lento.

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

Então, eu tentei usar Mage :: getSingleton ('catalog / product_action') -> updateAttributes ($ products, $ attrArray, $ store_id); em vez disso, o que deveria fazer a mesma coisa, mas em uma lista de produtos. Na verdade, ele faz algo: agora todas as minhas imagens estão definidas como 'sem imagens', mas não como 'Usar valor padrão' conforme o esperado.

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

Se alguém por aqui tiver uma idéia, isso poderia me ajudar a economizar algum tempo! Obrigado.

Esteban
fonte

Respostas:

8

Basicamente, definir um valor de atributo como 'Usar valores padrão' significa que você deve excluir a linha no banco de dados para esse atributo, para o produto específico, para um ID de loja.
Aqui está uma solução simples que faz isso. Requer a alteração direta do banco de dados e algumas pessoas dirão que esse é um grande 'não', mas funciona.

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

Deve ser isso. Mas, caso eu esteja confiante demais e isso não funcione, faça primeiro o backup do seu banco de dados.

Marius
fonte
1
Muito obrigado, ainda não testei, pois não preciso mais e não tenho um servidor de teste no momento, mas será útil mais tarde, com certeza!
Esteban
Eu atestarei o código. Funciona bem!
MPW
funciona bem e rápido!
electroid
Quero definir "Usar valor padrão" marcado para todos os atributos do produto no Magento 2. Estou tendo problemas com o valor dos atributos do produto, eles estão sendo mostrados na visualização da loja padrão, mas poucos atributos não estão definidos como "Usar valor padrão" como marcado . Portanto, sempre que eu atualizo o valor desses atributos de produto para todas as visualizações da loja que não refletem no frontend.
Himmat Paliwal