Як зберегти значення для конкретного [користувальницького] атрибута продукту з моделі продукту


12

Як зберегти значення для конкретного [користувальницького] атрибута продукту з моделі продукту?

Я знайшов нижче сценарій з тут :

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

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

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

Відповіді:


32

Є два шляхи для вирішення цього питання: один із отримання 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 секунд


Дякуємо за відповідь Але вище сценарій займає більше часу, оскільки завантажує модель. Дякую за відповідь Але вище сценарій займає більше часу, оскільки завантажує модель.
Роні

Я зробив оновлення коду
Sander Mangel

Ласкаво просимо. Я фактично вже реалізований у 2-х сценаріях імпорту, це економить багато часу.
Sander Mangel

Невелике запитання: це була не відповідь, яку ви шукали? Якщо не дайте мені знати, якщо це так, будь ласка, закрийте це питання, щоб продовжити нашу відповідь на питання :)
Sander Mangel

11

Якщо вам потрібно зберегти лише один атрибут, а продукт уже завантажений, ви також можете скористатися цим методом:

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

Цей метод набагато швидший, ніж catalog/resource_product_action


Дякуємо за повідомлення та підтримуєте його в актуальному стані. Але я бачу дивну поведінку. Як цей заощадження завжди давав мені найкращий час. Але останнім часом у двох екземплярах Magento EE для цього також потрібен час, щоб завершити збереження. Можливо, це пов'язано з деяким розширенням у цьому випадку. Я не можу придумати жодного іншого питання. Наразі ці екземпляри Magento ввімкнуті локальною системою розробок, і я ще повинен перенести його на екземпляр тестового сервера.
зачіпання

@Fra ви повинні запустити той самий тест, що і Сандер - це було б хорошим порівнянням!
Роббі Аверилл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.