Кирсанов_Волошин_Новая eCommerce платформа D7- скидки, управление заказами, автоматизация.pptx
- Количество слайдов: 37
Новая e. Commerce платформа D 7: скидки, управление заказами, автоматизация Юрий Волошин, Алексей Кирсанов 1 С-Битрикс
Ждем ваши вопросы: #bitrixconf в приложении Bitrixconf онлайн на странице трансляции Пишем вопросы здесь
Скидки правило четырех «П» Переезд Производительность Пресеты Предсказания
Переезд • Магазинные скидки o o • единая сортировка единые правила применения Мигратор скидок из каталога в магазин o o • при миграции каталожные скидки отключатся если не мигрировать – все работает по старому Каталожные скидки больше не развиваются
Производительность • Предварительный просчет условий • Оптимизация купонов
Пресеты • Пошаговые мастера • Оптимизация
Предсказания • Условие срабатывания предсказания • Показ в каталоге
Административная часть Сценарии, кастомизация
Нам не хватало гибкости • Работа с формами требовала вмешательства на уровне ядра • Не было возможности встроить требуемый блок в форму • Требовались свои табы в формах • Работаем с телефонными продажами, товары должны быть сверху формы • Формы огромные, сложность навигации • Данные по клиенту должны быть всегда перед глазами • Не было возможности разделить заказ и сделать дополнительные отгрузки и оплаты.
Стояла задача – дать возможность сделать кастомизацию без потери обновлений!
Пользовательские закладки
Пользовательские закладки - 1 // init. php MainEvent. Manager: : get. Instance()->add. Event. Handler("main", "On. Admin. Sale. Order. Edit", array("My. Tab", "on. Init")); // "On. Admin. Sale. Order. Create", "On. Admin. Sale. Order. View" class My. Tab { public static function on. Init() { return array( "TABSET" => "My. Tab", "get. Tabs" => array("My. Tab", "get. Tabs"), "action" => array("My. Tab", "action"), ); } "show. Tab" => array("My. Tab", "show. Tab"), "check" => array("My. Tab", "check"), public static function action($ar. Args) { // Действие после сохранения заказа. Возвращаем true / false // Сообщение $GLOBALS["APPLICATION"]->Throw. Exception("Ошибка!!!", "ERROR"); return true; }
Пользовательские закладки - 2 public static function check($ar. Args) { // Проверки перед сохранением. Возвращаем true / false return true; } public static function get. Tabs($ar. Args) { return array("DIV" => "edit 1", "TAB" => "Мой Tab", "ICON" => "sale", "TITLE" => "Мой Tab", "SORT" => 1)); } } public static function show. Tab($div. Name, $ar. Args, $b. Vars. From. Form) { if ($div. Name == "edit 1") { ? >
Информационная панель
Информационная панель - 1 // init. php MainEvent. Manager: : get. Instance()->add. Event. Handler('sale', 'on. Sale. Admin. Order. Info. Block. Show'); function on. Sale. Admin. Order. Info. Block. Show(Event $event) { // $order = $event->get. Parameter("ORDER"); } return new BitrixMainEvent. Result( BitrixMainEvent. Result: : SUCCESS, array('TITLE' => 'Параметр 1: ', 'VALUE' => 'Значение параметра 1', 'ID' => 'param 1'), array('TITLE' => 'Параметр 2: ', 'VALUE' => 'Значение параметра 2'), ), 'sale' );
Пользовательские блоки
Пользовательские блоки - 1 // init. php Event. Manager: : get. Instance()->add. Event. Handler("main", "On. Admin. Sale. Order. View. Draggable", array("My. Class", "on. Init")); class My. Class { public static function on. Init() { return array("BLOCKSET" => "My. Class", "get. Scripts" => array("My. Class", "get. Scripts"), "get. Blocks. Brief" => array("My. Class", "get. Blocks. Brief"), "get. Block. Content" => array("My. Class", "get. Block. Content"), ); } public static function get. Blocks. Brief($args) { $id = !empty($args['ORDER']) ? $args['ORDER']->get. Id() : 0; return array( 'custom 1' => array("TITLE" => "Пользовательский блок для заказа №". $id), 'custom 2' => array("TITLE" => "Еще один блок для заказа №". $id), ); }
. ." src="https://present5.com/presentation/2629959_438040503/image-18.jpg" alt="Пользовательские блоки - 2 public static function get. Scripts($args) { return ''; } public static function get. Block. Content($block. Code, $selected. Tab, $args) { $result = ''; $id = !empty($args['ORDER']) ? $args['ORDER']->get. Id() : 0; if ($selected. Tab == 'tab_order') { if ($block. Code == 'custom 1') $result = 'Содержимое блока custom 1 Номер заказа: '. $id; if ($block. Code == 'custom 2') $result = 'Содержимое блока custom 2 Номер заказа: '. $id; } } } return $result;
Пользовательские блоки - 3 // init. php Add. Event. Handler("main", "On. Admin. Sale. Order. Edit. Draggable", array("My. Edit. Class", "on. Init"), 100); Add. Event. Handler("main", "On. Admin. Sale. Order. Create. Draggable", array("My. Edit. Class", "on. Init"), 100); class My. Edit. Class extends My. Class { public static function on. Init() { return array( "BLOCKSET" => "My. Edit. Class", } ); "check" => array("My. Edit. Class", "check"), "action" => array("My. Edit. Class", "action"), "get. Scripts" => array("My. Edit. Class", "get. Scripts"), "get. Blocks. Brief" => array("My. Edit. Class", "get. Blocks. Brief"), "get. Block. Content" => array("My. Edit. Class", "get. Block. Content"),
Пользовательские блоки - 4 public static function action($args) { // заказ сохранен, сохраняем данные пользовательских блоков // возвращаем True в случае успеха и False - в случае ошибки // в случае ошибки $GLOBALS["APPLICATION"]->Throw. Exception("Ошибка!!!", "ERROR"); return true; } public static function check($args) { // заказ еще не сохранен, делаем проверки // возвращаем True, если можно все сохранять, иначе False // в случае ошибки $GLOBALS["APPLICATION"]->Throw. Exception("Ошибка!!!", "ERROR"); return true; }
Пользовательские блоки - 5 public static function get. Block. Content($block. Code, $selected. Tab, $args) { $result = ''; $id = !empty($args['ORDER']) ? $args['ORDER']->get. Id() : 0; if ($selected. Tab == 'tab_order') { if ($block. Code == 'custom 1') { $result = 'Содержимое блока custom 1 для заказа №'. $id. ' '; } if ($block. Code == 'custom 2') { $result = 'Содержимое блока custom 2 для заказа №'. $id. ' '; } } return $result;
Пользовательские блоки - 6 // вставим итоговую стоимость заказа в кастомное поле на странице создания/изменения заказа public static function get. Scripts($args) { $id = !empty($args['ORDER']) ? $args['ORDER']->get. Id() : 0; } return '';
Впечатляющая гибкость • Полный набор инструментов для всевозможных кастомизаций • Не теряя возможности обновлений • Не требуется вносить правки в ядро продукта Впечатляйте своих клиентов - возможностями e. Сommerce платформы D 7
Автоматизация интернет продаж
Автоматизация рутины Действия на оплату • После подтверждения частичного платежа • При получение полного платежа • Зависимость доставки от поступления оплаты Действия с доставками • На разрешение доставки частичной отгрузки • На разрешение доставки полной отгрузки • С заказом при полной отгрузке • С заказом при любой частичной отгрузки Действия со статусами заказа • Связанные с отгрузками частичными/полными • Связанные с оплатами частичными/полными
Настройки
События
Виды событий • События обсчета • Система автоматически поддерживает консистентное состояние • существующий заказ – численная отгрузки новый заказ – полный пересчет • целостность • загрузка или Меняем объекты в памяти • создание оплаты заказ События сохранения • Сохраняются все сущности в том состоянии, в котором они есть на данный момент сохранение
Обсчет против Сохранения • События при сохранении применяются для: • применения изменений к внешним по отношению к заказу сущностям (например, к каталогу товаров или внешней базе покупателей) • изменение алгоритма сохранения заказа (например, отмена сохранения) • События на обсчет заказа применяются: • во всех остальных случаях При нарушении этих правил следует учитывать, что: • если изменить внешние данные на обсчете заказа, то они окажутся некорректны, если после обсчета не было сохранения заказа • если изменять параметры заказа на сохранении, то при обсчете они все еще будут старыми (потенциально некорректными)
Обсчет: изменение значения поля • On. Before<имя>Set. Field в самом начале, можно отменить изменения • On<имя>Set. Field перед изменением, если оно реально началось Параметры • ENTITY – объект, чье поле • NAME – название поля • VALUE – значение поля для любого наследника BitrixSaleInternalsEntity • Sale. Order • Sale. Shipment. Item • Sale. Shipment • Sale. Basket. Item • Sale. Payment • Sale. Property. Value
Обсчет: завершение пересчета • On. Before. Sale. Order. Final. Action перед расчетом скидок и налогов, если у заказа есть корзина • On. After. Sale. Order. Final. Action в самом конце обсчета Параметры • ENTITY – объект заказа
Сохранение: заказ • On. Sale. Order. Before. Saved если вернуть Event. Result: : ERROR, то сохранение отменится • On. Sale. Order. Saved Параметры • ENTITY – объект заказа • VALUES – старые значения полей заказа • IS_NEW – новый заказ (только для On. Sale. Order. Saved)
Сохранение: сущности • On<имя>Entity. Saved после сохранения сущности Параметры • ENTITY – сохраняемый объект • VALUES – старые значения полей для любого наследника BitrixSaleInternalsEntity • Sale. Order • Sale. Shipment. Item • Sale. Shipment • Sale. Basket. Item • Sale. Payment • Sale. Property. Value
Сохранение: особые события Инициируются при обсчете, но вызываются при сохранении • On. Sale. Order. Canceled - сохраняемый заказ был отменен • On. Sale. Status. Order. Change – статус заказа был изменен • On. Sale. Order. Paid – оплаченность заказа была изменена • On. Shipment. Tracking. Number. Change – был изменен идентификатор отправления • On. Shipment. Allow. Delivery – был изменен флаг разрешения отгрузки • On. Shipment. Deducted – был изменен флаг отгрузки Параметры • ENTITY – соответствующий объект (заказ, оплата или отгрузка)
Сохранение: корзина Если корзина не привязана к заказу • On. Sale. Basket. Before. Saved если вернуть Event. Result: : ERROR, то сохранение отменится • On. Sale. Basket. Saved Параметры • ENTITY – объект корзины
Новая e. Commerce платформа D 7 • Применяйте новые паттерны разработки • • Занимайтесь творчеством, а не рутиной • Расширяйте свои сферы влияния на новых рынках Используйте решения которые делают вас лидером
Спасибо за внимание! Вопросы?


