Импорт торговых предложений из 1С?
Добрый день, имеется небольшая проблема при импорте каталога из 1С. Немного конкретнее, имеется выгрузка из 1С состоящая из 2-х файлов, номенклотура и торговые предложения. Свойства из номенклотуры получаю без проблем, а вот характеристики торгового предложения никак. Для импорта использую mSync.
Вот характеристики в файле импорта:
В документации mSync и гугле информации не нашел…
Еще немного дополню, стоит модуль msoptionprice2, в документации сказано что если он установлен, то при импорте будут автоматически созданы модификации на основе предложений, но такого не происходит.
Вот характеристики в файле импорта:
<Предложение>
<Ид>a63549cb-7a24-11e5-8ea4-0002a54e8623#a63549cd-7a24-11e5-8ea4-0002a54e8623</Ид>
<Штрихкод>22000000</Штрихкод>
<Наименование>Трусы стринг V.I.P.A (Размер - S, Цвет - черный)</Наименование>
<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
<ХарактеристикиТовара>
<ХарактеристикаТовара>
<Наименование>Размер</Наименование>
<Значение>S</Значение>
</ХарактеристикаТовара>
<ХарактеристикаТовара>
<Наименование>Цвет</Наименование>
<Значение>черный</Значение>
</ХарактеристикаТовара>
</ХарактеристикиТовара>
Весь импорт разбит на 2 файла: import.xml(основная информация о товаре, свойства товара и структура каталога) и offer.xml(тут все торговые предложения и их характеристики).В документации mSync и гугле информации не нашел…
Еще немного дополню, стоит модуль msoptionprice2, в документации сказано что если он установлен, то при импорте будут автоматически созданы модификации на основе предложений, но такого не происходит.
Комментарии: 23
Еще немного дополню, стоит модуль msoptionprice2, в документации сказано что если он установлен, то при импорте будут автоматически созданы модификации на основе предложений, но такого не происходит.В документации сказано про msoptionprice 1-ой версии. Данная информация давно неактуальна, а компонент msoptionprice уже 2-ой версии.
Да, прошу прощения, это наверное даже было взято из документации mSclad, который канул в лету… У этого компонента просто сказано что он импортирует торговые предложения, но как и куда ни слова…
Обратитесь в техподдержку компонента с вашим вопросом.
Проблема в том, что использую тестовый хостинг, дабы понять возможно ли выполнить требуемые задачи данным компонентом. В описании сказано что,
Возможности:Но при этом никакой подробной инструкции и чего либо еще вразумительного. А какой смысл покупать компонент, если он мне может не подойти?
— Импорт товаров со свойствами и картинками, торговых предложений из 1С и других сервисов.
Торговое предложение это цена и остатки. Вот их компонент и обновляет в товарах minishop. msoptionprice2 из коробки не поддерживается, но можно создать плагин, который при обработке торгового предложения создаст объекты msoptionprice2.
Окей, есть проблема даже в этом. Есть фаил offers.xml, в котором как раз таки и лежат торговые предложения, а у каждого торгового предложения есть некие характеристики(цвет, размер) которые по идее тоже должны куда-то попадать. Без проблем можно было бы написать простенький обработчик если бы при событии обработки офера в данные не вываливало весь полученный хмл. Пробовал выводить данные проходящие при событии в переменной через лог, так мне фаил раздувало на 200 метров. Файлы импорта весят не более 1,5кб.
P.S. Использовал это событие — mSyncOnProductOffers, выводил $xml. Вместо этого он вывел кучу системной инфы, начиная от ленговых переменных, заканчивая информацией о компонентах и их данные…
Ну да ладно, как хоть получить характеристики из офера? Разные цены из офера у меня подтянулись, а как быть с характеристиками не знаю.
P.S. Использовал это событие — mSyncOnProductOffers, выводил $xml. Вместо этого он вывел кучу системной инфы, начиная от ленговых переменных, заканчивая информацией о компонентах и их данные…
Ну да ладно, как хоть получить характеристики из офера? Разные цены из офера у меня подтянулись, а как быть с характеристиками не знаю.
Залез внутрь компонента, смотрю функцию сохранения товара во временную таблицу вижу что есть работа с характеристиками, уже хорошо. Но характеристики в базу так и не попадают…
/**
* @param SimpleXMLElement $xml
* @return array Временные данные товара
*/
protected function importProduct($xml)
{
$prod = array();
$prod['name'] = $this->stringXml($xml->Наименование);
$prod['description'] = $this->stringXml($xml->Описание);
//standart properties
$prod['article'] = $this->stringXml($xml->Артикул);
$prod['manufacturer'] = $this->stringXml($xml->Изготовитель);
$prod['bar_code'] = $this->stringXml($xml->Штрихкод);
//additional properties
$prod['properties'] = array();
if (isset($xml->ЗначенияСвойств)) {
foreach ($xml->ЗначенияСвойств->ЗначенияСвойства as $xml_property) {
$this->addComplexProperty($xml_property, $prod['properties']);
}
}
if (isset($xml->СписокСвойствОписания)) {
foreach ($xml->СписокСвойствОписания->СвойствоОписания as $xml_property) {
$this->AddProperty($xml_property, $prod['properties']);
}
}
if (isset($xml->ЗначенияРеквизитов)) {
foreach ($xml->ЗначенияРеквизитов->ЗначениеРеквизита as $xml_property) {
$this->AddProperty($xml_property, $prod['properties'], array('ВидНоменклатуры', 'ТипНоменклатуры'));
}
}
if (isset($xml->ХарактеристикиТовара)) {
foreach ($xml->ХарактеристикиТовара->ХарактеристикаТовара as $xml_property) {
$this->AddProperty($xml_property, $prod['properties']);
}
}
$prod['properties'] = $this->jsonXml($prod['properties']);
$prod['images'] = $this->jsonXml($xml->Картинка);
$prod['features'] = $this->jsonXml($xml->ХарактеристикиТовара);
$prod['uuid'] = $this->stringXml($xml->Ид);
$prod['parent_uuid'] = $this->stringXml($xml->Группы->Ид);
$prod['status'] = $this->stringXml($xml->Статус);
if (empty($prod['status']) && isset($xml->attributes()->Статус)) {
$prod['status'] = $this->stringXml($xml->attributes()->Статус);
}
return $prod;
}
Это вообще другое место.
$xml это SimpleXMLElement, соответственно получить из него список характеристик в плагине можно так:
docs.modx.pro/components/msync/settings
msync_price_by_feature_tv — по умолчанию цены по характеристикам пишутся в указанную в этой настройке TV
$xml это SimpleXMLElement, соответственно получить из него список характеристик в плагине можно так:
$xml->ХарактеристикиТовара
Вы, наверное, еще и $resource выводили в лог.docs.modx.pro/components/msync/settings
msync_price_by_feature_tv — по умолчанию цены по характеристикам пишутся в указанную в этой настройке TV
Понял, кроме одного момента. Т.е. из коробки характеристики никак не получить?
Список характеристик берется из файла import.xml и запоминается в $_SESSION. А характеристики предложения можно получить, как я написал. При этом цены по этим характеристикам пишутся в TV (вместе с именем характеристики).
Вот теперь идеально. Спасибо большое.
Еще спрошу, если можно, как можно получить при срабатывании события mSyncOnProductOffers id товара, к которому это предложение относится?
$resource->id
Вот теперь чувствую себя контент менеджером… Спасибо!
А не подскажите, вот почти со всем разобрался, единственное, не могу обновить цвета и размеры у товаров, на сколько я понял, они хранятся не так как все остальные(вес, цена)?
На данный момент имею вот это.
На данный момент имею вот это.
<?phpКак сохранять и получать свойства типа цветов, размеров и подобных?
if ($modx->event->name == 'mSyncOnProductOffers') {
$object=$xml->ХарактеристикиТовара;
$array = array();
foreach( $object as $element) {
foreach($element as $item){
$name=addslashes((string)$item->Наименование);
$value=addslashes((string)$item->Значение);
$array[$name] = $value;
}
}
$id=addslashes((int)$resource->id);
$array[id]=intval($id);
$modx->log(4,var_dump($array));
$data = $modx->getObject('msProduct', $array[id]);
if(isset($array[Обхват])){
$size=$array[Размер]."/".$array[Обхват];
$data->set('size',$size);
}
else{
$size=$array[Размер];
$data->set('size',$size);
}
if(isset($array[Цвет])){
$data->set('color',$array[Цвет]);
}
$data->set('weight', 500);
$data->save();
$vendor = $data->get('Vendor');
}
return;
Уже не актуально. Сделал сам.
А как-же правила хорошего тона?
Решение желательно выкладывать)
Конкретно мне не нужно, но может кому и пригодится!
Решение желательно выкладывать)
Конкретно мне не нужно, но может кому и пригодится!
Все верно, пока есть не совсем аккуратная, но все же рабочая версия плагина.
Из необходимого, чтобы в системе не было переменных на русском при обработке их переводим, дабы создаем из необходимых данных массив с которым в последствии работаем. В конкретном случае обрабатываем торговые предложения, у которых есть несколько типов цен и пара характеристик, торговые предложения складываем как модификации из компонента msOptionPrise2.
Из необходимого, чтобы в системе не было переменных на русском при обработке их переводим, дабы создаем из необходимых данных массив с которым в последствии работаем. В конкретном случае обрабатываем торговые предложения, у которых есть несколько типов цен и пара характеристик, торговые предложения складываем как модификации из компонента msOptionPrise2.
<?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'];
}
/*Тут сохраняется необходимая цена,т.к. присутствуют 3 типа цен(розница,акция и закупочная), используем только розницу и акцию, далее в зависимости от наличия цены по акции, если она есть, то отправляем ее в текущую цену, а розницу в старую цену.*/
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->Количество));
$article = $mid;
/* опции модификации, тут вручную собираем нужные характеристики товара(опции) */
$options = array(
'color' => $color,
'size' => $size
);
$msoptionsprice = $modx->getService('msoptionsprice');
$msoptionsprice->initialize('web');
/* создаем опции продукта */
$options = $msoptionsprice->setProductOptions($rid, $options);
/* создаем модификацию */
if((isset($old_price))&&($old_price!=NULL)){
$modification = array(
'price' => $price,
'old_price' => $old_price,
'article' => $article,
'weight' => '',
'count' => $count,
'options' => array(
'color' => $color,
'size' => $size
)
);
}
else{
$modification = array(
'price' => $price,
'article' => $article,
'weight' => '',
'count' => $count,
'options' => array(
'color' => $color,
'size' => $size
)
);
}
/* создаем опции модификации */
$modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
}
return;
Плагин вешаем на событие «mSyncOnProductOffers».
если у вас актуальная версия компонента msOptionsPrice то вот это лишнее
/* опции модификации, тут вручную собираем нужные характеристики товара(опции) */
$options = array(
'color' => $color,
'size' => $size
);
$msoptionsprice = $modx->getService('msoptionsprice');
$msoptionsprice->initialize('web');
/* создаем опции продукта */
$options = $msoptionsprice->setProductOptions($rid, $options);
опции будут созданы автоматически при создании модификации
Только что попробовал, к сожалению без этого куска совсем не запустилось, не заполнились необходимые свойства и модификации было не из чего создавать…
Я правильно понял, что для создания модификации достаточно сформировать входной массив
Вот что попадает во входные переменные
$modification = array(
'price' => $price,
'old_price' => $old_price,
'article' => $article,
'weight' => '',
'count' => $count,
'options' => array(
'color' => $color,
'size' => $size
)
);
А затем вызвать событие$modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
Окей, все сделал, но почему-то модификации не создались.Вот что попадает во входные переменные
[mSyncOnProductOffers]int(162)/*это $rid*/
array(5) {/*а это $modification*/
["price"]=>
string(6) "675.00"
["article"]=>
int(2200000076250)
["weight"]=>
string(0) ""
["count"]=>
int(2)
["options"]=>
array(2) {
["color"]=>
string(12) "черный"
["size"]=>
string(1) "M"
}
}
Попробовал сделать по представленному скрипту и все ок работает, спасибо, но проблема в том, что при выгрузке заказов в 1С, загружаются все параметры кроме дополнительных (размер, цена). Может кто-нибудь сможет, что-нибудь подсказать…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.