วิธีบันทึกค่าสำหรับแอตทริบิวต์ของผลิตภัณฑ์ [กำหนดเอง] เฉพาะจากรุ่นผลิตภัณฑ์


12

วิธีการประหยัดค่าสำหรับคุณสมบัติเฉพาะ [กำหนดเอง] ของผลิตภัณฑ์จากรุ่นผลิตภัณฑ์?

ฉันพบสคริปต์ด้านล่างจากที่นี่ :

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

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

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

คำตอบ:


32

มีสองวิธีที่จะไปเกี่ยวกับเรื่องนี้อย่างใดอย่างหนึ่งคือการได้รับcatalog/productรูปแบบวีโอไอพีและโหลดผลิตภัณฑ์โดยใช้ ID ซึ่งจะให้ผลิตภัณฑ์ทั้งหมดแล้วตั้งชื่อและบันทึกไว้

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

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

ดังที่ OP ชี้ให้เห็นสิ่งนี้ค่อนข้างหนักเพียงแค่เปลี่ยนแอตทริบิวต์หนึ่ง ฉันคิดว่าเครื่องมือการอัปเดตจำนวนมากของแอตทริบิวต์นั้นควรใช้วิธีที่สะอาดกว่าในการทำสิ่งนี้และพบMage_Catalog_Model_Resource_Product_Actionคลาส

$product_id = 1;
$store_id = 0;

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

[ปรับปรุง] เกณฑ์มาตรฐาน

สคริปต์มาตรฐานอย่างรวดเร็วและผลลัพธ์ก็มีประโยชน์เช่นกัน

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

เวลา: 0.076527833938599 วินาที

เวลา: 4.757472038269 วินาที


ขอบคุณสำหรับการตอบกลับ แต่สคริปต์ด้านบนใช้เวลามากขึ้นในการโหลดแบบจำลองขอบคุณสำหรับการตอบกลับ แต่สคริปต์ด้านบนใช้เวลามากขึ้นในการโหลดแบบจำลอง
Roney

ฉันได้อัปเดตรหัสแล้ว
Sander Mangel

ไม่เป็นไร ฉันนำไปใช้จริงแล้วในสคริปต์นำเข้า 2 รายการและช่วยประหยัดเวลาได้มาก
Sander Mangel

คำถามเล็ก ๆ : นี่ไม่ใช่คำตอบที่คุณมองหาใช่ไหม ถ้าไม่แจ้งให้เราทราบถ้าเป็นเช่นนั้นโปรดปิดคำถามเพื่อให้อัตราการตอบคำถามของเรามีค่ามากขึ้น :)
Sander Mangel

11

หากคุณต้องการบันทึกเพียงหนึ่งคุณลักษณะและคุณได้โหลดผลิตภัณฑ์แล้วคุณสามารถใช้วิธีนี้ได้:

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

วิธีนี้เร็วกว่ามาก catalog/resource_product_action


ขอบคุณสำหรับการโพสต์และทำให้ทันสมัย แต่ฉันเห็นพฤติกรรมแปลก ๆ เช่นนี้บันทึกช่วยให้ฉันเวลาที่ดีที่สุด แต่เมื่อเร็ว ๆ นี้ในกรณีวีโอไอพีสองกรณี EE สิ่งนี้ก็ใช้เวลาในการดำเนินการให้เสร็จสมบูรณ์ อาจเป็นเพราะส่วนขยายบางอย่างในอินสแตนซ์เหล่านี้ ฉันสามารถคิดว่าไม่มีปัญหาอื่น อินสแตนซ์ Magento เหล่านี้เปิดใช้งานโดยระบบ dev ในพื้นที่และยังไม่ถ่ายโอนไปยังอินสแตนซ์เซิร์ฟเวอร์ทดสอบ
zapping

@ จากที่คุณควรใช้มาตรฐานเดียวกันกับที่ Sander วิ่ง - จะเป็นการเปรียบเทียบที่ดี!
Robbie Averill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.