Необходимо починить синхронизацию информации с этого сайта https://db2.cms.ua/ (доступ после выбора исполнителя, скриншот страницы добавляю к заданию) на сайт https://ipshop.com.ua/. Интересует ежедневное обновление количества наличия товара и цены в грн. Сайт ipshop на платформе Opencart.
Такое решение уже реализовано на сайте ipshop для товаров с базой b2b, но обновление перестало работать. Изображение ошибки добавляю.
Файл с кодом, который отвечает за синхронизацию добавить не могу.
Добавляю в тестовом виде:
<?php
class ModelExtensionModuleB2BCMSUA extends Model {
private $product_data = 'a:41:{s:19:"product_description";a:1:{i:1;a:7:{s:4:"name";s:3:"123";s:11:"description";s:0:"";s:10:"meta_title";s:0:"";s:7:"meta_h1";s:0:"";s:16:"meta_description";s:0:"";s:12:"meta_keyword";s:0:"";s:3:"tag";s:0:"";}}s:5:"model";s:3:"345";s:3:"sku";s:0:"";s:3:"upc";s:0:"";s:3:"ean";s:0:"";s:3:"jan";s:0:"";s:4:"isbn";s:0:"";s:3:"mpn";s:0:"";s:8:"location";s:0:"";s:9:"price_zak";s:0:"";s:5:"price";s:0:"";s:11:"currency_id";s:1:"0";s:12:"tax_class_id";s:1:"0";s:8:"quantity";s:1:"1";s:7:"minimum";s:1:"1";s:8:"subtract";s:1:"1";s:15:"stock_status_id";s:1:"7";s:8:"shipping";s:1:"1";s:7:"keyword";s:3:"123";s:14:"date_available";s:10:"2019-12-11";s:6:"length";s:0:"";s:5:"width";s:0:"";s:6:"height";s:0:"";s:15:"length_class_id";s:1:"1";s:6:"weight";s:0:"";s:15:"weight_class_id";s:1:"1";s:6:"status";s:1:"1";s:10:"sort_order";s:1:"1";s:15:"manufacturer_id";s:1:"0";s:16:"main_category_id";s:1:"0";s:6:"filter";s:0:"";s:13:"product_store";a:1:{i:0;s:1:"0";}s:8:"download";s:0:"";s:7:"related";s:0:"";s:16:"related-category";s:0:"";s:6:"option";s:0:"";s:5:"image";s:0:"";s:6:"points";s:0:"";s:14:"product_reward";a:1:{i:1;a:1:{s:6:"points";s:0:"";}}s:14:"product_layout";a:1:{i:0;s:0:"";}s:16:"related_category";s:0:"";}';
public function import() {
$this->load->model('catalog/product');
$this->checkInstall();
$this->product_data = unserialize($this->product_data);
/*if (!file_exists("/var/www/site1/1/1"))
{*/
$page = $this->B2B();
/*file_put_contents("/var/www/site1/1/1", $page);
}
else
{
$page = file_get_contents("/var/www/site1/1/1");
}*/
$currency_id = $this->getCurrencyId();
if ($currency_id === false)
{
exit('Error Currency Id');
}
preg_match_all("~<tr class=(even|odd)>.*?</tr>~s", $page, $rows);
$products = array();
$categories_ignore = $this->config->get('b2b_cms_ua_category_ignore');
foreach ($rows[0] as $row)
{
if (!preg_match("~code>([^<]+)~", $row, $model))
{
exit('Field code Node Found');
}
if (!preg_match("~sclad>([^<]+)~", $row, $quantity))
{
exit('Field sclad Node Found');
}
if (!preg_match("~currency>([^<]+)~", $row, $currency))
{
exit('Field currency Node Found');
}
if (!preg_match("~nazv>([^<]+)~", $row, $name))
{
exit('Field nazv Node Found');
}
if (!preg_match("~price>([^<]+)~", $row, $price))
{
exit('Field price Node Found');
}
$product_id = $this->updateProduct($model[1], (int)$quantity[1], (int)$currency_id, (float)$price[1], $categories_ignore);
if ($product_id === false)
{
/*$this->product_data['product_description'][1]['name'] = $name[1];
$this->product_data['model'] = $model[1];
$this->product_data['quantity'] = (int)$quantity[1];
$this->product_data['price'] = (float)$price[1];
$this->product_data['currency_id'] = $currency_id;
$this->product_data['not_accepted'] = true;
$product_id = $this->model_catalog_product->addProduct($this->product_data);*/
continue;
}
$products[] = $product_id;
}
$this->disableProducts($products);
}
public function checkInstall()
{
$query = $this->db->query("SHOW COLUMNS FROM " . DB_PREFIX . "product LIKE 'not_accepted'");
if (!$query->num_rows)
{
$this->db->query("ALTER TABLE " . DB_PREFIX . "product ADD not_accepted TINYINT(1) NOT NULL DEFAULT '0'");
}
}
private function getCurrencyId()
{
$query = $this->db->query("SELECT currency_id FROM " . DB_PREFIX . "currency WHERE code = 'UAH' LIMIT 1");
if ($query->num_rows)
{
return $query->row['currency_id'];
}
else
{
return false;
}
}
private function updateProduct($model, $quantity, $currency_id, $price, $categories_ignore)
{
$query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON p.product_id = p2c.product_id WHERE p.model = '" . $this->db->escape($model) . "'" . (count($categories_ignore) ? " AND p2c.category_id NOT IN ('" . implode("','", array_map("intval", $categories_ignore)) . "')": "") . " LIMIT 1");
if ($query->num_rows)
{
$product_id = $query->row['product_id'];
}
else
{
return false;
}
$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = '" . (int)$quantity . "', currency_id = '" . (int)$currency_id . "', price = '" . (float)$price . "' WHERE product_id = '" . (int)$product_id . "'");
return $product_id;
}
public function updateProducts($data)
{
foreach ($data['product_category'] as $product_id => $category_id)
{
if (!$category_id)
{
continue;
}
$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_category (product_id, category_id) VALUES(" . (int)$product_id . ", " . (int)$category_id . ")");
$this->db->query("UPDATE " . DB_PREFIX . "product SET not_accepted = '0' WHERE product_id = '" . (int)$product_id . "'");
}
}
private function disableProducts($products)
{
//$this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = '0', status = '1' WHERE product_id NOT IN ('" . implode("','", array_map("intval", $products)) . "')");
}
private function getPage($url, $post = false, $cookie = false)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, $cookie ? 0 : 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($cookie)
{
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
if ($post)
{
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
}
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
private function B2B()
{
$result = $this->getPage("https://db2.cms.ua/",
array(
'action' => 'login',
'name' => $this->config->get('b2b_cms_ua_login'),
'password' => $this->config->get('b2b_cms_ua_password')
)
);
$lines = preg_split("~[\r\n]+~", $result);
if (json_decode($lines[count($lines) - 1])->data != 0)
{
exit('Error Login');
}
if (!preg_match("~sessionid=[0-9a-z]+~", $result, $cookie))
{
exit('Cookie Not Found');
}
return $this->getPage("https://db2.cms.ua/b2b", false, $cookie[0]);
}
}
Оплата только через: Безопасная работа через Сейф .
Стоимость работ обсуждается.
Спасибо!