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.