Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Минимальная сумма заказа в корзине и оформлении заказа в 1С-Битрикс

Просмотров: 7494

В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 1С-Битрикс.

В этой заметке добавим возможность установки минимальной суммы заказа, в новом шаблоне корзины на 1С-Битрикс. Не "прибитую гвоздями" в шаблоне компонента, а управляемую через параметры компонента.

Работать будет так: Если сумма в корзине меньше минимальной - то кнопка "Оформить заказ" не показывается, вместо нее уведомление. Как только сумма превышает минимальную - кнопка появляется. Все работает на лету, без перезагрузки страницы. Как-то так:

Минимальная сумма битрикс

Добавляем параметр в корзину

Для начала скопируем шаблон корзины в шаблон своего сайта. В моем случае получился путь: /local/templates/ШАБЛОН_САЙТА/components/bitrix/sale.basket.basket/basket

Открываем, в шаблоне, файл .parameters.php и в массив параметров arTemplateParameters добавляем:

$arTemplateParameters['MIN_SUMM'] = array(
    'PARENT' => 'BASE',
    'NAME' => "Минимальная сумма",
    'TYPE' => 'STRING',
    'DEFAULT' => '0'
);

PS: в 'NAME' можно добавить и прописать сообщение из lang файла GetMessage('MIN_SUMM'), прописал прямо в файл для простоты объяснения.

После этого, в настройках компонента появится поле для указания минимальной суммы:

Минимальная сумма битрикс

Добавляем параметр в AJAX обработчик

Теперь, нужно добавить вывод этого параметра в шаблон. Для этого открываем файл (в шаблоне корзины) mutator.php. В этом файле собран массив с данными для вывода в представление. Обращение к этому файлу происходит при каждом запросе и массив отрабатывает на лету (AJAX). Файл фомирует результат для шаблонизатора mustashe

Находим формирование массива $totalData - примерно на 310-ой строчке. Нужно добавить:

//До формирования массива
  $minSummOrder = $this->arParams['MIN_SUMM'];
  if ($result['allSum'] < (int)$minSummOrder) {
      $minSummMustache = $minSummOrder;
  }

//В конец массива ключ MIN_SUMM
  'MIN_SUMM' => $minSummMustache

Для наглядности картинка: здесь мы проверили меньше ли сумма товаров, минимальной суммы и создали переменную для добавления в массив ключа 'MIN_SUMM'

Минимальная сумма битрикс

На картинке опечатка: не правильно оформлен int - в примере кода все правильно

Выводим параметр пользователям

И осталось вывести и обработать этот параметр для пользователей. Открываем файл шаблон_корзины/js-templates/basket-total.php он отвечает за формирование и вывод низа корзины: где поле купона, итоговая сумма и кнопка перехода к оформлению.

Находим строчку, в которой прописана кнопка перехода к оформлению (примерно, строка 75) и заворачиваем в условие.

{{#MIN_SUMM}}
    <div class="minimal_summ">
        Минимальная сумма заказа {{{MIN_SUMM}}} руб.
    </div>
{{/MIN_SUMM}}
{{^MIN_SUMM}}
  <button data-entity="basket-checkout-button">
    <?=Loc::getMessage('SBB_ORDER')?>
  </button>
{{/MIN_SUMM}}

Здесь мы проверили: если из файла mutator.php пришло значение для MIN_SUMM убираем кнопку перехода к оформлению, но выводим оповещение.

Минимальная сумма в оформлении заказа

Особо хитрые пользователи могут проигнорировать этот функционал и просто перейти на страницу оформления (если знают ссылку). Что бы обезопасить и оформление заказа, можно также проверять минимальную сумму и перенаправлять в корзину.

Как реализовать, смотрите в видео.

Михаил Базаров 13.08.2021
Цитата
Александр написал:
а с оформлением заказа как быть? /personal/order/make/
В принципе, точно так же. Проверять сумму товаров заказа и скрывать / показывать кнопку оформления заказа.
Александр 13.08.2021
а с оформлением заказа как быть? /personal/order/make/
Михаил Базаров 25.11.2020
Цитата
suncity krasnodar написал:
Здравствуйте!
Подскажите в mutator.php все нормально. В basket-total.php заменил, но в корзине ничего не меняется.. в чем может быть проблема? кеш сбросил
Может быть не в том шаблоне корзины делаете?
Это из более менее простого  :)

А так, сложно подсказать - нужно разбираться на месте
suncity krasnodar 25.11.2020
Здравствуйте!
Подскажите в mutator.php все нормально. В basket-total.php заменил, но в корзине ничего не меняется.. в чем может быть проблема? кеш сбросил
Павел Рубцов 26.08.2020
Здравствуйте!

Скажите, а возможно сделать ограничении минимальной суммы корзины, но чтобы при применении купона (в рублях), минимальная сумма отключалась? Сейчас получается так, что человек набирает корзину на 5500 рублей, применяет купон на 5000 рублей, и ему нужно набрать еще товара, до получения минимальной суммы заказа. Подскажите, пожалуйста, куда копать или имеются готовые решения?

Заранее спасибо!
Михаил Базаров 09.08.2020
Цитата
Roland 303 написал:
Приветствую, а следующая заметка с указанием минимальной суммы для разных групп покупателей еще не готова?
Пока нет, пишется )
Roland 303 06.08.2020
Приветствую, а следующая заметка с указанием минимальной суммы для разных групп покупателей еще не готова?
Александр Козлов 19.07.2020
Михаил! Низкий поклон! Теперь всё в полном порядке. Очень удобное решение. Спасибо!
Михаил Базаров 18.07.2020
Цитата
Александр Козлов пишет:
[QUOTE][URL=/club/user/1/]Михаил Базаров[/URL] пишет:
Включите вывод ошибок в .settings.php[/QUOTE] Вот, что не нравится: [CODE] [ParseError]
syntax error, unexpected ''MIN_SUMM'' (T_CONSTANT_ENCAPSED_STRING), expecting ')' (0)

Запятую забыли тут
Код
'CURRENCY' => $result['CURRENCY'],  //<<<<<<- нет запятой 
'MIN_SUMM' => $minSummMustache,  // - тоже можно поставить (не обязательно)
Александр Козлов 17.07.2020
Михаил, спасибо вам за такой изящный способ, давно искал. Но вот только не могу заставить его работать. Всё ввёл как указано, несколько раз проверил, но в корзине ошибка:
Цитата
При выполнении скрипта возникла ошибка. Включить расширенный вывод ошибок можно в файле настроек .settings.php
Причём, начал понять, где именно, что не нравится... Первый пункт явно в порядке, в компоненте появилось поле с минимальной суммой, второй пункт нагляден и в точности его внёс в mutator.php
Код
   $minSummOrder = $this->arParams['MIN_SUMM'];
   if ($result['allSum'] < (int)$minSummOrder) {
       $minSummMustache = $minSummOrder;
   }
$totalData = array(
   'DISABLE_CHECKOUT' => (int)$result['ORDERABLE_BASKET_ITEMS_COUNT'] === 0,
   'PRICE' => $result['allSum'],
   'PRICE_FORMATED' => $result['allSum_FORMATED'],
   'PRICE_WITHOUT_DISCOUNT_FORMATED' => $result['PRICE_WITHOUT_DISCOUNT'],
   'CURRENCY' => $result['CURRENCY']
   'MIN_SUMM' => $minSummMustache
В basket-total.php вышло так:
Код
            <div class="basket-checkout-block basket-checkout-block-btn">
               <button class="btn btn-lg btn-default basket-btn-checkout{{#DISABLE_CHECKOUT}} disabled{{/DISABLE_CHECKOUT}}"
               {{#MIN_SUMM}}
    <div class="minimal_summ">
        Минимальная сумма заказа {{{MIN_SUMM}}} руб.
    </div>
{{/MIN_SUMM}}
{{^MIN_SUMM}}
                  data-entity="basket-checkout-button">
                  <?=Loc::getMessage('SBB_ORDER')?>
               </button>
               {{/MIN_SUMM}}
            </div>
         </div>
      </div>

Но ошибка. Причем, если удалить строку второго действия (что конечно не правильно)
Код
   'MIN_SUMM' => $minSummMustache
То задача по получению "минимальной суммы" хоть и не работает, но корзина работает как и до всех изменений. Подскажите пожалуйста, что я делаю не так, очень хочется реализовать данный вариант. Спасибо

Работы из портфолио

В портфолио не публикуются работы, доля моего участия в которых менее 80%.
Часто обращаются за доработками уже существующих проектов или реализацией не стандратного функционала на готовых сайтах.