Онлайн-руководство разработчика 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

Скидки

В модуле «Интернет-магазин» системы NetCat имеются два уровня скидок: скидки на товары, скидки на корзину и скидки на доставку.

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

Каждая скидка должна иметь понятное название с указанием размера скидки, например: «Скидка 5% при покупке на сумму более 1000 руб.».

Вы можете указать период действия скидки, типы цен, к которым данная скидка применяется, а также группы пользователей, которые могут ею воспользоваться. Если какое-либо из данных полей не заполнено, то скидка не имеет ограничения по этому параметру (т.е. ее срок действия не ограничен, она применяется ко всем типам цен и распространяется на все группы пользователей).

Заполните необходимые поля и сохраните скидку. Добавленная скидка появится в списке.

Добавление скидки для товаров

Как было упомянуто выше вы можете добавить скидку на товар, корзину или доставку. Рассмотрим пример добавления скидки для товара.

Откройте страницу «Скидки на товары» и нажмите кнопку «Добавить». 

Введите название для скидки и её описание.

Здесь же укажите размер скидки: в процентах либо фиксированную сумму, а также при необходимости включите опцию суммирования добавляемой скидки с другими. Внимание! Эта опция влияет на суммирование только в рамках одного и того же типа скидок.

Если на товар действует несколько скидок без флага «суммируется с другими скидками», будет применена максимальная скидка; скидки с флагом «суммируется с другими скидками» будут добавлены к максимальной скидке, выбранной среди скидок, которые не суммируются. При применении нескольких относительных (в процентах) скидок их размер всегда рассчитывается от полной цены товара.

Далее добавляем условие действия этой скидки. Например, сделаем единственное условие: скидку на конкретный товар. Для этого выберем «Добавить условие» => «Товар» 

Нажмите на ссылку выбора товара

Во всплывающем окне выберите товар

В итоге покупатель получит 5% скидку на выбранный товар.

Если выбран товар с вариантами, скидка будет действовать на все варианты данного товара. При выборе варианта товара скидка будет действовать только на данный вариант.

Теперь можно добавить дополнительное условие. Например, ограничить срок действия скидки. В добавлении услуг выберите поле «Дата»

и укажите время действия скидки

В итоге получаем скидку на книгу, действующую в конкретный временной промежуток.

Если же мы изменим логику взаимодействия условий с «И» на «ИЛИ», то получим скидку, которая применяется на все товары в промежуток времени, и на конкретный товар – всегда:

Добавление скидки на доставку

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

Далее указывается условие применения скидки. Выберите желаемое условие:

и укажите условие

При необходимости можно добавить несколько условий. Сохраните скидку.

Ограничение размера скидок

В некоторых случаях фактически применная скидка может быть менее указанной в параметрах скидки:

  • для скидок на товар: учитывается значение поля «Мнинмальная цена» у товара;
  • для скидок на корзину и на товары: при скидках в размере 100% учитывается настройка модуля на текущем сайте «Снижать цены при применении скидок до 0». По умолчанию цена не снижается до нуля, а только до минимального шага цены, поскольку при нулевой цене товара возникнут проблемы с созданием кассовых чеков по заказу. Минимальный шаг цены зависит от настроек основной валюты: если используется 2 знака после запятой, минимальная цена будет равна 1 копейке; если 0 знаков после запятой — 1 рубль.

Пример функции для использования в условиях скидок

Помимо простых условий можно задать вызов пользовательской функции. Пример функции приведён ниже:

<?php
/**
 * Пример функции для использования в условиях скидок
 *
 * @param nc_netshop_condition_context $context
 *      Объект окружения (состав корзины, свойства пользователя).
 * @param nc_netshop_item $current_item
 *      Товар, по отношению к которому проверяется условие.
 * @return boolean
 */
function my_custom_discount_condition(nc_netshop_condition_context $context, nc_netshop_item $current_item = null) {

    // Примеры получения свойств окружения:

    // Содержимое корзины (объект nc_netshop_item_collection):
    $context->get_cart_contents()

    // ID пользователя:
    $context->get_user_id()

    // Активированные купоны (объект nc_netshop_promotion_coupon_collection):
    $context->get_coupons()

    // Получение суммы заказов за определённый промежуток времени
    $context->get_user_previous_orders_sum($from_date_timestamp, $to_date_timestamp)

    // Количество заказов за определённый промежуток времени:
    $context->get_user_previous_orders_count($from_date_timestamp, $to_date_timestamp)
    // где $from_date_timestamp — время начала периода в виде UNIX timestamp (или NULL — за всё время)
    //     $from_date_timestamp — время окончания периода в виде UNIX timestamp (или NULL — до текущего времени)

    // Проверка прошлых заказов на наличие товара из компонента $component_id:
    $context->previous_orders_had_item($component_id, $item_id = null)
    // Если $item_id === null, то любой товар из компонента


    // Внимание! При использовании свойств объекта $current_item нельзя запрашивать
    // свойства, зависящие от скидок, например ItemPrice, ItemDiscount и т.п., так как
    // это приведёт к бесконечному циклу.
    // То же самое относится к свойствам корзины, зависящим от размера скидок!

    // В качестве простого примера — скидка на товары,
    // целая часть цены (без скидки) которых — чётное число:
    $price_is_even = ($current_item['OriginalPrice'] % 2) == 0;
    return $price_is_even;
}

Пример использования функции для проверки условий: скидка по купону отменяет другие скидки на товар

Задача: на товары имеются скидки с флагом «суммируется с другими скидками» и скидки по купону. Скидка по купону является максимально возможной и не должна суммироваться с прочими скидками (то есть, если активирован купон со скидкой на товар, другие скидки к нему не должны применяться).

Решение: добавить к скидкам на товары не по купону условие «И» «Функция „my_discount_condition_no_active_coupons“ возвращает значение „истина“». Код функции:

// Файл: /netcat/modules/default/function.inc.php
/**
 * Функция проверяет, применён ли купон на скидку на указанный товар
 * @param nc_netshop_condition_context $context
 * @param nc_netshop_item|null $current_item
 * @return bool
 */
function my_discount_condition_no_active_coupons(nc_netshop_condition_context $context, nc_netshop_item $current_item = null) {
    if ($current_item) {
        $active_coupons = $context->get_coupons();
        if ($active_coupons) {
            /* Нас интересуют только купоны со скидкой на товар (deal_type == 'discount_item') */
            /** @var nc_netshop_promotion_discount_item $discount */
            foreach ($active_coupons->where('deal_type', 'discount_item')->each('get_deal') as $discount) {
                if ($discount->applies_to($current_item, $context)) {
                    return false;
                }
            }
        }
    }
    return true;
}
Описание проекта