Наверх

Доставка

Способы доставки часть – модуля «Интернет-магазин».

Модуль описывает работу с сервисами доставки. Используется в корзине магазина в виде подключения.

Подключение

Подключаемая часть – файл modules/delivery/delivery.inc.php. В нем описан класс Delivery_inc. В модуле к объекту класса можно обратиться через переменную $this->diafan->_delivery. Экземпляр класса создается при первом вызове переменной.

Структура бэкенда

К модулю можно подключить неограниченное количество бэкендов – модулей для работы с конкретными сервисами доставки.

Для этого нужно разработать несколько файлов станадартной структуры, учитывающие особенности сервиса доставки и положить папку с этими файлами в папку delivery/backend. Далее создать метод доставки, в котором в качестве службы доставки указать созданный бэкенд.

Модуль доставки (или бэкенд) должен иметь уникальное название латинскими буквами (по примеру boxberry, sdek, dpd и др.). Для примера будем использовать название myservice.

В папке delivery/backend/myservice могут находиться следующий файлы:

  • delivery.myservice.admin.php
  • delivery.myservice.model.php
  • delivery.myservice.view.php
  • delivery.myservice.js
  • delivery.myservice.action.php

Это не обязательная структура модуля доставки. Нужно использовать только необхоимые файлы. Кроме того, в модуль доставки можно добавлять свои файлы любой другой структуры.

Рассмотрим структуру стандартных файлов

delivery.myservice.admin.php

Файл содержит настройки службы доставки, подгружаемые при добавлении метода доставки.

Структура файла:

Пример:

// ошибка 404 при прямом вызове файлов
if (! defined('DIAFAN'))
{
    
$path = __FILE__;
    while(!
file_exists($path.'/includes/404.php'))
    {
        
$parent = dirname($path);
        if(
$parent == $path) exit;
        
$path = $parent;
    }
    include
$path.'/includes/404.php';
}

class
Delivery_myservice_admin
{
    public
$config;
    private
$diafan;

    public function
__construct(&$diafan)
    {
            
$this->diafan = &$diafan;
            
$this->config = array(
                
"name" => 'Название метода, выводимое администратору',
                
// настройки службы
                // ключи этого массива - название настроек латинскими буквами
                
"params" => array(
                    
// можно указать просто текстовое описание настройки
                    // тогда она будет редактироваться как строка
                    
'param1' => 'Название первой настройки',

                    
// можно указать массив данных, тогда есть возможность
                    // задать тип данных и подсказку
                    // доступны следующие типы: text - строка, checkbox - галочка
                    
'param2' => array(
                        
// название второй настройки
                        
'name' => 'Выводить карту',
                        
// тип - галочка
                        
'type' => 'checkbox',
                        
// подсказка
                        
'help' => 'Если настройка не включена, то выводим пункты вывоза списком',
                    ),

                    
// можно определить свою функцию для вывода поля и его сохранения
                    
'param3' => 'Название третьей настройки',
                )
            );
    }

    
/**
     * Своя функция на редактирования настройки param3
     *
     * @return void
     */
    
public function edit_variable_param3()
    {
        echo
'<div class="unit tr_delivery" delivery="myservice" style="display:none">
            <div class="infofield">Название поля</div>
            Значение поля
        </div>'
;
    }

    
/**
     * Своя функция на сохранение настройки param3
     *
     * @return void
     */
    
public function save_variable_param3()
    {
        
// сохраняет данные
    
}
}

delivery.myservice.model.php

Файл подготавливает данные о службе доставки для списка способов доставки в корзине магазина.

В файле генерируются данные, а затем они подставляются в шаблон delivery.myservice.view.php.

Пример:

// ошибка 404 при прямом вызове файлов
if (! defined('DIAFAN'))
{
    
$path = __FILE__;
    while(!
file_exists($path.'/includes/404.php'))
    {
        
$parent = dirname($path);
        if(
$parent == $path) exit;
        
$path = $parent;
    }
    include
$path.'/includes/404.php';
}

class
Delivery_myservice_model extends Delivery_model_interface
{
    
/*
     * Подключает способ доставки. Данные о заказе и способе доставки, переданные аргументом могут быть дополнены и использованы в дальнейшем в шаблоне бэкенда
     *
     * @param array $result данные о заказе (высота, ширина, длина, сумма, вес), идентификационный номер способа доставки ("id"), настройки способа доставки (array "params")
     * @return array
     */
    
public function get(&$result)
    {}

    
/*
     * Получает стоимость доставки
     *
     * @param array $params настройки способа доставки
     * @return mixed
     */
    
public function calculate($params)
    {}

    
/*
     * Получает данные, введенные пользователем в интерфейсе службы доставки
     *
     * @param array $params настройки способа доставки
     * @return mixed
     */
    
public function get_info($params)
    {}
}

Переменная $params — это массив настроек службы доставки, описанных в файле delivery.myservice.admin.php.

Пример:

// из нашего пример массив $params будет следующим
$params = array(
    
'param1' => '...',
    
'param2' => 1|0,
    
'param3' => '...',
);

Функция get() инициирует подключение бэкенда службы доставки. Функция принимает массив $result по ссылке. Это значит, что все, что будет дописано в массив $result внутри функции будет в нём сохранено. Чтобы $result было доступно в других функциях бэкенда нужно в функции get() сделать запись:

$this->result = $result;

В дальнейшем этот массив будет принят в шаблоне службы доставки delivery.myservice.view.php.

Функция get_info() возвращает информацию, введенную пользователем, которая потом будет сохранена в заказе. Это может быть город или адрес доставки, пункт выдачи заказа. Специфика этой информации определяется службой доставки. Обычно выбор сохраняется в сессию (это происходит в файле delivery.myservice.action.php) и затем из переменной сессии функция get_info() извлекает записанные данные и возвращает в подходящем формате.

Функция calculate() возвращает стоимость доставки. Для рассчета функция обращается к сервису доставки по API. В этой функции доступны все настройки из файла delivery.myservice.admin.php через массив $params. Данные о заказе будут доступны через $this->result, если сделана соответствующая запись в функции get() (смотрите выше).

Какие же данные о заказе доступны?

  • $this->result['weight'] – вес;
  • $this->result['width'] – ширина;
  • $this->result['length'] – длина;
  • $this->result['height'] – высота;
  • $this->result['summ'] – стоимость.

delivery.myservice.view.php

Шаблон службы доставки. Данные для шаблона генерируются в файле delivery.myservice.model.php, функции get(). Шаблон выводится только в том случае, если пользователь выбрал службу доставки.

Шаблон может выводить карту с выбором пункта выдачи заказа, форму для ввода адреса и другие данные, которые должен ввести пользователь при выборе службы доставки.

delivery.myservice.js

При наличии этот JS-файл автоматически подключается к шаблону delivery.myservice.view.php. В файле может быть написано:

  • подгрузка данных для шаблона от службы доставки (например, карта для выбора пункта выдачи заказа);
  • обработка выбора пользователя.

delivery.action.php

Обработка POST-данных. Для того, чтобы подключился этот файл нужно отправить методом POST данные:

  • module_name = delivery
  • backend = служба_доставки
  • action = метод_обработки

Обычно эти данные посылает JS-скрипт вместо с выбором пользователя как реакция на действия пользователя.

Пример:

Пользователь определил свой город в модуле myservice. В файле delivery.myservice.js будет обработка выбора:

$("select[name=myservice_city]").change(function(){
        $.
ajax({
                
data: {
                        
module: "delivery",
                        
backend: "myservice",
                        
action: "city",
                        
city: $("select[name=myservice_city]").val(),
                },
                
type: "POST",
                
dataType: "json",
                
success: function(result){
                        $(
'.js_cart_table_form').submit();
                },
        });
});

В файле delivery.myservice.action.php тогда будет записан этот выбор в сессию. Затем обновится корзина, будет пересчитана стоимость доставки с учетом выбора пользователя, записанного в сессии:

<?php
// ошибка 404 при прямом вызове файлов
if (! defined('DIAFAN'))
{
    
$path = __FILE__;
    while(!
file_exists($path.'/includes/404.php'))
    {
        
$parent = dirname($path);
        if(
$parent == $path) exit;
        
$path = $parent;
    }
    include
$path.'/includes/404.php';
}

class
Delivery_myservice_action extends Action
{
    public function
city()
    {
        
$_SESSION["myservice_city"] = $this->diafan->filter($_POST, "int", "myservice_city"]);
        
$this->result["result"] = "success";
    }

}

Готовые интеграции

В DIAFAN.CMS в стандартную сборку по умолчанию не включены модули доставки. Их можно скачать и установить отдельно. Список модулей доставки

Ваши комментарии и дополнения

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