14:18 15.05.2012
Синхронизация данных в 2 интернет-магазинах ч.1 - Добавление товаров
Итак, у нас есть 2 принципиально разных по структуре и реализации интернет-магазина:
- старый - написан 5-6-7 лет назад на perl (совсем нигде не MVC, а также все радости функционального программирования на перле); база mySQL, но это не важно;
- новый - на движке opencart 1.5.1.3, база также mySQL
Есть
сверхзадача - нужно сделать чтобы
товары добавлялись одновременно в оба магазина через админку opencart.
Один из вариантов решения этой задачи (первый, который пришел в голову, имхо самый пролетарский) такой:
- на принимающей стороне (
старый магазин) скрипт (на перле), который:
- будет получать данные методом POST;
- в зависимости от переданных параметров он будет (естественно, после всяческих проверок): добавлять полученные данные в базу, изменять существующие или удалять;
- в случае добавления - на выходе он будет отдавать ключ добавленной записи;
- на передающей стороне (
новый магазин):
- нам нужно модифицировать модели opencart (а именно фунции добавления/удаления/редактирования в админских ModelCatalogProduct и ModelCatalogCategory) так, чтобы при добавлении/удалении/редактировании товара или категории скрипт curl'ом посылал необходимые данные методом POST нашему скрипту на принимающей стороне;
- в базу opencart в таблицы продуктов/категорий добавить еще по одному полю - ключ соответствующей записи в старой базе;
- для добавлении записи - он посылает принимающему скрипту данные, введенные пользователем в админке opencart;
- для удаления - посылает только ключ
- для редактирования - и данные и ключ
Также необходимо предусмотреть элементарный механизм защиты при любом изменении данных. Хотя-бы просто передавать и проверять (при приеме) какой-нибудь пасскей. Ну, думаю, идея ясна.
Перейдем к реализации. Здесь реализовано добавление товара. Остальные операции будут в следующих постах. Замечу, что здесь приведено решение для моей конкретной задачи (т.е. для достижения гибкости и универсальности нужно часть кода переписать).
1. admin/model/catalog/product.php, функция addProduct.
class ModelCatalogProduct extends Model {
public function addProduct($data) {
// приведем в пригодный для передачи вид массив с добавляемым товаром
// разбираем опции
foreach ($data['product_option'][0]['product_option_value'] as $key => $value) {
$option_value_description_query = $this->db->query("SELECT * FROM option_value_description WHERE option_value_id = " . $value['option_value_id']);
foreach ($option_value_description_query->rows as $option_value_description) {
$optn = $option_value_description['name'];
}
$options[] = array('name' => urlencode($optn), 'price' => urlencode($value['price']));
}
// меняем размер картинки
$this->load->model('tool/image');
$thumb = $this->model_tool_image->resize($data['image'], 100, 100);
// наш массив
$prd_info = array(
'secret_key' => '1ae5f76b2234c3a0',
'name' => urlencode($this->db->escape($data['product_description'][1]['name'])),
'model' => urlencode($this->db->escape($data['model'])),
'sex' => urlencode($data['manufacturer_id']), // 1 = women, 2=men, 3=unisex
'description' => urlencode($this->db->escape($data['product_description'][1]['description'])),
'image_full' => urlencode($data['image']),
'image_thumb' => urlencode($thumb),
'options' => serialize($options)
);
// делаем из него строку
$fields_string = '';
foreach ($prd_info as $key => $value) {
$fields_string .= $key . '=' . $value . '&';
}
rtrim($fields_string, '&');
// curl
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://site.com/receiver.php');
curl_setopt($curl, CURLOPT_USERAGENT, 'Opera 10.00');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, count($prd_info));
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
$res = curl_exec($curl);
if (!$res) {
// если ошибка
$error = curl_error($curl) . '(' . curl_errno($curl) . ')';
echo $error;
} else {
// в переменной $res у нас ключ свеже-добавленного товара
if (is_numeric($res)) {} // ... проверяем и прочие preg_replac'ы
}
..........
дальше идет оригинальный код функции
2. Принимающий скрипт в силу его линейности и неинтересности приводить не буду. Хотя perl люблю и уважаю.

read more at Записная книжка web-девелопера