[mSync+MsOptionprice] Импорт торговых предложений

Размещаю здесь, так как рейтинга не хватает)
Добрый день! Была довольно интересная задача по интеграции каталога 1-с с каталогом интернет магазина. В 1-с есть такая замечательная вещь как торговые предложения, которые по сути являются одним и тем же товаром только имеют различные параметры(размер/цвет/запах/количество и пр.) и так же могут обладать своими уникальными артикулами с ценами, для решения подобного функционала был использован отличный компонент msOptionsPrice2, который реализует модификации товара, куда и будем в последствии помещать наши торговые предложения. Но прежде чем создавать модификации требуется этот каталог еще получить из 1-с, в этом нам поможет компонент mSync, в его использовании нет никаких секретов, главное понимать что и откуда берется, а так же заранее изучить структуру файлов импорта.
Приступим к делу, для автоматизации процесса будем писать небольшой плагин срабатывающий на событие mSyncOnProductOffers из компонента mSync, это событие вызывается при обработки торгового предложения(файл offers.xml), и как уже было сказано выше, торговое предложение это тот же товар только отличный по характеристикам, чтобы обрабатываемое торговое предложение разместить как модификацию товара берем необходимые данные из обработки торгового предложения.
При работе с 1-с все свойства прописаны на русском, поэтому в начале скрипта массив замен и далее простенькая замена названий в массиве латинице для возможности дальнейшей работы с ним.
Сильно не пинайте, надеюсь кому-нибудь поможет.
<?php
if ($modx->event->name == 'mSyncOnProductOffers') {
    $object=$xml->ХарактеристикиТовара;
     $array = array();
     $trans = array(
    "а"=>"a",  "б"=>"b",  "в"=>"v",  "г"=>"g",
    "д"=>"d",  "е"=>"e",  "ё"=>"yo", "ж"=>"j",
    "з"=>"z",  "и"=>"i",  "й"=>"i",  "к"=>"k",
    "л"=>"l",  "м"=>"m",  "н"=>"n",  "о"=>"o",
    "п"=>"p",  "р"=>"r",  "с"=>"s",  "т"=>"t",
    "у"=>"y",  "ф"=>"f",  "х"=>"h",  "ц"=>"c",
    "ч"=>"ch", "ш"=>"sh", "щ"=>"sh", "ы"=>"i",
    "э"=>"e",  "ю"=>"u",  "я"=>"ya",

    "А"=>"A",  "Б"=>"B",  "В"=>"V",  "Г"=>"G",
    "Д"=>"D",  "Е"=>"E",  "Ё"=>"Yo", "Ж"=>"J",
    "З"=>"Z",  "И"=>"I",  "Й"=>"I",  "К"=>"K",
    "Л"=>"L",  "М"=>"M",  "Н"=>"N",  "О"=>"O",
    "П"=>"P",  "Р"=>"R",  "С"=>"S",  "Т"=>"T",
    "У"=>"Y",  "Ф"=>"F",  "Х"=>"H",  "Ц"=>"C",
    "Ч"=>"Ch", "Ш"=>"Sh", "Щ"=>"Sh", "Ы"=>"I",
    "Э"=>"E",  "Ю"=>"U",  "Я"=>"Ya",

    "ь"=>"",   "Ь"=>"",   "ъ"=>"",   "Ъ"=>""
);

    foreach( $object as $element) {
        foreach($element as $item){
            $name=strtr(addslashes((string)$item->Наименование), $trans);
            $value=addslashes((string)$item->Значение);
            $array[$name] = $value;
        }
    }
    $prices=$xml->Цены;
    foreach( $prices as $prices_element) {
        foreach($prices_element as $price_item){
            $price_type=addslashes((string)$price_item->ИдТипаЦены);
            $price_value=addslashes((string)$price_item->ЦенаЗаЕдиницу);
            $array['prices'][$price_type] = $price_value;
        }
    }
    
    
    $id=addslashes((int)$resource->id);
    $array['id']=intval($id);
    $modx->log(4,var_dump($array));
    
     if(isset($array['Obhvat'])){
            $size=$array['Razmer']."/".$array['Obhvat'];
        }
        else{
            $size=$array['Razmer'];
        }
    if(isset($array['Cvet'])){
            $color=$array['Cvet'];
        }
    
    if(isset($array['prices']["f282d7ca-2726-11e3-a84f-0002a54e8623"])){
        $price = $array['prices']["f282d7ca-2726-11e3-a84f-0002a54e8623"];
        $old_price =  $array['prices']["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    else{
        $price =  $array['prices']["f282d7c9-2726-11e3-a84f-0002a54e8623"];
    }
    $rid =  $array['id'];
    $mid=intval(addslashes((string)$xml->Штрихкод));
 
    $count=intval(addslashes((string)$xml->Количество));
    if ($mid==null){
        $article=$rid.rand(1000000,9999999);
    }
    else{
        $article = $mid;
    }
    
    /* создаем модификацию */
    if((isset($old_price))&&($old_price!=NULL)){
        $modification = 
        array(
          array(
              'price' => $price,
              'old_price' => $old_price,
              'article' => $article,
              'weight' => '',
              'count' => $count,
              'options' => array(
                'color' =>  $color,
                'size' => $size
                )
              )
            );
    }
    else{
         $modification = 
        array(
         array(
          'price' => $price,
          'article' => $article,
          'weight' => '',
          'count' => $count,
          'options' => array(
            'color' =>  $color,
            'size' => $size
            )
          )
        );   
    }
    
     /* создаем опции модификации */
    $modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
    
}
return;
web3
22 сентября 2017, 08:39
modx.pro
7
2 303
+2

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

Виталий Киреев
22 сентября 2017, 18:18
+2
Скрипт слишком завязан на вашу структуру. И непонятно зачем перегонять в транслит. Имя цены, кстати, можно узнать так (чтобы не по гуиду выбирать):
$priceTypeName = isset($_SESSION['price_mapping'][$price_type]) ? $_SESSION['price_mapping'][$price_type] : '';

$array[prices] — так лучше не писать, это вызывает E_NOTICE Use of undefined constant
    web3
    25 сентября 2017, 09:23
    1
    0
    -Да, завязан жестко, т.к. не предполагалось унифицированного решения для всех, хотя такое имеет место быть. Связка упомянутых выше компонентов показалась наиболее удачным решением проблемы импорта и торговых предложений. А поделиться решил на тот случай, если будут такие же как я, нуждающиеся в импорте и примерах, хоть и кривых, но рабочих.
    -В транслит перегоняю дабы оставить кириллические названия переменных от 1-с там где они есть и не плодить их дальше(хотя по всем данным, можно и кириллицу юзать без проблем, но не будем холиварить).
    -По поводу того, что цены в это время где-то в сессии лежат в душе не чаял, если буду оптимизировать сей продукт учту.
    -Тут есть грешок, исправил)
    Дмитрий
    27 августа 2018, 14:19
    0
    Надеюсь автор поста поглядывает иногда сюда. Подскажите как мне передать плагин «по себя»? Хочу разобраться, но не выходит пока. Процесс импорта зависает и вечно крутится. Откуда взяты Obhvat,Cvet, Razmer? Буду очень признателен, спасибо.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3