Онлайн-руководство разработчика NetCat
Модуль «Поиск по сайту» 12.2.1Начало работы с модулем 12.2.2Язык запросов 12.2.3Способы хранения индекса 12.2.4Интерфейс модуля в панели управления сайтом 12.2.5Области индексирования 12.2.6Области HTML-страниц 12.2.7Области поиска на сайте 12.2.8Индексирование по расписанию, запуск индексирования в фоновом режиме 12.2.9Правила индексирования 12.2.10Постановка задачи переиндексирования в очередь 12.2.11Интеграция модуля в макеты дизайна сайта 12.2.12Простая форма поиска 12.2.13Расширенная форма поиска 12.2.14Вывод результатов поиска 12.2.15Стилизация списка подсказок 12.2.16Расширенные настройки 12.2.17Разработка расширений модуля 12.2.18Обзор архитектуры модуля 12.2.19Обработчики документов различных типов 12.2.20Текстовые фильтры 12.2.21Анализаторы текста 12.2.22Корректировщики запросов 12.2.23Подключение других поисковых систем 12.2.24Решение проблем с поиском 12.2.25Решение проблем с индексированием 12.2.26Справочник API

Варианты доставки

Для того чтобы добавить новый вариант доставки откройте меню «Доставка».

Заполните название, которое будет отображаться в форме заказа. Введите описание.

Добавьте условия оплаты и отправки доставки. Условий может быть несколько.

Опционально сохраните остальные поля. Сохраните результат. На странице отобразится добавленная вами доставка.

При необходимости повторите действия и добавьте необходимые типы доставок.

Предлагаемые настройки для вариантов доставки: EMS и Почта России

Параметр EMS Почта России
Условия Сумма по всем товарам в корзине по полю (с учётом количества): 30000
Способ автоматического расчёта стоимости доставки EMS Почта России
Индекс получателя Почтовый индекс
Город отправки Город отправки
Город доставки Город доставки Город доставки
Минимальное число дней для доставки 5
Максимальное число дней для доставки 15
Время, до которого возможна отправка в тот же день 15:00
Дополнительный сбор (абсолютная величина) 100.00 100.00
Дополнительный сбор (процент от общей стоимости заказа) 0.00 100.00

Классы для расчёта стоимости доставки

Если возникает необходимость расчёта стоимости доставки для способов, которые не поддерживаются системой «из коробки», вы можете создать собственный класса для расчёта стоимости и сроков доставки.

Для подключения собственного способа расчёта доставки необходимо:

  1. Создать класс (далее для примера он будет называться my_delivery_service), расширяющий класс nc_netshop_delivery_service.
    • Для расчёта стоимости необходимо реализовать метод calculate_delivery().
      • Данные о заказе будут доступны в свойстве $this->data. По умолчанию в этом массиве доступны свойства:
        • 'items' — состав заказа, экземпляр объекта nc_netshop_item_collection (появилось в версии 5.6.0.15301)
        • 'valuation' — стоимость товаров в заказе
        • 'weight' — сумма по полю Weight для всех товаров в заказе. Если сумма по полю Weight равна 0, вес будет равен 100, так как внешние службы расчёта стоимости доставки не позволяют расчитывать вес отправления с нулевым весом. Вес в поле Weight должен быть указан в граммах.
      • Для получения полей заказа необходимо в классе расчёта стоимости доставки указать свойство $mapped_fields — массив, где ключ является именем поля, доступным внутри класса в массиве $this->data, а значение — текстовое описание поля, например:
        protected $mapped_fields = array(
            'to_city' => 'Город доставки',
        );
        Стандартные свойства можно посмотреть в свойстве $fields класса nc_netshop_delivery_service. Если вы используете какие-либо «нестандартные» поля, нужно в классе расчёта стоимости доставки переопределить это свойство, перечислив все допустимые ключи массива $this->data, например:
        protected $fields = array('weight', 'valuation', 'to_city');
        После этого в настройке модуля метода доставки можно будет указать соответствие полей заказа указанным свойствам.
    • Метод calculate_delivery() должен вернуть массив со свойствами:
      'price' => стоимость доставки, 
      'currency' => валюта стоимости доставки,
      'min_days' => минимальное количество дней на доставку,
      'max_days' => максимальное количество дней на доставку 
    • В случае возникновения ошибки при расчёте и невозможности выдачи правильной оценки доставки нужно вернуть null и установить два свойства у экземпляра класса:
      $this->last_error = 'Описание ошибки'; 
      $this->last_error_code = код_ошибки; // например, 1
  2. Остальные абстрактные методы можно сделать в my_delivery_service пустыми.
  3. Необходимо обеспечить доступность этого класса по необходимости: например, написать функцию-загрузчик по требованию для spl_autoload_register(), или в модуле default в function.inc.php подгружать этот класс.
  4. В списке ShopDeliveryService («Службы доставки») нужно добавить элемент:
    название — «Мой способ доставки»
    значение — "my_delivery_service" (имя класса для расчёта стоимости)
  5. В настройках модуля «Интернет-магазин» добавить новый способ доставки, выбрать способ автоматического расчёта стоимости доставки − «Мой способ доставки».

Пример класса для расчёта стоимости доставки

/**
 * Заготовка для класса расчёта доставки
 */
class my_delivery_service extends nc_netshop_delivery_service {
    /** @var array  Свойства, которые сопоставляются с полями заказов */
    protected $mapped_fields = array(
        'to_city' => 'Город доставки',
    );

    /**
     * Метод расчёта стоимости доставки
     */
    public function calculate_delivery() {
        // В нашем примере доставка стоит 500 руб. плюс 10 руб. за каждый неполный 
        // килограмм веса посылки плюс 0,1% от стоимости товаров

        $weight_in_kilograms = ceil($this->data['weight'] / 1000);
        $delivery_cost = 500 + 10 * $weight_in_kilograms + $this->data['valuation'] * 0.001;
        // итоговая стоимость к оплате будет округлена в соответствии с настройками модуля

        // В нашем примере доставка в Москву и Санкт-Петербург заказ доставляется
        // за 1 день, а доставка в другие города занимает от 3 до 5 дней
        if ($this->data['city'] == 'Москва' || $this->data['city'] == 'Санкт-Петербург') {
            $min_days = 1;
            $max_days = 1;
        }
        else {
            $min_days = 3;
            $max_days = 5;
        }

        return array(
            'price' => $delivery_cost,
            'currency' => 'RUR',
            'min_days' => $min_days,
            'max_days' => $max_days
        );
    }

    public function print_package_form() {
    }

    public function print_cash_on_delivery_form() {
    }

    public function get_tracking_information() {
    }

}

Допустим, класс my_delivery_service находится в файле netcat/modules/default/my_delivery_service.class.php, тогда автозагрузчик этого класса в netcat/modules/default/function.inc.php будет выглядеть следующим образом:

// Загрузка класса my_delivery_service при необходимости
spl_autoload_register(function($class_name) {
    if ($class_name == 'my_delivery_service') {
        include_once nc_module_folder('default') . 'my_delivery_service.class.php';
    }
});

Комментарии 9

Каким образом можно добавить доставку посредством Почты России и EMS, функционал взаимодействия с API которых с недавних пор уже внедрен в NetCat?
   
amigo 26 июня 2014, 13:46:16
Руслан, добавляете новый вид доставки. Варианты для заполнения добавили в таблицу вверху.
   
Жму Добавление способа доставки - открывается форма, в которой есть почти все поля, приведенные Вами в таблице (кроме "Город отправки" и "Город доставки". Есть также пустой селектор "Выберите способ автоматического расчета".
Где же нам указать о том, что нам надо использовать API EMS?
   
okn.name  Константин Орленко 27 июня 2014, 13:03:21
Руслан, напишите, пожалуйста, в техподдержку.
   
Да, уже написал.
Первое, что бросается в глаза - в системе таблица Classificator_ShopDeliveryService пустая и отсутствует соответствующий Список в админке. Это на 1424 билде...
   
okn.name  Константин Орленко 30 июня 2014, 10:45:50
На всякий случай запрос на добавление записей:

[CODE]INSERT INTO `Classificator_ShopDeliveryService` (`ShopDeliveryService_ID`, `ShopDeliveryService_Name`, `ShopDeliveryService_Priority`, `Value`, `Checked`) VALUES
(1, 'Почта России', 1, 'nc_netshop_delivery_service_russianpost', 1),
(2, 'EMS', 2, 'nc_netshop_delivery_service_ems', 1);[/CODE]
   
Спасибо большое! Выручили, заработало. :)
   
Каким образом получить варианты доставки?
   
В дефолтном компоненте "Заказ" есть селектор вариантов доставки. Можете оттуда взять.
   
Описание проекта