Setzen Sie die Attribute für eine Liste von Produkten auf "Standardwert verwenden"

10

Ich möchte die Bilder so einstellen, dass sie für eine Produktliste und eine Liste der Geschäftsansichten den Standardwert verwenden. Ich weiß, wie es für jedes Produkt einzeln gemacht wird: setData (attributeName, false), und so kann ich eine Schleife über meine Produktliste machen. Problem: Es ist wirklich zu langsam.

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

Also habe ich versucht, Mage :: getSingleton ('catalog / product_action') zu verwenden -> updateAttributes ($ products, $ attrArray, $ store_id); stattdessen, die das gleiche tun soll, aber über eine Liste von Produkten. Es macht tatsächlich etwas: Alle meine Bilder sind jetzt auf "keine Bilder" eingestellt, aber nicht wie erwartet auf "Standardwert verwenden".

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

Wenn jemand hier eine Idee hat, könnte es mir wirklich helfen, Zeit zu sparen! Vielen Dank.

Esteban
quelle

Antworten:

8

Wenn Sie einen Attributwert auf "Standardwerte verwenden" setzen, müssen Sie die Zeile in der Datenbank für dieses Attribut, für das bestimmte Produkt und für eine Geschäfts-ID löschen.
Hier ist eine einfache Lösung, die das macht. Es erfordert eine direkte Änderung der Datenbank und einige Leute werden sagen, dass dies ein großes "Nein-Nein" ist, aber es funktioniert.

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

Das sollte es sein. Falls ich jedoch zu zuversichtlich bin und dies nicht funktioniert, sichern Sie zuerst Ihre Datenbank.

Marius
quelle
1
Vielen Dank, ich habe es noch nicht getestet, da ich es nicht mehr brauche und im Moment keinen Testserver habe, aber es wird sicher später nützlich sein!
Esteban
Ich werde für den Code bürgen. Funktioniert gut!
mpw
es funktioniert gut und schnell!
Electroid
Ich möchte festlegen, dass "Standardwert verwenden" für alle Produktattribute in Magento 2 aktiviert ist. Ich habe ein Problem mit dem Produktattributwert. Sie werden in der Standardspeicheransicht angezeigt, aber nur wenige Attribute sind nicht wie aktiviert auf "Standardwert verwenden" gesetzt . Wenn ich diese Produktattribute aktualisiere, wird der Wert für alle Geschäftsansichten angezeigt, die nicht im Frontend angezeigt werden.
Himmat Paliwal