Поиск товара по SKU в waCliController Есть решение

Нужно сделать waCliController для обновления остатков по крону.

Не могу разобраться, с помощью какого класса можно найти товар по артикулу и записать в SKU новое количество.
Можете подсказать парой строчек кода?

Спасибо.

5 ответов

  • 1
    Леонид Вакуленко 4 июля 2015 04:27 # Решение

    Подразумевается, что $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();

    • +1
      Евгений Евгений 31 июля 2015 07:13 #

      Леонид, еще на один вопрос ответьте по возможности.

      Как правильно обновить цену у товара?

      Если по аналогии вставить поле price в функцию updateByField, цена обновится только в SKU. Для множественного товара это подходит. Но если товар 1 цена берется из таблицы с товаром а не из SKU. Как там обновить непонятно. С учетом того что у меня только артикул а не его код.

      Заранее благодарю за ответ!

      • +1
        Леонид Вакуленко Леонид Вакуленко 31 июля 2015 07:56 #

        Способ простой, но очень тормозной: обновлять внутри цикла товары по одному, используя 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 используются при фильтрации по цене и показываются в списках товаров, где данные конкретных артикулов могут быть недоступны. Их все нужно обновлять для всех товаров, не только для одноартикульных, иначе списки сломаются.

        • +1
          Евгений Евгений 1 августа 2015 03:08 #

          Спасибо Леонид. Первый предложенный вариант полностью устроил.

          Обновление 20000 товаров изменилось с 40 минут до 49.

          Для одного раза в день прекрасно подходит.


  • 1
    Евгений 4 июля 2015 04:42 #

    Леонид, огромное спасибо!
    Даже не надеялся на столь быстрый ответ.

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите