ustaw atrybuty na „użyj wartości domyślnej” dla listy produktów

10

Chcę ustawić obrazy tak, aby „używały wartości domyślnej” dla listy produktów i dla widoku sklepu. Wiem, jak to zrobić indywidualnie dla każdego produktu: setData (nazwa_atrybutu, fałsz), więc mogę zrobić pętlę na mojej liście produktów. Problem: jest naprawdę zbyt wolny.

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

Dlatego próbuję użyć Mage :: getSingleton ('katalog / product activity') -> updateAttributes ($ produkty, $ attrArray, $ store_id); zamiast tego, co ma robić to samo, ale na liście produktów. W rzeczywistości coś robi: wszystkie moje obrazy są teraz ustawione na „brak obrazów”, ale nie na „Użyj wartości domyślnej” zgodnie z oczekiwaniami.

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

Jeśli ktoś tutaj ma jakiś pomysł, naprawdę może mi pomóc zaoszczędzić trochę czasu! Dzięki.

Esteban
źródło

Odpowiedzi:

8

Zasadniczo ustawienie wartości atrybutu na „Użyj wartości domyślnych” oznacza, że ​​musisz usunąć wiersz w bazie danych dla tego atrybutu, dla konkretnego produktu, dla identyfikatora sklepu.
Oto proste rozwiązanie, które to robi. Wymaga to bezpośredniej zmiany bazy danych, a niektórzy powiedzą, że jest to duże „nie-nie”, ale działa.

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

To powinno być to. Ale jeśli jestem zbyt pewny siebie i to nie działa, najpierw wykonaj kopię zapasową bazy danych.

Marius
źródło
1
Wielkie dzięki, jeszcze go nie testowałem, ponieważ już go nie potrzebuję i nie mam na razie serwera testowego, ale na pewno przyda się później!
Esteban
Zaręczę za kod. Działa dobrze!
mpw
działa dobrze i szybko!
electroid
Chcę ustawić opcję „Użyj wartości domyślnej” zaznaczoną dla wszystkich atrybutów produktu w Magento 2, mam problem z wartością atrybutów produktu, są one wyświetlane z domyślnego widoku sklepu, ale kilka atrybutów nie jest ustawionych na „Użyj wartości domyślnej” jako zaznaczone . Więc za każdym razem, gdy aktualizuję te atrybuty produktu dla wszystkich widoków sklepu, które nie odzwierciedlają się w interfejsie użytkownika.
Himmat Paliwal