Класс службы доставки

Пытаюсь разобраться с созданием своего расчета доставки с помощью самописной службы доставки. Задача не обращаться к стороннему API, а просто обрабатывать данные и возвращать цену, по типу модуля самовывоза (он тоже как я понял в виде службы доставки сделан).
Структуру файлов, запись в базу создал, служба появилась в админке и даже можно запустить тест, но тест возвращает ошибку “служба не настроена”.
Собственно пока весь модуль службы состоит из файла с классом службы. В качестве рыбы класса взял класс самовывоза удалив естественно все по максимуму. Пытаюсь как-то заставить его работать, но такое ощущение что функции класса просто не выполняются даже prepareData ничего не выведет если из нее попытаться распечатать fn_print_r например.
Вот как выглядит файл с классом (название класса соответствует названию файла)

> <?php
> 
> namespace Tygh\Shippings\Services;
> 
> use Tygh\Settings;
> use Tygh\Shippings\IService;
> use Tygh\Http;
> 
> class deon_shipping implements IService
> {
> 
>     private $allow_multithreading = false;
>     private $shipping_info;
>     public $company_id = 0;
> 
> 
>     public function allowMultithreading()
> 
>     {
>        return $this->allow_multithreading;
>     }
> 
> 
> 
>     public function processErrors($response) 
>     {
>     $return = false;
>     return $return;    
>     }
> 
>     public function prepareData($shipping_info)
> 
>     {
>         $this->shipping_info = $shipping_info;
> 
>         $this->company_id = Registry::get('runtime.company_id');
>     }
> 
> 
> 
>     public function getRequestData()
> 
>     {
>         return [];
>     }
> 
> 
> 
>     public function getSimpleRates()
> 
>     {
>         return fn_get_shipping_destinations($this->shipping_info['shipping_id'], $this->shipping_info, CART_LANGUAGE);
>     }
> 
> 
> 
>     public function processResponse($response)
> 
>     {
>         $result = [
> 
>             'cost'           => false,
> 
>             'error'          => false,
> 
>             'delivery_time'  => false,
> 
>             'destination_id' => false,
> 
>         ];
> 
> 
> 
>        $result['cost']=100;
> 
> 
>         return $result;
> 
>     }
> 
> 
>     public static function getInfo()
> 
>     {
> 
>         return array(
> 
>             'name'         => __('carrier_deon_shipping'),
> 
>             'tracking_url' => '#',
> 
>         );
> 
>     }
> 
> }

Подскажите что с классом не так или может еще что-то надо чтоб тест срабатывал

Посмотрите Swisspost.php

Он никуда запросы не делает, проверяет только файлы с рейтами в папке swisspost. Там всего как раз по минимуму для нормальной работы

1 лайк

Взял за основу swisspost из ядра. Убрал все лишнее сделал класс, по идее должен всегда возвращать цену 1000, но как и раньше пишет сервис не настроен. Создается впечатление что дело не в классе может ,а в чем тогда еще?
Вот класс ниже. Я так понимаю функция getSimpleRates() должна возвращать значение цены. прилагаю и сам модуль. deon_shipping.zip (3,6 КБ)

<?php

namespace Tygh\Shippings\Services;

use Tygh\Shippings\IService;
use Tygh\Registry;

class deon_shipping implements IService
{
    private $_allow_multithreading = false;

    public function allowMultithreading()
    {
        return $this->_allow_multithreading;
    }

    public function prepareData($shipping_info)
    {
        $this->_shipping_info = $shipping_info;
    }

    public function processResponse($response)
    {
        return $response;
    }

    public function processErrors($response)
    {
        return null;
    }

    public function getRequestData()
    {
        return null;
    }

    public function getSimpleRates()
    {
        $return = array(
            'cost' => false,
            'error' => false,
        );
        
        $return['cost']=1000;
        return $return;
    }

    
    public static function getInfo()
    {
        return array(
            'name' => __('deon_shipping'),
            'tracking_url' => '#'
        );
    }

}

Смотрите функцию register тут

app/Tygh/Shippings/RealtimeServices.php

По нескольким условиям не проходит ваш модуль

1 лайк
if (empty($shipping_info['service_params'])) {
        return self::_processErrorCode(self::SERVICE_NOT_CONFIGURED);
    }

Тут я так понял $shipping_info[‘service_params’] пустое приходит от модуля моего? Откуда оно должно браться?

$module = fn_camelize($shipping_info['module']);
$module = 'Tygh\\Shippings\\Services\\' . $module;

А из этих строк выходить что класс и файл класаса надо назвать c большой буквы и файл с классом должен лежать не в папке модуля разве?

1 лайк

Все, разобрался.
Теперь осталось понять как заставить этот способ доставки показываться в корзине и прочих местах типа редактирования заказа в админке

Вы когда устанавливаете модуль, регистрируете так называемый «Провайдер доставки», создайте тестовый способ доставки или измените существующий, чтобы у него в настройках стояло «Расчёт в режиме реального времени» и там выберите свой модуль.
Если все получится - дайте знать :wink:

C тестовой 1000 не показывается?

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

1 лайк

Допишу вопрос сюда, т.к. касается службы доставки.
В класс передается системой массив исходных данных $shipping_info. Помимо всего прочего данные содержат информацию о товарах, и вот я не могу понять что за номера там указаны? Судя по всему это не product_id. Тогда что это и как получить product_id этих товаров? Хочу вытащить доп информацию о товарах в свой расчет. На скрине ниже выделил эти коды товаров
image

Это результат работы функции fn_generate_cart_id (app/functions/fn.cart.php)

Уникальный ID с учетом ID товара, выбранных опций и других параметров при необходимости

Я посмотрел и получается что эти коды в shopping info разные исходя из места откуда расчёт вызывается. Например если расчёт доставки из карточки товара вызывается то там product_id сразу, если из редактирования заказа то там код товара из таблицы orders-detail, если из чекаута то из другой таблицы. Получается нужно определять откуда вызывается расчет. А как это правильно сделать? Может как-то определять какой dispatch текущий или как?

Такого не встречал. После добавления в корзину ID должен быть одним и тем же

Когда расчёт доставки идёт из карточки товара то товар по сути не в корзине ещё и в shipping info тогда product_id отдаются. Можно как-то понять (определить) на какой страничке расчёт доставки вызван? Мне просто нужно определить по саrt_id соответствующий ему product_id чтобы потом инфу о товаре подтянуть

Если есть cart_id, то инфа по нему есть в $cart[‘products’]

А если расчет доставки происходит в процессе редактирования заказа в админке, то там как тогда?

Там те же функции и такой же массив $cart используется

Да, уже увидел, в сессии забираю cart. А вот когда расчёт запускается из карточки товара надо shipping_info иначе обрабатывать тк там сразу product_id передаётся и его не надо уже конвертировать. Пока задумался как программно в классе доставки определить что расчёт вызван из карточки товара и искать product_id через cart не надо