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

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

  •  16-10-2019
  •  | 
  •  

Question

Je veux définir les images à « utiliser une valeur par défaut » pour une liste de produits et pour obtenir une liste de vue magasin. Je sais comment le faire individuellement pour chaque produit: setData (attributeName, faux), et donc je peux faire une boucle sur ma liste de produits. Problème:. Il 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 essayer d'utiliser Mage :: getSingleton ( 'catalogue / product_action') -> updateAttributes (produits $, $ attrArray, $ STORE_ID); au contraire, qui est censé faire la même chose, mais sur une liste de produits. Il ne fait quelque chose: toutes mes images sont maintenant réglées sur « aucune image », mais pas « 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 a ici une idée, il pourrait vraiment me aider à gagner du temps! Merci.

Était-ce utile?

La solution

En fait, la mise en valeur d'attribut aux moyens "Utiliser les valeurs par défaut de que vous devez supprimer la ligne dans 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. Il faut modifier la base de données directement et certaines personnes dire 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);
}

Cela devrait l'être. Mais au cas où je suis trop confiant et cela ne fonctionne pas, back-up de votre première base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top