establecer atributos para 'usar el valor predeterminado' para una lista de productos

10

Quiero configurar las imágenes para 'usar el valor predeterminado' para una lista de productos y para una lista de la vista de la tienda. Sé cómo hacerlo individualmente para cada producto: setData (attributeName, false), por lo que puedo hacer un ciclo 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 ($ products, $ attrArray, $ store_id); en cambio, que se supone que debe hacer lo mismo pero a través de una lista de productos. Realmente hace algo: todas mis imágenes ahora están configuradas en 'sin imágenes', pero no en 'Usar 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.

Esteban
fuente

Respuestas:

8

Básicamente, establecer un valor de atributo en 'Usar valores predeterminados' significa que debe eliminar la fila en la base de datos para ese atributo, para el producto específico, para una identificación 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. Pero en caso de que tenga demasiada confianza y esto no funcione, primero haga una copia de seguridad de su base de datos.

Marius
fuente
1
Muchas gracias, aún no lo probé, ya que no lo necesito más y no tengo un servidor de prueba por el momento, ¡pero será útil más adelante con seguridad!
Esteban
Voy a responder por el código. ¡Funciona bien!
mpw
¡funciona bien y rápido!
electroide
Quiero establecer "Usar el valor predeterminado" marcado para todos los atributos del producto en Magento 2, tengo problemas con el valor de los atributos del producto, se muestran desde la vista de la tienda predeterminada, pero pocos atributos no están configurados para "Usar el valor predeterminado" como marcado . Entonces, cada vez que actualizo el valor de estos atributos de producto para toda la vista de la tienda que no se refleja en la interfaz.
Himmat Paliwal