définir des attributs pour «utiliser la valeur par défaut» pour une liste de produits

10

Je veux définir les images sur «utiliser la valeur par défaut» pour une liste de produits et pour une liste de vues de magasin. Je sais comment le faire individuellement pour chaque produit: setData (attributeName, false), et donc je peux faire une boucle sur ma liste de produits. Problème: c'est vraiment trop lent.

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

J'ai donc essayé d'utiliser Mage :: getSingleton ('catalog / product_action') -> updateAttributes ($ products, $ attrArray, $ store_id); au lieu de cela, qui est censé faire la même chose mais sur une liste de produits. En fait, cela fait quelque chose: toutes mes images sont désormais définies sur «aucune image», mais pas sur «Utiliser la valeur par défaut» comme prévu.

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

Si quelqu'un ici a une idée, cela pourrait vraiment m'aider à gagner du temps! Merci.

Esteban
la source

Réponses:

8

Fondamentalement, la définition d'une valeur d'attribut sur «Utiliser les valeurs par défaut» signifie que vous devez supprimer la ligne de la base de données pour cet attribut, pour le produit spécifique, pour un identifiant de magasin.
Voici une solution simple qui fait cela. Cela nécessite de modifier directement la base de données et certaines personnes diront que c'est un grand «non-non» mais cela fonctionne.

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

Ça devrait être ça. Mais au cas où je serais trop confiant et que cela ne fonctionne pas, sauvegardez d'abord votre base de données.

Marius
la source
1
Merci beaucoup, je ne l'ai pas encore testé, car je n'en ai plus besoin et je n'ai pas de serveur de test pour le moment, mais ce sera utile plus tard, c'est sûr!
Esteban
Je garantis le code. Fonctionne bien!
mpw
ça marche bien et vite!
electroid
Je veux définir "Utiliser la valeur par défaut" coché pour tous les attributs de produit dans Magento 2, je rencontre un problème avec la valeur des attributs du produit, ils sont affichés à partir de la vue du magasin par défaut mais peu d'attributs ne sont pas définis sur "Utiliser la valeur par défaut" comme coché . Donc, chaque fois que je mets à jour la valeur de ces attributs de produit pour toutes les vues de magasin qui ne se reflètent pas au frontend.
Himmat Paliwal