définir les attributs pour « utiliser une valeur par défaut » pour une liste de produits
-
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.
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.