Содержание


Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Часть 3. Скрипт загрузки данных из файла в базу магазина

Comments

Серия контента:

Этот контент является частью # из серии # статей: Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart

Следите за выходом новых статей этой серии.

В прошлой статье 1C_OpenCart_02_edited была рассмотрена выгрузка данных из 1С в CSV-файл, который с помощью скрипт-файла отправлялся на FTP магазина. В этой статье будет рассмотрена загрузка данных из этого табличного файла напрямую в базу данных магазина.

Создание скрипта

Для написания программы в 1С использовался внутренний 1С-инструмент – Конфигуратор. Для того, чтобы написать скрипт для сайта на языке программирования PHP понадобится любой текстовый редактор, подойдет даже обычный блокнот. Но все же желательно пользоваться специализированным под программирование редактором, например, NetBeans – он бесплатный, и его можно скачать на сайте производителя. Чем лучше специализированная программа обычного редактора? Специализированные программы подсвечивают разными цветами операторы, переменные, текст и т.д. В этих программах есть подсказки, проверки написания и исправление ошибок, а также много различных нужностей. Создадим файл zagruzka.php, откроем его в редакторе и увидим такие строчки, если их нет – напишем:

<?php

?>

Между этими тегами и будет написана программа. Они обозначают начало и конец программного кода на php.

Константы

В прошлой статье был описан процесс выгрузки трех файлов в папку obmen на FTP магазина. В начале программы надо занести в переменные эти файлы:

$file = "./obmen/export.csv";
$file1 = "./obmen/flag.mod";
$file2 = "./obmen/flag2.mod";

В 1С - последний файл, который был отправлен на FTP - flag2.mod. Нужно проверить его наличие:

if (file_exists($file2)) 
{
}

Загрузка данных из файла

Если такой файл существует, следует, что файл с данными тоже есть, так как проверочный файл выгружается только в том случае, когда табличный файл благополучно выгружен. Поэтому открывается для чтения табличный файл, эта манипуляция производится в середине фигурных скобок оператора if. Затем в цикле с предусловием WHILE в одномерный массив $data считывается построчно CSV-файл с помощью функции fgetcsv, где в элементы этого массива заносится содержимое ячеек строки таблицы. После этого данные этого массива переписываются в двумерный массив $arr. И так продолжается, пока не закончится файл, при этом наращивается переменная $c, которая считает количество строк в файле. После того, как все данные из файла перенеслись в массив, переменной $flag передается количество строк таблицы и табличный файл, с которым работали, закрывается. После этого удаляются все файлы из папки obmen, чтобы в следующий раз при запуске скрипта работать с новыми данными или не работать, если данные не пришли. Заранее переменной $c присваивается значение ноль в начале программы. Код программы с описанными действиями приведен в листинге 1.

Листинг 1. Перенос данных из табличного файла в двумерный массив
if (file_exists($flag2))
{
if (($handle = fopen($file, "r")) !== FALSE)
{
while (($data = fgetcsv($handle, 1000, "^")) !== FALSE)
{
$arr[$c]['product_id']= $data[0] ;
$arr[$c]['name']=$data[1];
$arr[$c]['articul'] = $data[2] ;
$arr[$c]['brend']=$data[3];
$arr[$c]['rozn_cena']=$data[4] ;
$arr[$c]['melk_opt_cena']=$data[5];
$arr[$c]['opt_cena']=$data[6] ;
$arr[$c]['part_cena']=$data[7];
$arr[$c]['actual']=$data[8] ;
$arr[$c]['category']=$data[9];
$arr[$c]['kol']=$data[9];
$c++;
}
$flag = $c;
fclose($handle);
}
unlink($file1);
unlink($file2);
unlink($file);
}

Запись информации в базу данных

Нужная информация из файла бала загружена и после этого проведена уборка: были удалены файлы, с которыми работали. Теперь нужно подключится к базе данных, указывая название базы, адрес базы, логин и пароль к базе. Заодно после подключения нужно указать, что работаем в кодировке utf-8 (Листинг 2):

Листинг 2. Подключение к базе данных магазина
$database = "shop";
$link = mysql_pconnect("myshopchik.ru", "dima", "123456");
mysql_select_db($database) or die("Не могу подключиться к базе.");
mysql_query("set character_set_server='utf8'");
mysql_query("set names 'utf8'");

Запись данных в базу будет происходить тоже построчно: сначала данные одного товара, затем другого, - поэтому создается цикл for, в котором будет проводится запись данных:

for ($c=0; $c < $flag; $c++)
{
}

В этом цикле в переменные заносятся данные первой строки таблицы (см. Листинг 3):

Листинг 3. Перенос данных массива в переменные
$sproduct_id = $arr[$c]['product_id'];
$sname = $arr[$c]['name'];
$sarticul = $arr[$c]['articul'];
$sbrend = $arr[$c]['brend'];
$srozn_cena = $arr[$c]['rozn_cena'];
$smelk_opt_cena = $arr[$c]['melk_opt_cena'];
$sopt_cena = $arr[$c]['opt_cena'];
$spart_cena = $arr[$c]['part_cena'];
$sactual = $arr[$c]['actual'];
$scategory = $arr[$c]['category'];
$skol = $arr[$c]['kol'];

Получив данные товара, изберем тактику заполнения данных от общего к частному. А именно: сначала надо проверить есть ли такой производитель этого товара, для этого проверяется, есть ли в таблице производителей manufacturer у такого производителя код. Если кода нет, то такой производитель создается в этой таблице и выясняется его код. А если такой производитель есть, то код производителя выясняется сразу. Затем этот код передается переменной $manufacturer_id, этот процесс рассмотрим в листинге 4:

Листинг 4. Работа с таблицей производителей
$sql="SELECT manufacturer_id FROM manufacturer WHERE name = '$sbrend'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if ($row=='')
{
$result = mysql_query("INSERT INTO manufacturer (name,image, sort_order) 
VALUES ('$sbrend','',0)");
$sql="SELECT manufacturer_id FROM manufacturer WHERE name = '$sbrend'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
}
$manufacturer_id = $row['manufacturer_id'];

После работы с таблицей производителей нужно выяснить код интернет-категории из таблицы описания категорий. Предполагается, что категории товара если и будут создаваться, то одновременно и в 1С, и в магазине, поэтому наличие кода не проверяется, а нужно сразу его получить:

$sql="SELECT category_id FROM category_description WHERE name ='$scategory'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result); 
$category_id = $row['category_id'];

Итак, есть код категории товара и код производителя, теперь проверяется наличие товара в базе по коду товара, в 1С и в магазине коды будут совпадать:

$sql="SELECT product_id FROM product_description WHERE product_id = '$sproduct_id'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);

Если такого кода нет, то создается такой товар, для этого надо создать новую запись в таблице свойств товара product_description, записав в нее код товара, код языка и наименование товара.

if ($row=='')
{
$result = mysql_query("INSERT INTO product_description (product_id, language_id, 
name, description )
VALUES ('$sproduct_id', 1, '$sname', '')");

Далее этот товар и его данные записываются в таблицу product. Что это за данные можно понять по переменным, которые заносятся в поля этой таблицы, просмотреть код можно в листинге 5. Рассмотрим поподробнее какие данные заносятся в поля: date_available, date_added и date_modified – это даты доступности создания и изменения данных товара, в них заносятся переменные $small_date и $big_date, равные системной дате и времени, которые надо определить заранее в начале всей программы:

$small_date = date('Y-m-d');
$big_date = date('Y-m-d H:i:s');
Листинг 5. Запись данных товара в таблицу product_description
$sql="SELECT product_id FROM product_description WHERE name = '$sname'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$product_id = $row['product_id'];
$produkt = mysql_query("INSERT INTO product (product_id, model, sku, upc, location, 
quantity, stock_status_id, image, manufacturer_id, shipping, price, points, tax_class_id, 
date_available , weight, weight_class_id, length, width, height, length_class_id, 
subtract, minimum, sort_order, status, date_added , date_modified, viewed) 
VALUE ('$product_id','','$sarticul','','', $skol, '$sactual','','$manufacturer_id',0,
'$srozn_cena',0,0, '$small_date', 0, 1,0,0,0,1,1,1,1,1,'$big_date','$big_date',1)");

Затем прописываются в таблицу product_to_category в какой категории этот товар находится, а в таблице product_to_store отмечается этот товар для того, чтобы он отображался на сайте:

$pr_category = mysql_query("INSERT INTO product_to_category (product_id, 
category_id, main_category) VALUE ('$product_id', '$category_id', 1)");
$pr_store = mysql_query("INSERT INTO product_to_store (product_id, store_id) 
VALUE ('$product_id', 0)");

Теперь нужно внести цены для разных покупателей: партнерскую, оптовую и мелкооптовую. Для этого заранее необходимо создать еще три группы пользователей в настройках сайта: Мелкий опт, Опт и Партнер, помимо группы по-умолчанию default, к которой относятся пользователи, видящие розничную цену. И естественно id этих групп будут 2, 3 и 4. Также полю date_end присваивается значение переменной $next_year, которая показывает сколько времени будет действовать эта скидка. Прибавим к системному времени 3 года и присвоим это время переменной в начале программы:

$next_year = date('Y-m-d', strtotime('+3 year'));

И в итоге мы получили кусок программы, который можно посмотреть на листинге 6:

Листинг 6. Заполнение различных категорий цен товара
$pr_ceny2 = mysql_query("INSERT INTO product_discount (product_id, 
customer_group_id, quantity, priority, price, date_start, date_end) 
VALUE ('$product_id', 2, 1, 1,'$smelk_opt_cena','$small_date', '$next_year')");
$pr_ceny3 = mysql_query("INSERT INTO product_discount (product_id, 
customer_group_id, quantity, priority, price, date_start, date_end) 
VALUE ('$product_id', 3, 1, 1,'$sopt_cena','$small_date', '$next_year')");
$pr_ceny4 = mysql_query("INSERT INTO product_discount (product_id, 
customer_group_id, quantity, priority, price, date_start, date_end) 
VALUE ('$product_id', 4, 1, 1,' $spart_cena','$small_date', '$next_year')");
}

Выше был рассмотрен вариант, когда такого товара нет в базе, он был закрыт концом условия - скобкой }. Теперь рассмотрим вариант, когда товар такой есть (имеется товар с таким кодом в базе интернет-магазина). В этом случае нужно просто переписать все данные товара в таблицах, это можно увидеть в листинге 7:

Листинг 7. Перезапись данных существующего в базе товара
else
{
$result  = mysql_query("UPDATE product_description SET name = 
'$sname' WHERE product_id= '$sproduct_id'") or die(mysql_error());
$result2  = mysql_query("UPDATE product SET manufacturer_id = 
'$manufacturer_id', sku = '$sarticul', quantity = '$skol', 
stock_status_id = '$sactual', status = '$status' WHERE 
product_id= '$sproduct_id'") or die(mysql_error()); 
$result3  = mysql_query("UPDATE product_to_category SET 
category_id = '$category_id' WHERE product_id= '$sproduct_id'") 
or die(mysql_error());
$pr_ceny2 = mysql_query("UPDATE product_discount 
SET price = '$smelk_opt_cena', date_start = '$big_date', 
date_end = '$next_year' WHERE (product_id= '$sproduct_id' 
&& customer_group_id=2) ") or die(mysql_error());
$pr_ceny3 = mysql_query("UPDATE product_discount S
ET price = '$sopt_cena', date_start = '$big_date', 
date_end = '$next_year' WHERE (product_id= '$sproduct_id' 
&& customer_group_id=3) ") or die(mysql_error());
$pr_ceny4 = mysql_query("UPDATE product_discount 
SET price = '$spart_cena', date_start = '$big_date', 
date_end = '$next_year' WHERE (product_id= '$sproduct_id' 
&& customer_group_id=4) ") or die(mysql_error());
}

На этом закончилось содержимое цикла FOR, и остается закрыть связь с базой данных магазина:

mysql_close($link);

Заключение

Скрипт для загрузки данных в интернет-магазин готов. Этого достаточно, чтобы в ручном режиме загрузить данные из 1С в интернет-магазин. В 1С надо запустить программу vigryzka.ert, нажать на кнопку «сформировать», и данные отправятся. А для загрузки данных в интернет-магазин следует поместить скрипт zagryzka.php, который можно скачать в корень сайта, и в браузере набрать www.myshopchik.ru/zagryzka.php.

В следующей статье рассмотрим, как настроить автоматизацию загрузки и выгрузки данных, а также некоторые подводные камни, об которые можете споткнуться.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=848530
ArticleTitle=Загрузка товара из 1С 7.7 в интернет-магазин на примере CMS OpenCart: Часть 3. Скрипт загрузки данных из файла в базу магазина
publish-date=12042012