Модуль Сборки модулей TecDock

<?php
///керування///
// Змінна для таймінгу підключення
$connectTimeout = 2;

// Валюта
$currency = "UAH";
// Включення/виключення кешування
$useCache = true; // За замовчуванням кешування включене

// Націнка
$markup = 0.35; // Націнка 35%
// Вибір типу округлення ціни
$priceRoundMode = 'to_10'; // Можливі варіанти: 'no_round', 'no_decimal', 'to_5', 'to_10'
// Змінна для зміни днів доставки
$deliveryOffset = 1; // За замовчуванням доставка через
+1 день

///керування//

if (!defined("TDM_PROLOG_INCLUDED") || TDM_PROLOG_INCLUDED !== true) {
die();
}

// Функція для виправлення кодування
function fix_encoding($str)
{
return iconv(mb_detect_encoding($str, mb_detect_order(), true), "UTF-8", $str);
}

// Функція для округлення ціни
function round_price($price, $mode = 'default')
{
switch ($mode) {
case 'no_round':
return ceil($price);
case 'no_decimal':
return ceil($price);
case 'to_5':
return ceil($price / 5) * 5;
case 'to_10':
return ceil($price / 10) * 10;
default:
return ceil($price);
}
}

// Функція для отримання ціни товару за артикулом і брендом
function get_price($article, $brand, $token, &$cache, $useCache = true)
{
global $connectTimeout, $currency, $markup, $priceRoundMode; // Включення валюти та націнки

if ($useCache && isset($cache[$article][$brand])) {
return $cache[$article][$brand];
}

$url = "Для просмотра ссылки Войди или Зарегистрируйся";

$postdata = array(
"apiToken" => $token,
"code" => $article,
"isShowAnalogs" => 1,
"currency" => "UAH", // Використання змінної валюти
);

if (!empty($brand)) {
$postdata['brandId'] = $brand;
}

$postdata = json_encode($postdata);

$headers = array(
"Content-Type: application/json",
"accept: application/json"
);

$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2',
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_POSTFIELDS => $postdata,
CURLOPT_VERBOSE => false,
CURLOPT_CONNECTTIMEOUT => $connectTimeout // Використання глобальної змінної для таймінгу підключення
));
$execute = curl_exec($ch);

// Додавання логу API-запиту
if ($DocpartSuppliersAPI_Debug->suppliers_api_debug) {
$DocpartSuppliersAPI_Debug->log_api_request("Отримання переліку товарів", $url, $execute, print_r(json_decode($execute, true), true));
}

$data = json_decode($execute, true);

curl_close($ch);

if ($data['success'] !== false) {
if ($useCache) {
$cache[$article][$brand] = $data['data'];
}
return $data['data'];
} else {
return array();
}
}

// Функція для отримання інформації про продукт
function get_product_info($article, $brandId, $token)
{
global $connectTimeout;

$url = "Для просмотра ссылки Войди или Зарегистрируйся";

$postdata = array(
"apiToken" => $token,
"brandId" => $brandId,
"code" => $article
);

$postdata = json_encode($postdata);

$headers = array(
"Content-Type: application/json",
"accept: application/json"
);

$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2',
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_POSTFIELDS => $postdata,
CURLOPT_VERBOSE => false,
CURLOPT_CONNECTTIMEOUT => $connectTimeout // Використання глобальної змінної для таймінгу підключення
));
$execute = curl_exec($ch);
curl_close($ch);

$data = json_decode($execute, true);

if ($data['success'] !== false) {
return $data['data'];
} else {
return array();
}
}

// Отримання API токену
$token = "You API Key"; // Замість You API Key вставте ваш API токен

// Кеш для результатів запитів
$cache = [];

// Перебір кожного товару
foreach ($arWsParts as $arPart) {
// Отримання бренду за артикулом
if (!isset($cache['brands'][$arPart['ARTICLE']])) {
$url = "Для просмотра ссылки Войди или Зарегистрируйся";

$postdata = array(
"apiToken" => $token,
"code" => $arPart['ARTICLE']
);

$postdata = json_encode($postdata);

$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HEADER => false,
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json",
"accept: application/json"
),
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2',
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_POSTFIELDS => $postdata,
CURLOPT_VERBOSE => false,
CURLOPT_CONNECTTIMEOUT => $connectTimeout // Використання глобальної змінної для таймінгу підключення
));
$execute = curl_exec($ch);
curl_close($ch);

$data = json_decode($execute, true);

if ($data['success'] !== false) {
$cache['brands'][$arPart['ARTICLE']] = $data['data'];
} else {
$cache['brands'][$arPart['ARTICLE']] = array();
}
}

$manufacturers = $cache['brands'][$arPart['ARTICLE']];

foreach ($manufacturers as $manufacturer) {
$brandId = $manufacturer['brandId'];

// Отримання інформації про продукт
$productInfo = get_product_info($arPart['ARTICLE'], $brandId, $token);

// Перевірка чи інформація була успішно отримана
if (!empty($productInfo)) {
// Отримання зображення продукту
$images = $productInfo['images'];
$imageSrc = !empty($images) ? $images[0]['image'] : '';

// Отримання ціни за артикулом і брендом
$products = get_price($arPart['ARTICLE'], $brandId, $token, $cache, $useCache);

foreach ($products as $product) {
foreach ($product['rests'] as $product_rest) {
$price = (float)$product_rest["price"] * (1 + $markup); // Націнка
// Обчислення терміну доставки
$deliveryDate = new DateTime($product_rest["deliveryDate"]);
$currentDate = new DateTime();
$deliveryInterval = $deliveryDate->diff($currentDate);
$deliveryDays = $deliveryInterval->days;

// Додаткові операції та обробка ціни
$price = round_price($price, $priceRoundMode);

// Додавання товару у список
$arPrice = TDMPriceArray();
$arPrice["LINK_TO_BKEY"] = $arPart['BKEY'];
$arPrice["LINK_TO_AKEY"] = $arPart['AKEY'];
$arPrice["ARTICLE"] = $product["code"];
$arPrice["ALT_NAME"] = fix_encoding($product["descriptionUa"]);
$arPrice["BRAND"] = $manufacturer['brand'];
$arPrice["PRICE"] = $price;
$arPrice["CURRENCY"] = "UAH"; // Використання змінної валюти
$arPrice["DAY"] = $deliveryDays + $deliveryOffset; // Встановлення часу доставки
$arPrice["AVAILABLE"] = $product_rest['quantity'];
$arPrice["STOCK"] = $product_rest['priceLogo'];
$arPrice["IMG_SRC"] = $imageSrc; // Додавання зображення
$arOps = Array();
$arPrice["OPTIONS"] = TDMOptionsImplode($arOps,$arPrice);
$arPrices[] = $arPrice;
}
}
}
}
}

// Якщо кешування включено, збережемо результати у файл
//if ($useCache) {
// file_put_contents('cache.json', json_encode($cache));
//}
?>
Можна додати ще додаткові характеристики (включити за потреби в адмін панелі)
Код:
if($product['weight']>0){$arOps['WEIGHT']=($product['weight']*1000);}
if($probability>0){$arOps['PERCENTGIVE']=intval($probability);}
if($product_rest['isReturn']>0){$arOps['NORETURN']=$product_rest['isReturn'];}
if($imageSrc>0){$arOps["IMG_SRC"]=$imageSrc;}
 
Можна додати ще додаткові характеристики (включити за потреби в адмін панелі)
Код:
if($product['weight']>0){$arOps['WEIGHT']=($product['weight']*1000);}
if($probability>0){$arOps['PERCENTGIVE']=intval($probability);}
if($product_rest['isReturn']>0){$arOps['NORETURN']=$product_rest['isReturn'];}
if($imageSrc>0){$arOps["IMG_SRC"]=$imageSrc;}
if($imageSrc>0){$arOps["IMG_SRC"]=$imageSrc; реалізовано $arPrice["IMG_SRC"] = $imageSrc; // Додавання зображення
Перевірка ваги товару, Перевірка ймовірності, Перевірка на повернення товару, якщо через api це передається то можна.
if($product['weight']>0){$arOps['WEIGHT']=($product['weight']*1000);}
if($probability>0){$arOps['PERCENTGIVE']=intval($probability);}
if($product_rest['isReturn']>0){$arOps['NORETURN']=$product_rest['isReturn'];}
 
if($imageSrc>0){$arOps["IMG_SRC"]=$imageSrc; реалізовано $arPrice["IMG_SRC"] = $imageSrc; // Додавання зображення
Перевірка ваги товару, Перевірка ймовірності, Перевірка на повернення товару, якщо через api це передається то можна.
if($product['weight']>0){$arOps['WEIGHT']=($product['weight']*1000);}
if($probability>0){$arOps['PERCENTGIVE']=intval($probability);}
if($product_rest['isReturn']>0){$arOps['NORETURN']=$product_rest['isReturn'];}
Так, передається і працює
Снимок экрана 2024-05-01 173935.png

Я помітив таку дивну річ, що коли один і той же артикул є на багатьох складах, то фото передає по кожному складу...
Тобто фото товару не одне, а стільки скильки складів. Можливо це тільки в мене такий глюк.
Снимок экрана 2024-05-01 174334.png
 
Последнее редактирование:
на сторінці товару для кожного скраду у вас виводить окреме зображення чи коли ви відкриваєте зображення наприклад 6 однакових
 
на сторінці товару для кожного скраду у вас виводить окреме зображення чи коли ви відкриваєте зображення наприклад 6 однакових
На сторінці товару, під основним фото
Screenshot_2024-05-01-18-33-41-821_com.android.chrome-edit.jpg
Повторюсь, це може бути суто проблемою в мене...
 
А чи є можливість не з усіх складів брати ціни/наявність та інше?
 
А чи є можливість не з усіх складів брати ціни/наявність та інше?
так є можливість наприклад зробити по ціні чи по терміну доставки чи ще по чомусь.

код писався для знайомого у нього на сервері працює
<?php
/*
потрібно зі сторони Elit додати ваш IP сервера
*/
if (!defined("TDM_PROLOG_INCLUDED") || TDM_PROLOG_INCLUDED !== true) {
die();
}

// Перевірка наявності розширення SOAP
if (!extension_loaded('soap')) {
$ERROR = 'Попередження! Розширення PHP SOAP не завантажено';
} else {
try {
// Створення клієнта SOAP для взаємодії з API ELIT
$SClient = new SoapClient("Для просмотра ссылки Войди или Зарегистрируйся", array('encoding' => 'utf-8'));

// Масив для зберігання унікальних артикулів
$arARTs = array();

// Ітерація по частинам товарів
foreach ($arWsParts as $arPart) {
if (!in_array($arPart['ARTICLE'], $arARTs)) {
// Виклик методу getItemInfo
$arCRes = $SClient->getItemInfo($arWS['ELIT_UA'], $arWS['LOGIN'], $arWS['PASSW'], $arPart['ARTICLE']);
$arARTs[] = $arPart['ARTICLE'];
} else {
// Якщо артикул вже був оброблений, отримуємо дані з кешу
$arCRes = $arCacheData[$arPart['ARTICLE']];
}

// Обробка результату запиту
if (is_array($arCRes) && count($arCRes) > 0) {
foreach ($arCRes as $arRes) {
if ($arRes['internalNo'] != '' && (TDMSingleKey($arRes['internalNo'], true) == $arPart['BKEY'] || $arPart['BKEY'] == '')) {
// Формування даних про ціну та наявність товару
$arPrice = TDMPriceArray($arPart);
$arPrice["ARTICLE"] = $arRes['internalNo'];
$arPrice["ALT_NAME"] = $arRes['Description'];
$arPrice["BRAND"] = $arRes['Brand'];
$arPrice["PRICE"] = floatval($arRes['retailPrice']);
$arPrice["CURRENCY"] = $arWS['CURRENCY'];
$arPrice["AVAILABLE"] = $arRes['quantity'];
$arPrice["STOCK"] = implode(' / ', $arRes['stock']);
if ($arPrice["AVAILABLE"] == 'xxl') {
$arPrice["AVAILABLE"] = 99;
}
$arOps = array();
if ($arRes['Weight'] > 0) {
$arOps['WEIGHT'] = $arRes['Weight'];
}
$arPrice["OPTIONS"] = TDMOptionsImplode($arOps, $arPrice);
$arPrices[] = $arPrice;
}
}
}
}
} catch (SoapFault $e) {
// Обробка помилок SOAP
$ERROR = 'SOAP помилка: ' . $e->getMessage();
} catch (Exception $e) {
// Загальна обробка помилок
$ERROR = 'Помилка: ' . $e->getMessage();
}
}
?>

На сторінці товару, під основним фото
Повторюсь, це може бути суто проблемою в мене...
мені здається чо потрібно поправити у папці partslist у її файлах код но я можу помилятися, для цього модуля що я писав код у ньому коли відкриваєш зображення то усі зображення однпкові.
 
Последнее редактирование:
SOAP помилка: java.lang.NullPointerException
Elit надав доступ до API вашому серверу сайту. Потрібно надати свій IP менеджеру від ELIT щоби він включив доступ. це може бути одна із причин
 
Назад
Сверху