Поиск товара по SKU в waCliController Есть решение
Нужно сделать waCliController для обновления остатков по крону.
Не могу разобраться, с помощью какого класса можно найти товар по артикулу и записать в SKU новое количество.Можете подсказать парой строчек кода?
Спасибо.
5 ответов
Подразумевается, что $new_available и $new_count у вас уже есть.
// До цикла
$psm = new shopProductSkusModel();
// В цикле
// Если у вас уже есть $sku_id
$psm->updateById($sku_id, array(
'available' => $new_available,
'count' => $new_count,
//...и вообще что угодно в shop_product_skus
));
// Альтернативно, если $sku_id нету, а есть только код артикула $sku_code
$psm->updateByField('sku', $sku_code, array(
'available' => $new_available,
'count' => $new_count,
//...
));
// После цикла: поскольку мы поменяли shop_product_skus.count,
// надо обновить shop_product.count, чтобы в продукте была сумма по артикулам.
$pm = new shopProductModel();
$pm->correctCount();
Леонид, еще на один вопрос ответьте по возможности.
Как правильно обновить цену у товара?
Если по аналогии вставить поле price в функцию updateByField, цена обновится только в SKU. Для множественного товара это подходит. Но если товар 1 цена берется из таблицы с товаром а не из SKU. Как там обновить непонятно. С учетом того что у меня только артикул а не его код.
Заранее благодарю за ответ!
Способ простой, но очень тормозной: обновлять внутри цикла товары по одному, используя shopProductModel->correct($product_id). Этот метод подгружает все артикулы из БД и обновляет shop_product с их учётом.
// До цикла
$pm = new shopProductModel();
// В цикле
$sku = $psm->getByField('sku', $sku_code); // или $psm->getById($sku_id)
$pm->correct($sku['product_id']);
* * *
Способ производительный, но потребует больше работы. Идея в том, чтобы обновить shop_product.price, .min_price, .max_price и .compare_price, вписав туда нужные цены в основной валюте магазина (что не обязательно совпадает с валютой товара shop_product.currency).
// До цикла
$pm = new shopProductModel();
// В цикле
$sku = $psm->getByField('sku', $sku_code); // или $psm->getById($sku_id)
$pm->updateById($sku['product_id'], array(
'price' => ...
'min_price' => ...
'max_price' => ...
'compare_price' => ... // зачёркнутая цена
));
min, max и price используются при фильтрации по цене и показываются в списках товаров, где данные конкретных артикулов могут быть недоступны. Их все нужно обновлять для всех товаров, не только для одноартикульных, иначе списки сломаются.
Спасибо Леонид. Первый предложенный вариант полностью устроил.
Обновление 20000 товаров изменилось с 40 минут до 49.
Для одного раза в день прекрасно подходит.
Леонид, огромное спасибо!
Даже не надеялся на столь быстрый ответ.