Відповіді:
Є два шляхи для вирішення цього питання: один із отримання catalog/product
моделі Magento та завантаження продукту за ідентифікатором, який дасть вам весь продукт, після чого встановіть назву та збережіть її.
$product = Mage::getModel('catalog/product')->load(1);
$product->setName('foobar!');
try {
$product->save();
} catch(Exception $e) {
echo "{$e}";
}
Як зазначав ОП, це досить важко лише для зміни одного атрибуту. Я начебто подумав, що інструмент оновлення маси атрибутів повинен використовувати більш чистий спосіб зробити це і знайшов 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);
Оновлення [UPDATE]
Так само зробили сценарій швидкого орієнтиру, і результати говорять самі за себе.
$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 секунд
Якщо вам потрібно зберегти лише один атрибут, а продукт уже завантажений, ви також можете скористатися цим методом:
$product->setData('attribute_code',$someData);
$product->getResource()->saveAttribute($product,'attribute_code');
Цей метод набагато швидший, ніж catalog/resource_product_action