Pregunta

Quiero establecer las imágenes en 'usar valor predeterminado' para una lista de productos y para una lista de vistas de la tienda. Sé cómo hacerlo individualmente para cada producto: SetData (AttributeName, False), por lo que puedo hacer un bucle sobre mi lista de productos. Problema: es realmente demasiado 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();
        }
    }
}

Así que intenté usar Mage :: GetSingLeton ('Catalog/Product_action')-> updateAtTributes ($ productos, $ attrArray, $ store_id); En cambio, que se supone que hace lo mismo pero en una lista de productos. En realidad hace algo: todas mis imágenes ahora están configuradas en 'sin imágenes', pero no para 'usar el valor predeterminado' como se esperaba.

$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 alguien por aquí tiene una idea, ¡realmente podría ayudarme a ahorrar algo de tiempo! Gracias.

¿Fue útil?

Solución

Básicamente, configurar un valor de atributo para 'usar valores predeterminados' significa que debe eliminar la fila en la base de datos para ese atributo, para el producto específico, para una ID de tienda.
Aquí hay una solución simple que hace eso. Requiere alterar la base de datos directamente y algunas personas dirán que este es un gran 'no-no', pero 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);
}

Esto debería ser todo. Pero en caso de que esté demasiado confiado y esto no funcione, haga una copia de seguridad de su base de datos primero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top