Schnellste Möglichkeit, ein Attribut in allen Produkten zu aktualisieren


Antworten:


22

Hallo Magento, gib ein Attribut mit folgendem Code an

$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');

Beispiel:

$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format 
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');

Verwenden der Produktkollektion:

$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));

foreach($products as $product)
{
    $product->setSpecialFromDate('2010-10-28');
    // below code use for time format 
    $product->setSpecialFromDateIsFormated(true);
    $product->getResource()->saveAttribute($product, 'special_from_date');


}

Das geht super schnell! Ich habe es versucht Mage::getSingleton('catalog/product_api')->update();und Mage::getSingleton('catalog/product_action')->updateAttributes(). product_api dauerte im Durchschnitt 1,7 Sekunden und product_action dauerte im Durchschnitt 1,0 Sekunden. jedoch $product->getResource()->saveAttribute()nahm avg 0,04 Sekunden auf durchschnittl. Vielen Dank!
Joshua Pack

Gibt es eine ähnliche Methode, mit der Attribute auf einer bestimmten Speicherebene aktualisiert werden können?
Robbie Averill

Thx @Amit Bera - Noch 1 Frage;) gibt es auch eine Möglichkeit, mehrere Attribute auf einmal zu speichern? Von müsste man die $product->getResource()->saveAttributeHandlung umkreisen. DANKE!!
snh_nl

@amit bera, bitte schau in dieses magento.stackexchange.com/questions/201757/… was soll ich tun ??
Abhishek

@amit: Ich brauche, wie kann ich Bulk-Website ändern (Update-Attribut in Multi-Store)
zus

18

Schreiben Sie eine SQL-Abfrage.

Zweitbester Weg (und der, den ich empfehle): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Code-Beispiel von u_maxx:

$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);

Wie würde das mit Multiselect-Werten funktionieren? Fügt es den Wert hinzu oder überschreibt es andere vorgewählte Werte?

Multiselects werden normalerweise als durch Kommas getrennte ganze Zahlen gespeichert, z 27,42,4711. Wenn Sie also den Wert ändern 1, gehen die anderen Werte verloren. Aber was Sie tun können, ist, CONCAT(value, ',1')dass Sie den neuen Wert am Ende durch ein Komma trennen. Ich denke, auch wenn Sie zwei Mal einen Wert hinzufügen, ist dies kein Problem, da Magento ihn beim nächsten Speichern filtert und den zweiten Wert ignoriert.


Dadurch werden jeweils nur 1 KB Zeilen aktualisiert, nicht so schnell: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code/…
B00MER 13.11.14

Wenn ich den Code richtig verstehe, werden alle 1000 Zeilen geschrieben, aber alle in einer Zeile aktualisiert.
Fabian Blechschmidt

1
Danke @FabianBlechschmidt! Hier ist mein Code Beispiel ( GIST ):<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Max Uroda

1
Das Problem bei diesem Ansatz ist, dass die Produkte nicht neu indiziert werden. Daher werden Änderungen möglicherweise nicht im Frontend und nur im Admin-Bereich angezeigt. Indiziert auch nach dem Update können Sie ändern , Mage::getSingleton('catalog/resource_product_action')um Mage::getModel('catalog/product_action')mit den exakt gleichen oben genannten Parametern.
Shampoo

1
@snh_nl hat die Antwort aktualisiert. Hoffe, dies beantwortet Ihre Frage
Fabian Blechschmidt

5

10k Produkte verwenden SQL. EAV trübt nur das Wasser. Pro Frage ist der schnellste Weg.

Suchen Sie attribute_id

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

Update mit attribute_idobiger Abfrage gefunden.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Ich nehme an, Sie könnten mit update eine Unterauswahl treffen, aber der Einfachheit halber sind zwei SQL-Abfragen am einfachsten zu verstehen.

HINWEIS: Es entity_type_id = 4 handelt sich meistens um die Produkt-EAV-Einträge. Wenn Sie Kategorien- oder Kundenattribute massenweise aktualisieren müssen, unterscheidet sich dies ebenso wie die Tabelle, die basierend auf der Art des zu aktualisierenden Attributs aktualisiert wird. Auch wenn Sie ein Multi-Store-Setup haben, achten Sie darauf und beachten Sie die Bedingungenstore_id


2

Aufgrund der obigen Antwort von Fabian können Sie mehrere Felder gleichzeitig aktualisieren. Das folgende Beispiel hat nur 2 (auf Lager, Lagerstatus), aber Sie können so viele verwenden, wie Sie möchten.

    $product_ids = Mage::getModel('catalog/product')
        ->getCollection()
        ->addAttributeToFilter('status', array('eq' => 2)) //only disabled 
        ->getAllIds();

    $attrData = [
        ['attribute_one' => 1],
        ['attribute_two' => 1]
    ];

    $storeId = 0;
    Mage::getSingleton('catalog/resource_product_action')
       ->updateAttributes($product_ids, $attrData, $storeId);

Wenn Sie also alle Produkte auf denselben Attributwert aktualisieren möchten, wie können Sie dies anpassen, um beispielsweise 3 Produkte mit demselben Attribut, aber unterschiedlichen Werten für das Attribut zu aktualisieren? thx
snh_nl

Siehe Amit Beras Antwort oben: magento.stackexchange.com/a/43924/3433
Silas Palmer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.