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');
Roney
quelle

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

Sander Mangel
quelle
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

Fra
quelle
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