[mSync+MsOptionprice] Импорт торговых предложений
Размещаю здесь, так как рейтинга не хватает)
Добрый день! Была довольно интересная задача по интеграции каталога 1-с с каталогом интернет магазина. В 1-с есть такая замечательная вещь как торговые предложения, которые по сути являются одним и тем же товаром только имеют различные параметры(размер/цвет/запах/количество и пр.) и так же могут обладать своими уникальными артикулами с ценами, для решения подобного функционала был использован отличный компонент msOptionsPrice2, который реализует модификации товара, куда и будем в последствии помещать наши торговые предложения. Но прежде чем создавать модификации требуется этот каталог еще получить из 1-с, в этом нам поможет компонент mSync, в его использовании нет никаких секретов, главное понимать что и откуда берется, а так же заранее изучить структуру файлов импорта.
Приступим к делу, для автоматизации процесса будем писать небольшой плагин срабатывающий на событие mSyncOnProductOffers из компонента mSync, это событие вызывается при обработки торгового предложения(файл offers.xml), и как уже было сказано выше, торговое предложение это тот же товар только отличный по характеристикам, чтобы обрабатываемое торговое предложение разместить как модификацию товара берем необходимые данные из обработки торгового предложения.
При работе с 1-с все свойства прописаны на русском, поэтому в начале скрипта массив замен и далее простенькая замена названий в массиве латинице для возможности дальнейшей работы с ним.
Сильно не пинайте, надеюсь кому-нибудь поможет.
Добрый день! Была довольно интересная задача по интеграции каталога 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; Комментарии: 3
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
$array[prices] — так лучше не писать, это вызывает E_NOTICE Use of undefined constant
-В транслит перегоняю дабы оставить кириллические названия переменных от 1-с там где они есть и не плодить их дальше(хотя по всем данным, можно и кириллицу юзать без проблем, но не будем холиварить).
-По поводу того, что цены в это время где-то в сессии лежат в душе не чаял, если буду оптимизировать сей продукт учту.
-Тут есть грешок, исправил)