Встала задача - реализовать загрузку каталога из двух csv-файлов: файла с разделами каталога и файла с товарами с разброской свойств, характеристик товаров и привязкой к разделам. Создание товаров/разделов - не вижу смысла описывать, остановлюсь более детально на механизме обработки csv-файла.
Доброго времени суток. Встала задача - реализовать загрузку каталога из двух csv-файлов: файла с разделами каталога и файла с товарами с разброской свойств, характеристик товаров и привязкой к разделам. Создание товаров/разделов - не вижу смысла описывать, остановлюсь более детально на механизме обработки csv-файла.
Для начала, рекомендую ознакомиться с
Итак, код чтения csv-файла:
require_once ($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/csv_data.php"); $csvFile = new CCSVData('R', false); $csvFile->LoadFile($_FILES['products_csv']['tmp_name']); $csvFile->SetDelimiter(','); $arRows = array(); $Headers = array(); while ($arRes = $csvFile->Fetch()) { if(empty($Headers)){ $Headers = $arRes; } else { $arRow = array(); foreach ($Headers as $key=>$value) { $arRow[$value] = $arRes[$key]; } $arRows[] = $arRow; } }
Вот так получаем ассоциативный массив из csv-файла.
Построчно:
Ну вот. Данные из файла считали. Дальше их необходимо обработать. Загрузить сразу все одним комом - не реально (Разделов у меня было 144 - они бы загрузились. А вот товаров - несколько тысяч. Тут бы сервер и объяснил мне на сколько я не прав...), следовательно, нужно обрабатывать блоками. Я выбрал вариант обработки каждой строки по отдельности. Для этого получился небольшой JS скрипт с отправкой данных через ajax-post-запросы:
<div id="loading"><p class="persents"><?=Loc::getMessage('PAI_LOADING');?><span class="pv">0</span>% (<?=Loc::getMessage('PAI_ROW');?><span class="rv">1</span>/<?=count($arRows)?>) </p></div> <script type="text/javascript"> var ajaxurl = ''; // url to pass ajax requests var Rows = <?=json_encode($arRows);?> var countRows = <?=count($arRows);?> function work_with_row(num, Row, d){ var Persents = (parseInt(num)+1)*100 / parseInt(countRows); $('p.persents').find('span.pv').html(Math.round(Persents)); $('p.persents').find('span.rv').html(parseInt(num)+1); $.ajax({ type: "POST", url: ajaxurl, data: {action: 'AddProduct', ProductData: Row}, dataType: "json", success: function (data) { d && d.resolve(); }, onfailure: function(){ d && d.resolve(); } }); } $(document).ready(function(){ var wait = BX.showWait('loading'); var deferreds = []; var i=10; $.each(Rows,function(index,value){ var d = new $.Deferred(); window.setTimeout(function() { work_with_row(index,value,d) }, 1000*index+(i++)); deferreds.push(d); }); $.when.apply($, deferreds).done(function () { $('p.persents').html('<?=Loc::getMessage('PAI_LOAD_DONE')?>'); BX.closeWait('loading',wait); }); }); </script>
Построчно:
Все! Вот такой вот вышел очередной опыт в переносе каталога из одной системы - в другую.
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.