Массовый импорт модификации продуктов [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
    
    
    
                                                        Ниже привожу пример…
постановка
К примеру, есть бюстгальтер с артикулом 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));
    
            
                Поблагодарить автора            
            
                 Отправить деньги            
        
        
            Комментарии: 18
                Как с помощью данного скрипта удалять существующие у товара модификации и записывать новые?            
                    
                удалить модификации продукта
                    $modx->removeCollection('msopModification', ['rid' => $rid]);создать/ обновить$modx->call('msopModification', 'saveProductModification', [&$modx, $rid, $modifications]);            
                Благодарю за помощь! То что надо!            
                    
                пожалуйста!            
                    
                Если поле размера у одного из товаров будет пустым, то он выгрузит так скрин Как сделать, что бы была проверка и не создавалась характеристика с пустым значением?            
                    то он выгрузит так скрин
кто он? скрипт? так сформируйте массив без пустых значений опций.
                Не у каждого товара может быть указан размер. И как сделать так, что бы при выгрузке поля добавлялись или редактировались, например по артикулу. Как сделать какое-не будь поле основным, любое, размер или артикул, если бы выгружался товар, то он бы обновлял или добавлял характеристики. Но не создавал новый набор опций.            
                    
                Суть в том, что если выводить msOptionsPrice.option?options=`size` и добавить значение &showZeroCount=`0`, то выводиться пустая опция с пустым значением и учет склада не работает, возможно баг в компоненте.            
                    
                ну опция то есть — вот она и выводится? где тут баг? 
ps.Если остались вопросы далее в ТП
                    ps.Если остались вопросы далее в ТП
                Ответе пожалуйста на вопрос, как обновлять опции по article. Что бы не создавались новые.            
                    
                Модификации характеризуются опциями, если у вас уже другой набор опций — это уже другая модификация.
Модификация в методе saveProductModification получается именно по набору опций, если для набора опций существует модификация — она будет обновлена, если нет — создана.
                    Модификация в методе saveProductModification получается именно по набору опций, если для набора опций существует модификация — она будет обновлена, если нет — создана.
                Дело в том, что если какие то опции пустые, например размер не указан, то он не обновляет а создает новые. 
Если разные товары, обувь и губки для обуви, у обуви будет размер у губки нет. Если обрабатывать size то в случае пустого значения, будет создаваться как новая опция. У товаров, которых есть пустые значения. В следствии этого, при повторной обработке, он создается заново Логичней всего, обрабатывать модефикации по article. Ибо в таком случае необходимо делать очистку всех модефикаций и заново грузить, так-как при добавленном цвете будет так-же создаваться новый набор модефикаций. Это крайне не удобно с выгрузкой из 1с, так-как придется постоянно делать полную выгрузку и обновлять существующие модефикации не как не получится.
                    Если разные товары, обувь и губки для обуви, у обуви будет размер у губки нет. Если обрабатывать size то в случае пустого значения, будет создаваться как новая опция. У товаров, которых есть пустые значения. В следствии этого, при повторной обработке, он создается заново Логичней всего, обрабатывать модефикации по article. Ибо в таком случае необходимо делать очистку всех модефикаций и заново грузить, так-как при добавленном цвете будет так-же создаваться новый набор модефикаций. Это крайне не удобно с выгрузкой из 1с, так-как придется постоянно делать полную выгрузку и обновлять существующие модефикации не как не получится.
например размер не указан, то он не обновляет а создает новыетак не создавайте пустые опции…
Логичней всего, обрабатывать модефикации по articleвы можете написать свою логику импорта по аналогии с данным примером.
Это крайне не удобно с выгрузкой из 1с, так-как придется постоянно делать полную выгрузку и обновлять существующие модефикации не как не получится.у вас же для выгрузки используется какой то скрипт или пакет, вот и вносите в него нужные вам изменения.
                Т.е. можно сделать отдельно обновление и создание новых опций опираясь на любое поле, например article, просто вы привели пример как создавать и обновлять одновременно, а как это в отдельности делать? 
                    создать/ обновить
$modx->call('msopModification', 'saveProductModification', [&$modx, $rid, $modifications]);            
                Пример загрузки изображений для 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));            
                Спасибо большое! Иначе это был бы ад.            
                    
                Как сделать так, чтобы в article модификации записывалось значение типа «LN 6701-B», а то туда только цифры заходят. А если строка то сразу 0. Может кто-то подсказать?
или может кто знает как после последней строки "$modifications = $modx->call('msopModif...." — взять id этой модификации,? чтобы через pdo внести такой article
                    или может кто знает как после последней строки "$modifications = $modx->call('msopModif...." — взять id этой модификации,? чтобы через pdo внести такой article
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.