Upload
1-
View
386
Download
5
Embed Size (px)
Citation preview
Юрий Волошин, Алексей Кирсанов1С-Битрикс
Новая eCommerce платформа D7: скидки, управление заказами, автоматизация
Скидкиправило четырех «П»
ПереездПроизводительностьПресетыПредсказания
• Магазинные скидкиo единая сортировкаo единые правила применения
• Мигратор скидок из каталога в магазинo при миграции каталожные скидки
отключатсяo если не мигрировать – все работает по
старому• Каталожные скидки больше не
развиваются
Переезд
• Предварительный просчет условий• Оптимизация купонов
Производительность
• Пошаговые мастера• Оптимизация
Пресеты
• Условие срабатывания предсказания• Показ в каталоге
Предсказания
Административная частьСценарии, кастомизация
Нам не хватало гибкости• Работа с формами требовала
вмешательства на уровне ядра• Не было возможности встроить
требуемый блок в форму• Требовались свои табы в формах • Работаем с телефонными продажами,
товары должны быть сверху формы• Формы огромные, сложность
навигации• Данные по клиенту должны быть
всегда перед глазами• Не было возможности разделить заказ
и сделать дополнительные отгрузки и оплаты.
Стояла задача – дать возможность сделать кастомизациюбез потери обновлений!
Пользовательские закладки
Пользовательские закладки - 1// init.php
Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderEdit", array("MyTab", "onInit"));// "OnAdminSaleOrderCreate", "OnAdminSaleOrderView"
class MyTab{
public static function onInit(){
return array("TABSET" => "MyTab","getTabs" => array("MyTab", "getTabs"), "showTab" => array("MyTab", "showTab"),"action" => array("MyTab", "action"), "check" => array("MyTab", "check"),
);}
public static function action($arArgs){
// Действие после сохранения заказа. Возвращаем true / false// Сообщение $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR");return true;
}
Пользовательские закладки - 2public static function check($arArgs){
// Проверки перед сохранением. Возвращаем true / falsereturn true;
}
public static function getTabs($arArgs){
return array(array("DIV" => "edit1", "TAB" => "Мой Tab", "ICON" => "sale", "TITLE" => "Мой Tab", "SORT" => 1));
}
public static function showTab($divName, $arArgs, $bVarsFromForm){
if ($divName == "edit1"){
?><tr><td width="40%">Мое поле:</td><td width="60%"><input type="text" name="my_field"></td></tr><?
}}
}
Информационная панель
Информационная панель - 1
// init.phpMain\EventManager::getInstance()->addEventHandler('sale', 'onSaleAdminOrderInfoBlockShow', 'onSaleAdminOrderInfoBlockShow');
function onSaleAdminOrderInfoBlockShow(Event $event){
// $order = $event->getParameter("ORDER");
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS,array(
array('TITLE' => 'Параметр 1:', 'VALUE' => 'Значение параметра 1', 'ID' => 'param1'),array('TITLE' => 'Параметр 2:',
'VALUE' => '<a href="http://1c-bitrix.ru">Значение параметра 2</a>'),),'sale'
);}
Пользовательские блоки
Пользовательские блоки - 1// init.phpEventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderViewDraggable", array("MyClass", "onInit"));
class MyClass{
public static function onInit(){
return array("BLOCKSET" => "MyClass","getScripts" => array("MyClass", "getScripts"),"getBlocksBrief" => array("MyClass", "getBlocksBrief"),"getBlockContent" => array("MyClass", "getBlockContent"),
);}
public static function getBlocksBrief($args){
$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;return array(
'custom1' => array("TITLE" => "Пользовательский блок для заказа №".$id),'custom2' => array("TITLE" => "Еще один блок для заказа №".$id),
);}
Пользовательские блоки - 2public static function getScripts($args){
return '<script type="text/javascript">... </script>';}
public static function getBlockContent($blockCode, $selectedTab, $args){
$result = '';$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;
if ($selectedTab == 'tab_order'){
if ($blockCode == 'custom1')$result = 'Содержимое блока custom1<br> Номер заказа: '.$id;
if ($blockCode == 'custom2')$result = 'Содержимое блока custom2<br> Номер заказа: '.$id;
}
return $result;}
}
Пользовательские блоки - 3// init.phpAddEventHandler("main", "OnAdminSaleOrderEditDraggable", array("MyEditClass", "onInit"), 100);AddEventHandler("main", "OnAdminSaleOrderCreateDraggable", array("MyEditClass", "onInit"), 100);
class MyEditClass extends MyClass{
public static function onInit(){
return array("BLOCKSET" => "MyEditClass",
"check" => array("MyEditClass", "check"),"action" => array("MyEditClass", "action"),"getScripts" => array("MyEditClass", "getScripts"),"getBlocksBrief" => array("MyEditClass", "getBlocksBrief"),"getBlockContent" => array("MyEditClass", "getBlockContent"),
);}
Пользовательские блоки - 4
public static function action($args){
// заказ сохранен, сохраняем данные пользовательских блоков// возвращаем True в случае успеха и False - в случае ошибки// в случае ошибки $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR");return true;
}
public static function check($args){
// заказ еще не сохранен, делаем проверки// возвращаем True, если можно все сохранять, иначе False// в случае ошибки $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR");return true;
}
Пользовательские блоки - 5public static function getBlockContent($blockCode, $selectedTab, $args){
$result = '';$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;
if ($selectedTab == 'tab_order'){
if ($blockCode == 'custom1'){
$result = 'Содержимое блока custom1 для заказа №'.$id.'<br><input name="custom1" value="cust1">';
}if ($blockCode == 'custom2'){
$result = 'Содержимое блока custom2 для заказа №'.$id.'<br><input name="custom2" value="cust2">';
}}
return $result;}
}
Пользовательские блоки - 6// вставим итоговую стоимость заказа в кастомное поле на странице создания/изменения заказа
public static function getScripts($args){
$id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0;
return '<script type="text/javascript">BX.ready(function(){
BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters({"TOTAL_PRICES": function(prices){
var custom = BX("custom_field");if (custom_field)
custom_field.value = prices.PRICE_TOTAL;}
});});
</script>';}
Впечатляющая гибкость
• Полный набор инструментов для всевозможных кастомизаций
• Не теряя возможности обновлений
• Не требуется вносить правки в ядро продукта
Впечатляйте своих клиентов - возможностями eСommerce платформы D7
Автоматизацияинтернет продаж
Автоматизация рутины Действия на оплату
• После подтверждения частичного платежа• При получение полного платежа• Зависимость доставки от поступления оплаты
Действия с доставками• На разрешение доставки частичной отгрузки• На разрешение доставки полной отгрузки• С заказом при полной отгрузке• С заказом при любой частичной отгрузки
Действия со статусами заказа• Связанные с отгрузками частичными/полными• Связанные с оплатами частичными/полными
Настройки
События
• События обсчета
• Меняем объекты в памяти
• Система автоматически поддерживает
консистентное состояние
• новый заказ – полный пересчет
• существующий заказ – численная
целостность
• События сохранения
• Сохраняются все сущности в том состоянии, в
котором они есть на данный момент
заказ
оплаты
отгрузки
создание
сохранение
загрузкаили
Виды событий
• События при сохранении применяются для:• применения изменений к внешним по отношению к заказу сущностям (например, к
каталогу товаров или внешней базе покупателей)• изменение алгоритма сохранения заказа (например, отмена сохранения)
• События на обсчет заказа применяются:• во всех остальных случаях
При нарушении этих правил следует учитывать, что:• если изменить внешние данные на обсчете заказа, то они окажутся некорректны, если после
обсчета не было сохранения заказа• если изменять параметры заказа на сохранении, то при обсчете они все еще будут старыми
(потенциально некорректными)
Обсчет против Сохранения
• OnBefore<имя>SetFieldв самом начале, можно отменить изменения
• On<имя>SetFieldперед изменением, если оно реально началось
Параметры
•ENTITY – объект, чье поле
•NAME – название поля
•VALUE – значение поля
для любого наследника \Bitrix\Sale\Internals\Entity
Обсчет: изменение значения поля
• SaleOrder
• SaleBasketItem
• SaleShipmentItem
• SalePayment
• SaleShipment
• SalePropertyValue
• OnBeforeSaleOrderFinalAction
перед расчетом скидок и налогов, если у заказа
есть корзина
• OnAfterSaleOrderFinalAction
в самом конце обсчета
Параметры
• ENTITY – объект заказа
Обсчет: завершение пересчета
• OnSaleOrderBeforeSaved
если вернуть EventResult::ERROR, то сохранение
отменится
• OnSaleOrderSaved
Параметры
•ENTITY – объект заказа
•VALUES – старые значения полей заказа
•IS_NEW – новый заказ (только для OnSaleOrderSaved)
Сохранение: заказ
• On<имя>EntitySaved
после сохранения сущности
Параметры
•ENTITY – сохраняемый объект
•VALUES – старые значения полей
для любого наследника \Bitrix\Sale\Internals\Entity
Сохранение: сущности
• SaleOrder
• SaleBasketItem
• SaleShipmentItem
• SalePayment
• SaleShipment
• SalePropertyValue
Инициируются при обсчете, но вызываются при сохранении
• OnSaleOrderCanceled - сохраняемый заказ был отменен
• OnSaleStatusOrderChange – статус заказа был изменен
• OnSaleOrderPaid – оплаченность заказа была изменена
• OnShipmentTrackingNumberChange – был изменен идентификатор отправления
• OnShipmentAllowDelivery – был изменен флаг разрешения отгрузки
• OnShipmentDeducted – был изменен флаг отгрузки
Параметры
• ENTITY – соответствующий объект (заказ, оплата или отгрузка)
Сохранение: особые события
Если корзина не привязана к заказу
• OnSaleBasketBeforeSaved
если вернуть EventResult::ERROR, то
сохранение отменится
• OnSaleBasketSaved
Параметры
•ENTITY – объект корзины
Сохранение: корзина
Новая eCommerce платформа D7
• Применяйте новые паттерны разработки
• Занимайтесь творчеством, а не рутиной• Используйте решения которые делают
вас лидером• Расширяйте свои сферы влияния на
новых рынках
Спасибо за внимание! Вопросы?