function GetFromMysqlData(){
GLOBAL $products;
$hostname = 'XXX.XXX.XXX.XXX'; // IP сервера
$port='XXXX'; // порт (если для подключения к серверу MySQL нужен порт)
$username = 'UNAME';
$password = 'UPASSWORD';
$dbname='DBNAME';
$dsn = 'mysql:dbname='.$dbname.';host='.$hostname.';port='.$port;
// если порт для подключения не нужен последний параметр не нужен
// дальше подключаемся к базе данных:
try{
$DBH = new PDO($dsn, $username, $password,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
}
catch(PDOException $e) {
echo $e->getMessage();
}
$sql="sel ect * from `products`"; // тут пишите свой запрос
// выполняем данный запрос:
$STH = $DBH->query($sql);
$STH->setFetchMode(PDO::FETCH_ASSOC);
// перебираем все строки запроса:
while($row = $STH->fetch()) {
$products[$row["id"]]=$row;
}
// если нужны еще какие-то запросы получаем данные по ним дальше
// закрывает подключение
$DBH = null;
return;
}
5) пишем функцию добавления нового элемента инфоблока :
function addElement($Product) {
$IB=##; // инфоблок, в который будет добавляться товар
// тут ничего сверхествественного смотрите формирование массива для добавления тут :
//http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/add.php
в массив параметров для добавления настоятельно рекомендую добавить вот такую строку:
$arLoadProductArray["XML_ID"]=$Product["productID"]; // , где $Product["productID"] - ID товара на сайте-оригинале
// добавляем новый элемент инфоблока:
if($PRODUCT_ID = $el->Add($arLoadProductArray)){
$res="New ID: ".$PRODUCT_ID." => ".$Product["productID"];
// добавляем товар в каталог продукции:
$arFields=array(
"ID"=>$PRODUCT_ID,
"QUANTITY"=>1
);
if(CCatalogProduct::Add($arFields))
$res.='<br />Добавили параметры товара к элементу каталога '.$PRODUCT_ID.'<br>';
else
$res.='<br />Ошибка добавления параметров<br>';
// устанавливаем цену на товар:
$PRICE_TYPE_ID = 1;
$arFields = Array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
"PRICE" => $Price,
"CURRENCY" => "RUB" /*код валюты*/
);
$Priceres = CPrice::GetList(
array(),
array(
"PRODUCT_ID" => $PRODUCT_ID,
"CATALOG_GROUP_ID" => $PRICE_TYPE_ID
)
);
if ($arr = $Priceres->Fetch()){
CPrice::Update($arr["ID"], $arFields);
} else {
CPrice::Add($arFields);
}
}
return $res/*=array("array"=>$arLoadProductArray,"res"=>$res)*/;
}
6) Запускаем функцию получения данных из базы:
GetFromMysqlData();
7) Перебираем все товары, полученные из базы. Если нужны какие-то манипуции с данными, полученными из базы, перед подключением добавления нового товара проводим эти манипуляции:
foreach($products as $element){
addElement($element);
}
Вот в принципе и все. Получили данные из базы, обработали их, добавили на сайт.
И вот тут понимаем, что одна из таблиц сайта-оригинала содержит какие-то свойства, которые никак не привязаны напрямую к таблице с товарами. Вот тут-то и понадобится параметр
$arLoadProductArray["XML_ID"]
который мы предусмотрительно создали при добавлении товаров. мы воспользуемся им для обновления товаров.
Создаем еще один запрос к старой базе (у меня свойство было - доп. изображения товара):
$STH = $DBH->query('select photoID, productID, filename fr om product_pictures');
$STH->setFetchMode(PDO::FETCH_ASSOC);
while($row = $STH->fetch()) {
// вытаскиваем одну за другой строки, помещаем в $row
$photos[$row["productID"]][]=array(
"PhotoID"=>$row["photoID"],
"Photo"=>$row["filename"],
"ProductID"=>$row["productID"]
);
}
Скажу честно: мне повезло, что все изображения для старого сайта хранились в 2-х папках: "big" и "extra" и привязка изображений к товарам делалась просто по имени файла изображения. Эти 2 папки просто перелил по ftp со старого сайта в папку uploads нового...
Вот и все... всем спасибо за внимание. Если кто-то впустую потратил время прочитав мою статью - звыняйте:) Кому хоть как-то помог - очень рад. У кого есть вопросы - пишите в комментариях. не обещаю ответить сразу, но постараюсь по мере возможности.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».