Массовый импорт модификации продуктов [miniShop2]

В поддержке задали вопрос как можно массово добавлять модификации для продуктов (разные цены для разных размеров, артикулы уникальны для каждого размера).

Ниже привожу пример…

постановка
К примеру, есть бюстгальтер с артикулом BL802. У него есть цвет, вес, название, описание и т.п.
И так представлены модификации:

артикул товара; размер; цена; количество; собственный артикул размера; вес
BL802;32A;1860.0;1;BL802-32A;150
BL802;32B;1860.0;1;BL802-32B;150
BL802;32C;1860.0;1;BL802-32C;150
BL802;34B;1896.0;5;BL802-34B;150
BL802;34C;1896.0;0;BL802-34C;150
BL802;36B;1896.0;0;BL802-36B;150
BL802;36C;1896.0;5;BL802-36C;150
BL802;38B;1896.0;5;BL802-38B;150
BL802;38C;1918.0;5;BL802-38C;150

$msoptionsprice = $modx->getService('msoptionsprice');
$msoptionsprice->initialize('web');

/*
 * основной артикул продукта выкидываем, он не используется
 * в опции модификации идет размер
 */
$modifications = array(
    array(
        'price'   => '1860.0',
        'article' => 'BL802-32A',
        'weight'  => '150',
        'options' => array(
            'size' => '32A'
        )
    ),
    array(
        'price'   => '1860.0',
        'article' => 'BL802-32B',
        'weight'  => '150',
        'options' => array(
            'size' => '32B'
        )
    ),
    array(
        'price'   => '1860.0',
        'article' => 'BL802-32C',
        'weight'  => '150',
        'options' => array(
            'size' => '32C'
        )
    ),
    array(
        'price'   => '1896.0',
        'article' => 'BL802-34B',
        'weight'  => '150',
        'options' => array(
            'size' => '34B'
        )
    ),
    array(
        'price'   => '1896.0',
        'article' => 'BL802-34C',
        'weight'  => '150',
        'options' => array(
            'size' => '34C'
        )
    ),
    array(
        'price'   => '1896.0',
        'article' => 'BL802-36B',
        'weight'  => '150',
        'options' => array(
            'size' => '36B'
        )
    ),
    array(
        'price'   => '1896.0',
        'article' => 'BL802-36C',
        'weight'  => '150',
        'options' => array(
            'size' => '36C'
        )
    ),
    array(
        'price'   => '1896.0',
        'article' => 'BL802-38B',
        'weight'  => '150',
        'options' => array(
            'size' => '38B'
        )
    ),
    array(
        'price'   => '1918.0',
        'article' => 'BL802-38C',
        'weight'  => '150',
        'options' => array(
            'size' => '38C'
        )
    ),
);

/* идентификатор продукта */
$rid = 152;

$modifications = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modifications));

Володя
Володя
27 октября 2016, 09:54
modx.pro
6 108
Поблагодарить автора Отправить деньги
Реклама

Комментарии: 18

Денис
Денис Старожил
29 августа 2019, 16:45
Как с помощью данного скрипта удалять существующие у товара модификации и записывать новые?
    Володя
    Володя Старожил
    30 августа 2019, 06:35
    удалить модификации продукта
    $modx->removeCollection('msopModification', ['rid' => $rid]);
    создать/ обновить
    $modx->call('msopModification', 'saveProductModification', [&$modx, $rid, $modifications]);
      Денис
      Денис Старожил
      30 августа 2019, 10:09
      Благодарю за помощь! То что надо!
        Володя
        Володя Старожил
        30 августа 2019, 10:57
        пожалуйста!
    Сергей
    Сергей Старожил
    26 сентября 2019, 17:24
    Если поле размера у одного из товаров будет пустым, то он выгрузит так скрин Как сделать, что бы была проверка и не создавалась характеристика с пустым значением?
      Володя
      Володя Старожил
      27 сентября 2019, 07:38
      то он выгрузит так скрин

      кто он? скрипт? так сформируйте массив без пустых значений опций.
        Сергей
        Сергей Старожил
        27 сентября 2019, 16:19
        Не у каждого товара может быть указан размер. И как сделать так, что бы при выгрузке поля добавлялись или редактировались, например по артикулу. Как сделать какое-не будь поле основным, любое, размер или артикул, если бы выгружался товар, то он бы обновлял или добавлял характеристики. Но не создавал новый набор опций.
      Сергей
      Сергей Старожил
      26 сентября 2019, 17:41
      Суть в том, что если выводить msOptionsPrice.option?options=`size` и добавить значение &showZeroCount=`0`, то выводиться пустая опция с пустым значением и учет склада не работает, возможно баг в компоненте.
        Володя
        Володя Старожил
        27 сентября 2019, 07:40
        ну опция то есть — вот она и выводится? где тут баг?
        ps.Если остались вопросы далее в ТП
        Сергей
        Сергей Старожил
        28 сентября 2019, 13:55
        Ответе пожалуйста на вопрос, как обновлять опции по article. Что бы не создавались новые.
          Володя
          Володя Старожил
          28 сентября 2019, 14:06
          Модификации характеризуются опциями, если у вас уже другой набор опций — это уже другая модификация.
          Модификация в методе saveProductModification получается именно по набору опций, если для набора опций существует модификация — она будет обновлена, если нет — создана.
            Сергей
            Сергей Старожил
            28 сентября 2019, 14:39
            Дело в том, что если какие то опции пустые, например размер не указан, то он не обновляет а создает новые.
            Если разные товары, обувь и губки для обуви, у обуви будет размер у губки нет. Если обрабатывать size то в случае пустого значения, будет создаваться как новая опция. У товаров, которых есть пустые значения. В следствии этого, при повторной обработке, он создается заново Логичней всего, обрабатывать модефикации по article. Ибо в таком случае необходимо делать очистку всех модефикаций и заново грузить, так-как при добавленном цвете будет так-же создаваться новый набор модефикаций. Это крайне не удобно с выгрузкой из 1с, так-как придется постоянно делать полную выгрузку и обновлять существующие модефикации не как не получится.
              Володя
              Володя Старожил
              28 сентября 2019, 14:49
              например размер не указан, то он не обновляет а создает новые
              так не создавайте пустые опции…
              Логичней всего, обрабатывать модефикации по article
              вы можете написать свою логику импорта по аналогии с данным примером.
                Володя
                Володя Старожил
                28 сентября 2019, 14:50
                Это крайне не удобно с выгрузкой из 1с, так-как придется постоянно делать полную выгрузку и обновлять существующие модефикации не как не получится.
                у вас же для выгрузки используется какой то скрипт или пакет, вот и вносите в него нужные вам изменения.
                  Сергей
                  Сергей Старожил
                  28 сентября 2019, 14:54
                  Т.е. можно сделать отдельно обновление и создание новых опций опираясь на любое поле, например article, просто вы привели пример как создавать и обновлять одновременно, а как это в отдельности делать?

                  создать/ обновить
                  $modx->call('msopModification', 'saveProductModification', [&$modx, $rid, $modifications]);
            Denis Bushaev
            Denis Bushaev Старожил
            11 ноября 2020, 10:04
            Пример загрузки изображений для msOptionsPrice2
            $msoptionsprice = $modx->getService('msoptionsprice');
            $msoptionsprice->initialize('web');
            
            $pcsAction = 'mgr/gallery/upload';
            $pcsOptions = ['id' => $productId, 'name' => $imgName, 'file' => $imgTmpPath];
            $pcsConfig = ['processors_path' => MODX_CORE_PATH . 'components/minishop2/processors/'];
            /** @var \modProcessorResponse $response */
            $response = $this->modx->runProcessor($pcsAction, $pcsOptions, $pcsConfig);
            if ($response->isError()) {
                $this->modx->log(MODX_LOG_LEVEL_ERROR, "Не удалось установить фото для товара ($productId). Сообщение: {$response->getMessage()}");
            }
            
            $responseObject = $response->getObject();
            $id = $responseObject['id'];
            
            $modifications = array(
                array(
                    'price'   => '1860.0',
                    'article' => 'BL802-32A',
                    'weight'  => '150',
                    'image' => $id,
                    'options' => array(
                        'size' => '32A'
                    )
                ),
            );
            
            $rid = 152;
            
            $modifications = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modifications));
              Олег
              Олег Старожил
              03 марта 2022, 14:40
              Спасибо большое! Иначе это был бы ад.
                Сергей
                Сергей Старожил
                04 ноября 2022, 12:33
                Как сделать так, чтобы в article модификации записывалось значение типа «LN 6701-B», а то туда только цифры заходят. А если строка то сразу 0. Может кто-то подсказать?

                или может кто знает как после последней строки "$modifications = $modx->call('msopModif...." — взять id этой модификации,? чтобы через pdo внести такой article
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  18