imposta gli attributi su "usa valore predefinito" per un elenco di prodotti


10

Voglio impostare le immagini su "usa il valore predefinito" per un elenco di prodotti e per un elenco di viste dello store. So come farlo individualmente per ogni prodotto: setData (attributoNome, falso), e quindi posso fare un giro sulla mia lista di prodotti. Problema: è davvero troppo 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();
        }
    }
}

Quindi ho provato ad usare Mage :: getSingleton ('catalog / product_action') -> updateAttributes ($ products, $ attrArray, $ store_id); invece, che dovrebbe fare la stessa cosa ma su un elenco di prodotti. In realtà fa qualcosa: tutte le mie immagini sono ora impostate su "nessuna immagine", ma non su "Usa valore predefinito" come previsto.

$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 qualcuno qui ha un'idea, potrebbe davvero aiutarmi a risparmiare un po 'di tempo! Grazie.

Risposte:


8

Fondamentalmente, l'impostazione di un valore di attributo su "Usa valori predefiniti" significa che devi eliminare la riga nel database per quell'attributo, per il prodotto specifico, per un ID negozio.
Ecco una soluzione semplice che lo fa. Richiede la modifica diretta del database e alcune persone diranno che questo è un grande "No-No" ma funziona.

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

Questo dovrebbe essere. Ma nel caso in cui sono troppo fiducioso e questo non funziona, eseguire prima il backup del database.


1
Grazie mille, non l'ho ancora testato, poiché non ne ho più bisogno e non ho un server di prova per il momento, ma sarà sicuramente utile in seguito!
Esteban,

Garantirò il codice. Funziona bene!
mpw,

funziona bene e velocemente!
electroid

Voglio impostare "Usa valore predefinito" selezionato per tutti gli attributi del prodotto in Magento 2, sto riscontrando problemi con il valore degli attributi del prodotto, vengono mostrati dalla vista negozio predefinita ma pochi attributi non sono impostati su "Usa valore predefinito" come selezionato . Quindi ogni volta che aggiorno questi attributi di prodotto valgono per tutte le visualizzazioni del negozio che non si riflettono sul frontend.
Himmat Paliwal,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.