Bagaimana cara menyimpan nilai untuk Atribut Produk [khusus] Spesifik dari Model Produk

12

Bagaimana cara menyimpan nilai untuk Atribut Produk [khusus] dari Model Produk?

Saya telah menemukan skrip di bawah ini dari sini :

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

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

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

Jawaban:

32

Ada 2 cara untuk melakukan ini, satu adalah dengan mendapatkan catalog/productmodel Magento dan memuat produk dengan ID yang akan memberi Anda seluruh produk, kemudian mengatur nama dan menyimpannya.

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

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

Seperti yang ditunjukkan OP, ini cukup berat hanya untuk mengubah satu atribut. Saya agak berpikir bahwa alat pembaruan massal atribut harus menggunakan cara yang lebih bersih untuk melakukan ini dan menemukan Mage_Catalog_Model_Resource_Product_Actionkelas

$product_id = 1;
$store_id = 0;

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

Tolok ukur [PEMBARUAN]

Begitu juga skrip benchmark cepat dan hasilnya berbicara sendiri.

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

Waktu: 0,076527833938599 detik

Waktu: 4,757472038269 detik

Sander Mangel
sumber
Terima kasih atas jawabannya. Tapi skrip di atas membutuhkan waktu lebih lama karena memuat model.
Roney
Saya telah melakukan pembaruan kode
Sander Mangel
Sama-sama. Saya sebenarnya sudah menerapkan 2 skrip impor dan menghemat banyak waktu.
Sander Mangel
Pertanyaan kecil: ini bukan jawaban yang Anda cari? Jika tidak, beri tahu saya, jika demikian silakan tutup pertanyaan agar tingkat pertanyaan terjawab kami :)
Sander Mangel
11

Jika Anda perlu menyimpan hanya satu atribut dan Anda sudah memiliki produk dimuat, Anda juga dapat menggunakan metode ini:

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

Metode ini jauh lebih cepat daripada catalog/resource_product_action

Fra
sumber
Terima kasih atas posnya dan terus memperbarui. Tapi saya melihat perilaku yang aneh. Seperti ini, hemat selalu memberi saya waktu terbaik. Namun belakangan ini dalam 2 Magento contoh EE ini juga membutuhkan waktu untuk menyelesaikan Simpan. Mungkinkah karena beberapa ekstensi pada contoh ini. Saya tidak bisa memikirkan masalah lain. Mesin virtual Magento ini saat ini diaktifkan oleh sistem pengembang lokal dan saya belum mentransfernya ke mesin uji server.
kejutan listrik
@ Frra, Anda harus menjalankan benchmark yang sama dengan yang dijalankan Sander - akan menjadi perbandingan yang bagus!
Robbie Averill