Jak zapisać wartość dla określonego [niestandardowego] atrybutu produktu z modelu produktu


12

Jak zapisać wartość dla określonego [niestandardowego] atrybutu produktu z modelu produktu?

Znalazłem stąd poniższy skrypt :

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

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

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

Odpowiedzi:


32

Można to zrobić na 2 sposoby, jednym z nich jest uzyskanie catalog/productmodelu Magento i załadowanie produktu według identyfikatora, który da ci cały produkt, a następnie ustawienie nazwy i zapisanie go.

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

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

Jak zauważył OP, jest to dość ciężkie tylko do zmiany jednego atrybutu. Doszedłem do wniosku, że narzędzie do aktualizacji masy atrybutów powinno użyć czystszego sposobu, aby to zrobić i znalazłem Mage_Catalog_Model_Resource_Product_Actionklasę

$product_id = 1;
$store_id = 0;

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

[AKTUALIZACJA] test porównawczy

Tak zrobił szybki skrypt testowy i wyniki mówią same za siebie.

$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";

Czas: 0,076527833938599 sekund

Czas: 4,757472038269 sekund


Dzięki za odpowiedź Ale powyższy skrypt zajmuje więcej czasu, ponieważ ładuje model. Dzięki za odpowiedź Ale powyższy skrypt zajmuje więcej czasu, ponieważ ładuje model.
— Roney,

Zrobiłem aktualizację kodu
— Sander Mangel

Nie ma za co. Właściwie już zaimplementowałem w 2 skryptach importowych i to oszczędza dużo czasu.
— Sander Mangel

Małe pytanie: nie była to odpowiedź, której szukasz? Jeśli nie, daj mi znać, jeśli tak, zamknij pytanie, aby utrzymać wskaźnik odpowiedzi na pytania w górę :)
— Sander Mangel

11

Jeśli chcesz zapisać tylko jeden atrybut i masz już załadowany produkt, możesz użyć również tej metody:

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

Ta metoda jest znacznie szybsza niż catalog/resource_product_action


Dziękuję za post i za jego aktualność. Ale widzę dziwne zachowanie. Taki zapis zawsze zapewniał mi najlepszy czas. Ale ostatnio w 2 instancjach Magento EE to również wymaga czasu, aby ukończyć zapisywanie. Może to wynikać z jakiegoś rozszerzenia w tej instancji. Nie mogę wymyślić żadnej innej kwestii. Te instancje Magento są obecnie włączone przez lokalny system deweloperów i jeszcze nie mam ich przenieść do instancji serwera testowego.
— zapping

@Fra powinieneś uruchomić ten sam test porównawczy, który prowadził Sander - byłoby to dobre porównanie!
— Robbie Averill,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.