Встала передо мной задача: перенести имеющийся сайт (назовем его оригинальным) с неизвестной мне CMS (смотрел сервисом
Встала передо мной задача: перенести имеющийся сайт (назовем его оригинальным) с неизвестной мне CMS (смотрел
сервисом
Был доступ к PhpMyAdmin оригинального сайта и доступ в его админку, чтоб понять взаимосвязь между всеми полями каталога и таблицами базы данных. В результате - нашел интересующую меня таблицу.
Для простоты обработки данных сделал бекап базы с сайта и получил sql-файлик.
Далее - берем битриксовую виртуальную машину и устанавливаем ее на VMPlayer. Проводим установку стандартной
демки интернет-магазина на малом бизнесе. Устанавливаем PhpMyAdmin (см.
Дальше переходим к разработке скрипта, который будет проводить перенос данных.
Сразу предупреждаю. Заказчики решили сделать всю разработку сначала на стандартном шаблоне битрикса, поэтому старался максимально использовать имеющиеся данные, в том числе и инфоблок с каталогом (единственное - добавил нужные мне поля).
Разделов на сайте - не много, поэтому не стал заморачиваться с созданием скрипта, который создаст мне разделы, а просто вручную внес их в инфоблоке.
В будущем скрипте прописываю функцию, в которой через switch прописываю взаимосвязи кодов разделов оригинального сайта и сайта-приемника.
Пишем аналогичные функции по обработке других свойств, которые описывают каталог списками выбора (разные цветовые характеристики, фиксированные размеры и т.п.)
Определяем 2 массива: массив $items - будет собирать данные из базы и $unic_codes - расскажу позже о нем.
Делаем соединение с базой, выгруженной из оригинального сайта.
//соединение с базой данных при помощи функции mysql_connect() //в аргументах функции укажите имя сервера, логин и пароль. $db = mysql_connect("localhost","ваш_пользователь","ваш_пароль"); //функция mysql_select_db() выбирает текущую //базу данных с именем базы с данными с оригинального сайта if(!mysql_select_db("ваша_база" ,$db)){echo "not connected"; die;} //функция mysql_query() выполняет запрос на выборку данных //результирующий набор данных хранится в переменной $sql //LIMIT ограничение на количество выгружаемых полей $sql = mysql_query("SEL ECT * FR OM `таблица_с_каталогом` LIMIT 0, 1000" ,$db); //закрытие соединение (рекомендуется)*/ mysql_close($db);
Небольшие пояснения: у меня в оригинальной базе 2074 единиц товара. При попытке перенести все за один раз - просто падал сервер (Для сервера выделял всего 512 метров ОЗУ), поэтому делал обрезки по 1000 и еще 1074 единиц (скрипт просто 2 раза запускал....)
Дальше обрабатываем полученную выгрузку:
while ($rows = mysql_fetch_row($sql)) $item=array( "Cur_ID"=>$rows[0], /*текущий ИД*/ "Cat_id"=> SetSection($rows[2]), /*категория*/ .... тут разные свойства .... "code"=>$rows[8], /*Артикул*/ "el_CODE"=>unic_it(translit_it($rows[8])), "name"=>$name, /*Название*/ "cost"=>$rows[10], /*Стоимость*/ "descr_short"=>$rows[17], /*Анонсовое описание*/ "descr"=>$rows[18], /*Детальное описание*/ "photo"=>$det_picture, /*Детальное изображение*/ "photo"=>$an_picture, /*Анонсовое изображение*/ ) ; $items[]= $item; }
Пояснения:
Для себя, для удобства решил пользоваться ассоциативным массивом (если хотите - можете и обычный использовать....). В переменную $item закидываем в соответствующие поля значения из базы (смотрел на нужные номера полей через print_r() ) а потом эту переменную добавляем ко всем остальным.
По поводу поля el_CODE: это будет символьным кодом нашего товара. В него заливаю имя товара (транслитерированное), которое сразу проверяю на уникальность (столкнулся с тем, что есть несколько одинаковых по названию товаров....). Вот функция проверки на уникальность:
function unic_it($code){ //проверяем выбранный код на уникальность global $unic_codes; if (in_array($code, $unic_codes)){ $code = $code."a"; } $unic_codes[]=$code; return $code; }
Данная функция на входе получает код. Ищет его в глобальном (для данного скрипта) массиве $unic_codes и если находит - добавляет к коду символ "а". Полученный в результате код добавляется к списку уникальных.
Поля с изображениями делал переменными, т.к. мне нужно было делать сложные манипуляции с выбором изображения.
В общих чертах данные переменные выглядят так:
$det_picture=CFile::MakeFileArray("абсоллютный путь к папке с изобржениями на оригинальном сайте".$rows[19]);
В базе хранилось только имя изображения, а все изображения - в одной общей папке. Поэтому по имени изображения нахожу его на оригинальном сайте и создаю файловый архив данного изображения.
Вот в принципе и все. Массив с записями из базы готов. Теперь нужно его занести в каталог сайта-приемника.
foreach($items as $item): $el = new CIBlockElement; //определяем новый элемент $PROP = array(); //задаем его свойства $PROP[1] = [значение]; и другие свойства $arLoadProductArray = Array( "MODIFIED_BY" => $USER->GetID(), "IBLOCK_SECTION_ID" => $item["Cat_id"], "IBLOCK_ID" => 3, /*тут ставите свой инфоблок*/ "PROPERTY_VALUES"=> $PROP, "NAME" => $item["name"], "CODE" => $item["el_CODE"], "DETAIL_PICTURE" => $item["photo"], "PREVIEW_PICTURE" => $item["photo_small"], "ACTIVE" => "Y", ); if($PRODUCT_ID = $el->Add($arLoadProductArray, false, false, true)) { //echo "New ID: ".$PRODUCT_ID."<br />"; //добавляем количество товара и его цену $PRICE_TYPE_ID = 1; //базовая валюта $arFields = Array( "PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID, "PRICE" => $item["cost"], "CURRENCY" => "UAH" /*код валюты*/ ); $res = CPrice::GetList( array(), array( "PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) ); if ($arr = $res->Fetch()) { CPrice::Update($arr["ID"], $arFields); } else { CPrice::Add($arFields); } //добавляем количество на складе (по умолчанию = 1) $arFields = array("ID" => $PRODUCT_ID,"QUANTITY"=>1); if(CCatalogProduct::Add($arFields)) //echo "Добавили параметры товара к элементу каталога ".$PRODUCT_ID.'<br>'; continue; else echo 'Ошибка добавления параметров для '.$PRODUCT_ID.'<br>'; // конец добавления элемента } else { echo "Error: ".$el->LAST_ERROR; echo "<pre>"; print_r($arLoadProductArray); echo "</pre>"; } endforeach;
Теперь по порядку: в цикле перебираем все элементы массива. На каждой итерации создаем ассоциативный массив $arLoadProductArray, который описывает все поля вновь создаваемого элемента. Дальше если добавление прошло удачно - нужно задать стоимость данного товара и его количество. Все это достаточно хорошо расписано в документации продукта, поэтому сильно расписывать не буду. Кого заинтересует - спрашивайте по коду - буду рассказывать.
Не забудьте в визуальной части сайта отметить добавленные вами свойства, чтобы пользователи тоже смогли их увидеть:)
Вот в принципе и все...
Разработка сайта
Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...
Сопровождение сайта
Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение
Работы по сайту
Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.