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

Видає помилки по:
quantity та name
Warning: Illegal string offset 'quantity' in /....
Warning: Illegal string offset 'name' in /....
поміняйте склади до яких у вас є доступ

поміняйте склади до яких у вас є доступ
або попробуйте поміняйтеу коді
$quantity = isset($stock['quantity']) ? (int)preg_replace('/[^0-9]/', '', $stock['quantity']) : 0;$name = isset($stock['name']) ? $stock['name'] : '';
 
Последнее редактирование:
поміняйте склади до яких у вас є доступ


або попробуйте поміняйтеу коді
$quantity = isset($stock['quantity']) ? (int)preg_replace('/[^0-9]/', '', $stock['quantity']) : 0;$name = isset($stock['name']) ? $stock['name'] : '';
допомого $quantity = isset($stock['quantity']) ? (int)preg_replace('/[^0-9]/', '', $stock['quantity']) : 0;$name = isset($stock['name']) ? $stock['name'] : '';
 
Последнее редактирование:
У коді реалізовано якщо на складах є однаковий товар то товар береться із складу де час доставки менший.
PHP:
<?php
///керування///
// Змінна для таймінгу підключення
$connectTimeout = 2;

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

// Націнка
$markup = 0.35; // Націнка 35%
// Вибір типу округлення ціни
$priceRoundMode = 'to_10'; // Можливі варіанти: 'no_round', 'no_decimal', 'to_5', 'to_10'
// Змінна для зміни днів доставки
$deliveryOffset = 2; // За замовчуванням доставка через 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 = "https://api.tehnomir.com.ua/price/search";

    $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);

    $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 = "https://api.tehnomir.com.ua/info/getProductInfo";

    $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 TOKEN"; //Ваш ключ API

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

// Перебір кожного товару
foreach ($arWsParts as $arPart) {
    // Отримання бренду за артикулом
    if (!isset($cache['brands'][$arPart['ARTICLE']])) {
        $url = "https://api.tehnomir.com.ua/info/getBrandsByCode";

        $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);

            // Створення масиву для збереження інформації про товари на складах
            $warehouseProducts = [];

            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);

                    // Збереження інформації про товар на складі
                    $warehouseProducts[] = [
                        "price" => $price,
                        "deliveryDays" => $deliveryDays + $deliveryOffset,
                        "warehouse" => $product_rest['priceLogo']
                    ];
                }
            }

            // Сортування за терміном доставки
            usort($warehouseProducts, function($a, $b) {
                return $a['deliveryDays'] <=> $b['deliveryDays'];
            });

            // Вибір найменшого терміну доставки
            $bestWarehouse = $warehouseProducts[0];

            // Додавання товару у список
            $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"] = $bestWarehouse["price"];
            $arPrice["CURRENCY"] = "UAH"; // Використання змінної валюти
            $arPrice["DAY"] = $bestWarehouse["deliveryDays"]; // Встановлення часу доставки
            $arPrice["AVAILABLE"] = $product_rest['quantity'];
            $arPrice["STOCK"] = $bestWarehouse['warehouse'];
            $arPrice["IMG_SRC"] = $imageSrc; // Додавання зображення
            $arOps = Array();
            $arPrice["OPTIONS"] = TDMOptionsImplode($arOps,$arPrice);
            $arPrices[] = $arPrice;
        }
    }
}

// Якщо кешування включено, збережемо результати у файл
//if ($useCache) {
 //   file_put_contents('cache.json', json_encode($cache));
//}
?>
Поділітся робочим модулем неважно якої ревізії головне щоби модуль був робочий і без ionCube
 
Последнее редактирование:
Поділітся робочим модулем неважно якої ревізії головне щоби модуль був робочий і без ionCube
Скрытое содержимое доступно для зарегистрированных пользователей!
 
PHP:
<?php
//не весь товар підтягує із ecat артикули текдок відрізняються від ecat повинен бути точний збіг

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

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

// Конфіденційні дані
$login = 'LOGIN'; //Логін
$password = 'PASSW'; //Пароль
$wsdlUrl = 'https://econnector.elit.cz/InterCompany-1.75.0/BuyerService?wsdl';

// Націнка у відсотках
$markupPercentage = 10; //  10% націнка

// Опція для типу округлення:
// 1 - без округлення
// 2 - без дробової частини
// 3 - до 5
// 4 - до 10
$roundingOption = 1; // За замовчуванням без округлення

// Склади та час доставки
$warehouses = [
    'UACKV' => 1, //ELIT Центральний склад Київ-1
    'UAHTR' => 1, //Тернопіль
    'UAPBC' => 2, //Біла Церква
    'UAPBR' => 2, //Бровари
    'UAPBU' => 2, //Буча
    'UAPCH' => 2, //Черкаси
    'UAPCHG' => 2, //Чернігів
    'UAPCHN' => 2, //Чернівці
    'UAPDP' => 3, //Дніпро-1
    'UAPDP2' => 3,//Дніпро-2
    'UAPIF' => 2, //Івано-Франківськ
    'UAPIZ' => 3, //Ізмаїл
    'UAPKAM' => 2, //Кам'янське
    'UAPKAP' => 2, //Кам`янець-Подільський
    'UAPKH' => 3, //Харків-1
    'UAPKHM' => 2, //Хмельницький
    'UAPKHU' => 2, //Хуст
    'UAPKIR' => 2, //Кропивницький
    'UAPKL' => 2, //Коломия
    'UAPKR' => 3, //Кривий Ріг
    'UAPKRE' => 3, //Кременчук
    'UAPKV2' => 2, //Київ-2
    'UAPKV3' => 2, //Київ-3
    'UAPKV4' => 2, //Київ-4
    'UAPLTS' => 0, //Луцьк
    'UAPLV' => 1, //Львів-1
    'UAPLV2' => 1, //Львів-2
    'UAPNK' => 3, //Миколаїв
    'UAPOD' => 2, //Одеса-1
    'UAPOD2' => 2, //Одеса-2
    'UAPPL' => 2, //Полтава
    'UAPRV' => 1, //Рівне
    'UAPSU' => 2, //Суми
    'UAPUG' => 2, //Ужгород
    'UAPUM' => 2, //Умань
    'UAPVN' => 2, //Вінниця
    'UAPZP' => 2, //Запоріжжя
    'UAPZT' => 2, //Житомир
    'UAEKV' => 2, //Київ Зовн. склад
    'UAPKRA' => 3, //Краматорськ
];

// Перевірка наявності розширення SOAP
if (extension_loaded('soap')) {

    // Ініціалізація клієнта SOAP
    $client = new SoapClient($wsdlUrl);

    // Ініціалізація масиву цін
    $arPrices = [];

    foreach ($arWsParts as $arPart) {
        // Отримання артикулу з даних
        $article = $arPart['ARTICLE'];
        // Переведення артикулу у верхній регістр
         $article = strtoupper($article);
        // Видалення пробілів з артикулу
        $cleanArticle = str_replace(' ', '', $article);

        // Ініціалізація масиву артикулів для запитів
        $articles = [$article, $cleanArticle];

        // Масив для зберігання часу доставки для кожного складу товару
        $deliveryTimes = [];

        foreach ($articles as $currentArticle) {
            $getItemRequest = [
                'company' => 'ELIT_UA',
                'login' => $login,
                'password' => $password,
                'activeItemNo' => $currentArticle
            ];

            // Виклик методу getItem
            $getItemResponse = $client->getItem($getItemRequest);

            // Обробка результату методу getItem
            if (!empty($getItemResponse->return->description)) {
                $itemData = $getItemResponse->return;

                $getItemInfoRequest = [
                    'company' => 'ELIT_UA',
                    'login' => $login,
                    'password' => $password,
                    'itemNo' => $currentArticle,
                    'qty' => 1
                ];

                // Виклик методу getItemInfo
                $getItemInfoResponse = $client->getItemInfo($getItemInfoRequest);

                // Обробка результату методу getItemInfo
                if (!$getItemInfoResponse->return->closed) {
                    $product = $getItemInfoResponse->return;
                    $price = $product->retailPrice;

                    // Додавання націнки до ціни
                    $priceWithMarkup = $price * (1 + $markupPercentage / 100);

                    // Округлення ціни відповідно до вибраної опції
                    switch ($roundingOption) {
                        case 2:
                            $priceWithMarkup = floor($priceWithMarkup); // Без дробової частини
                            break;
                        case 3:
                            $priceWithMarkup = round($priceWithMarkup, 1); // До 5
                            break;
                        case 4:
                            $priceWithMarkup = round($priceWithMarkup, -1); // До 10
                            break;
                        default:
                            // Без округлення (залишаємо як є)
                            break;
                    }

                    foreach ($product->stock as $item) {
                        $quantity = $item->quantity;
                        $time = $item->location;

                        // Зберігання часу доставки для кожного складу товару
                        if (!isset($deliveryTimes[$currentArticle]) || $warehouses[$time] < $deliveryTimes[$currentArticle]) {
                            $deliveryTimes[$currentArticle] = $warehouses[$time];
                            // Якщо це перший склад або час доставки менший, зберігаємо його
                            $minTimeWarehouse = $time;
                        }
                    }
                }
            }
        }

        // Виведення результату для товару з найменшим часом доставки
        if (isset($minTimeWarehouse)) {
            $arPrice = TDMPriceArray($arPart);
            $arPrice['AKEY'] = $itemData->internalNo;
            $arPrice['BKEY'] = $itemData->vendor;
            $arPrice['BRAND'] = $itemData->vendor = $arPart['BRAND'];
            $arPrice['ARTICLE'] = $itemData->internalNo;
            $arPrice['ALT_NAME'] = $itemData->description;
            $arPrice['AVAILABLE'] = $quantity;
            $arPrice["CURRENCY"] = "UAH";
            $arPrice['PRICE'] = $priceWithMarkup; // Використовуємо ціну з націнкою
            $arPrice['DAY'] = $deliveryTimes[$currentArticle]; // Додаємо час доставки
            $arPrice['STOCK'] = $minTimeWarehouse;
            $arPrice["OPTIONS"] = '';
            $arOps = Array();
            $arPrice["OPTIONS"] = TDMOptionsImplode($arOps, $arPrice);
            $arPrices[] = $arPrice;
        }
    }

    // Виведення результату
    // Код для конвертації масиву в JSON з прямими символами
    $jsonOutput = json_encode($arPrices, JSON_UNESCAPED_UNICODE);
     echo $jsonOutput;
}
echo '<pre>'; print_r($arPrices); echo '</pre>';
echo '<pre>'; print_r($arPrice); echo '</pre>';
?>
 
Може в когось є самий новий модуль, може бути закодований ionCube
 
Може в когось є самий новий модуль, може бути закодований ionCube
Всі закодовані варіанти, що зміг знайти взагалі. Версіі 3.2.х нібито.

Скрытое содержимое доступно для зарегистрированных пользователей!
 
Здравствуйте. не работает настройка добавления или удаления производителей авто ну и другие настройки, которые находятся в файлах settings.php права на файлы и папки выставлял не помогает.Может кто-то сталкивался и подскажет как решить. Может кто-то поделится вот та менюшкой файлами subsections. Спасибо
ката.JPG
 
<?php

// Налаштування керування
$settings = [
'enableCache' => true, // Увімкнення або вимкнення кешування
'connectTimeout' => 50, // Час з'єднання за замовчуванням
'markupPercentage' => 0.35, // Націнка у відсотках (35%)
'roundingOption' => 4, // Опція округлення: 1 - без округлення, 2 - без дробової частини, 3 - до 5, 4 - до 10 (за замовчуванням)
'email' => 'ВАШ ЛОГІН',
'password' => 'ВАШ ПАРОЛЬ',
'uniqueKey' => 'some-unique-key-here',
'token' => '',
'tokenExpiration' => 0
];

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

// Ініціалізація масиву цін
$arPrices = [];

// Масив з часом доставки для кожного складу
$deliveryTimes = [
'Львів' => 1, //Склад Львів 1 день
'Kиїв Правий' => 2, //Склад Kиїв Правий 2 дня
'Рівне' => 2, //Склад Рівне 2 дня
'Kиїв Лівий' => 2, //Склад Kиїв Лівий 2 дня
'Одеса' => 2, //Склад Одеса 2 дня
'Миколаїв' => 3, //Склад Миколаїв 3 дня
'Дніпро' => 2, //Склад Дніпро 2 дня
'Харків' => 4 , //Склад Харків 4 дня
'Запоріжжя' => 3, //Склад Запоріжжя 3 дня
'Хмельницький' => 2, //Склад Хмельницький 2 дня
];


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

// Отримання токену доступу
function getAccessToken($settings) {
// Перевірка чи токен ще дійсний
if ($settings['tokenExpiration'] > time()) {
return $settings['token'];
}

$url = "Для просмотра ссылки Войди или Зарегистрируйся";
$data = json_encode([
"email" => $settings['email'],
"password" => $settings['password'],
"browser_fingerprint" => md5($settings['uniqueKey'])
]);
$headers = ["Content-Type: application/json"];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

if ($info['http_code'] == 200) {
$responseData = json_decode($response, true);
$settings['token'] = $responseData['token'];
$settings['tokenExpiration'] = strtotime($responseData['expires_at']);
return $settings['token'];
} else {
die("Не вдалося отримати токен доступу: HTTP Error {$info['http_code']}");
}
}

// Виконання запитів до API
function fetchFromApi($url, $accessToken, $connectTimeout) {
$headers = ["Authorization: Bearer $accessToken"];

$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => 0,
CURLOPT_ENCODING => 'utf-8',
CURLOPT_CONNECTTIMEOUT => $connectTimeout
]);
$curlResult = curl_exec($ch);
curl_close($ch);

return $curlResult;
}

// Отримання токену доступу
$accessToken = getAccessToken($settings);

// Основний цикл обробки часток
foreach ($arWsParts as $arPart) {
$article = $arPart['ARTICLE'];

// Перевірка кешу та виконання запиту до API
if ($settings['enableCache'] && isset($apiCache[$article])) {
$curlResult = $apiCache[$article];
} else {
$url = "Для просмотра ссылки Войди или Зарегистрируйся" . urlencode($article);
$curlResult = fetchFromApi($url, $accessToken, $settings['connectTimeout']);
if ($settings['enableCache']) {
$apiCache[$article] = $curlResult;
}
}

// Обробка результатів запиту
if ($curlResult !== false) {
$curlResult = json_decode($curlResult, true);
if (!empty($curlResult['details'])) {
foreach ($curlResult['details'] as $detail) {
$detailId = $detail['id'];
$detailUrl = "Для просмотра ссылки Войди или Зарегистрируйся";
$detailResult = fetchFromApi($detailUrl, $accessToken, $settings['connectTimeout']);

if ($detailResult !== false) {
$detailInfo = json_decode($detailResult, true);
$images = !empty($detailInfo['images']) ? $detailInfo['images'] : [];
$imageSrc = !empty($images) ? $images[0]['fullImagePath'] : '';

$arPrice = TDMPriceArray($arPart);
$arPrice["ARTICLE"] = $detail['article'];
$arPrice["ALT_NAME"] = $detail['title'];
$arPrice["BRAND"] = $detail['brand']['name'];
$arPrice["PRICE"] = $detail['yourPrice']['amount'];
$arPrice["AVAILABLE"] = $detail['quantity'];
$arPrice['IMG_SRC'] = $imageSrc;
$arPrice["CURRENCY"] = $detail['yourPrice']['currency']['code'];
$arPrice["DAY"] = $deliveryTimes[$detail['storage']['name']]; // Отримання часу доставки
$arPrice["STOCK"] = $detail['storage']['name']; // Отримання складу товару
$arPrice["OPTIONS"] = ''; // Опції - поки не вказано
$arOps = Array();
$arPrice["OPTIONS"] = TDMOptionsImplode($arOps, $arPrice);
$arPrices[] = $arPrice;
}
}
}
}
}

//echo '<pre>'; print_r($arPrices); echo '</pre>';
?>
Загалом код працює. У коді потрібно поправити склади і час доставки. Зараз часу щоби це зробити немає, якщо комусь буде потрібно і буду мати час виправлю.
 
Здравствуйте. не работает настройка добавления или удаления производителей авто ну и другие настройки, которые находятся в файлах settings.php права на файлы и папки выставлял не помогает.Может кто-то сталкивался и подскажет как решить. Может кто-то поделится вот та менюшкой файлами subsections. Спасибо
Посмотреть вложение 117897
Посмотрите папку autoparts/media/js/
Возможно, там не хватает какого-то js файла или вот этой папки
 

Вложения

  • jqtree.7z
    84,5 KB · Просмотры: 5
Последнее редактирование:
Назад
Сверху