So speichern Sie den Wert für ein bestimmtes [benutzerdefiniertes] Produktattribut aus dem Produktmodell


12

Wie speichere ich den Wert für ein bestimmtes [benutzerdefiniertes] Produktattribut aus dem Produktmodell?

Ich habe das folgende Skript von hier gefunden :

$product = Mage::getModel('catalog/product')->load(1); 

$product->setName('Some Random Name'); 

$product->getResource()->saveAttribute($product, 'name');

Antworten:


32

Es gibt zwei Möglichkeiten, dies zu tun. Eine besteht darin, das Magento- catalog/productModell abzurufen und das Produkt anhand der ID zu laden, wodurch Sie das gesamte Produkt erhalten, dann den Namen festzulegen und es zu speichern.

$product = Mage::getModel('catalog/product')->load(1);
$product->setName('foobar!');

try {
   $product->save();
} catch(Exception $e) {
  echo "{$e}";
}

Wie OP hervorhob, ist dies ziemlich schwer, nur um ein Attribut zu ändern. Ich dachte mir, dass das Attribut-Massenaktualisierungs-Tool eine sauberere Methode verwenden sollte, um dies zu tun, und fand die Mage_Catalog_Model_Resource_Product_ActionKlasse

$product_id = 1;
$store_id = 0;

$action = Mage::getModel('catalog/resource_product_action');
$action->updateAttributes(array($product_id), array(
    'name' => 'foobar!'
), $store_id);

[UPDATE] Benchmark

Ein schnelles Benchmark-Skript und die Ergebnisse sprechen für sich.

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $action = Mage::getModel('catalog/resource_product_action');
    $action->updateAttributes(array(1), array(
        'name' => 'foobar!'
    ), 0);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

$starttime = microtime(true);

for ($i=20; $i>0; $i--)
{
    $product = Mage::getModel('catalog/product')->load(1);
    $product->setName('foobar!');
    $product->save();
    unset($product);
}

echo "Time: " . (microtime(true) - $starttime) . " seconds\n";

Zeit: 0.076527833938599 Sekunden

Zeit: 4.757472038269 Sekunden


Vielen Dank für die Antwort. Das obige Skript benötigt mehr Zeit, da es das Modell lädt. Vielen Dank für die Antwort. Das obige Skript benötigt mehr Zeit, da es das Modell lädt.
Roney

Ich habe den Code aktualisiert
Sander Mangel

Bitte. Ich habe eigentlich schon in 2 Importskripten implementiert und es spart viel Zeit.
Sander Mangel

Kleine Frage: Dies war nicht die Antwort, die Sie gesucht haben? Wenn nicht, lassen Sie es mich wissen. Wenn ja, schließen Sie bitte die Frage, um die Rate der beantworteten Fragen hoch zu halten :)
Sander Mangel

11

Wenn Sie nur ein Attribut speichern müssen und das Produkt bereits geladen ist, können Sie auch diese Methode verwenden:

$product->setData('attribute_code',$someData);
$product->getResource()->saveAttribute($product,'attribute_code');

Diese Methode ist viel schneller als catalog/resource_product_action


Vielen Dank für den Beitrag und die Aktualisierung. Aber ich sehe ein merkwürdiges Verhalten. So gab mir Save immer die beste Zeit. Aber in letzter Zeit dauert es auch in 2 Magento-Instanzen EE einige Zeit, bis das Speichern abgeschlossen ist. Könnte es an einer Erweiterung dieser Instanz liegen. Mir fällt kein anderes Thema ein. Diese Magento-Instanzen sind derzeit vom lokalen Entwicklungssystem aktiviert und müssen noch auf eine Testserver-Instanz übertragen werden.
Zappen

@Fra du solltest den gleichen Benchmark laufen lassen wie Sander - wäre ein guter Vergleich!
Robbie Averill
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.