Дата последнего изменения: 16.11.2023
С версии 16.0.33 модуля Интернет-магазин доступна возможность кастомизации форм просмотра, редактирования и создания заказа. Функционал основан на использовании специальных событий, тем самым вам не требуется вносить правки в ядро продукта и вы не теряете возможность установки обновлений системы.
Чтобы добавить собственную закладку в форму заказа, следует использовать обработчик соответствующего события:
Рассмотрим пример добавления закладки в форму редактирования заказа:
В файл bitrix/php_interface/init.php
необходимо добавить обработчик события OnAdminSaleOrderEdit:
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderEdit", array("MyTab", "onInit")); class MyTab { public static function onInit() { return array( "TABSET" => "MyTab", "GetTabs" => array("MyTab", "mygetTabs"), "ShowTab" => array("MyTab", "myshowTab"), "Action" => array("MyTab", "myaction"), "Check" => array("MyTab", "mycheck"), ); } public static function myaction($arArgs) { // Действие после сохранения заказа. Возвращаем true / false // Сообщение $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR"); return true; } public static function mycheck($arArgs) { // Проверки перед сохранением. Возвращаем true / false return true; } public static function mygetTabs($arArgs) { return array(array("DIV" => "edit1", "TAB" => "Моя закладка", "ICON" => "sale", "TITLE" => "Пользовательские настройки", "SORT" => 1)); } public static function myshowTab($divName, $arArgs, $bVarsFromForm) { if ($divName == "edit1") { ?><tr><td width="40%">Мое поле:</td> <td width="60%"><input type="text" name="myfield"></td></tr><? } } }
В обработчике указываем какие методы будут вызываться. Так с помощью методов mygetTabs и myshowTab определяем добавляемые закладки и их содержимое. Метод mycheck определяет действия, которые будут выполняться перед сохранением заказа, а метод myaction - действия, которые будут выполняться при сохранении заказа.
Рассмотрим пример добавления новых строчек в информационную панель:
Следует использовать обработчик построения информационной панели onSaleAdminOrderInfoBlockShow и из него вернуть параметры, которые нам необходимо добавить:
\Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'onSaleAdminOrderInfoBlockShow', 'onSaleAdminOrderInfoBlockShow'); function onSaleAdminOrderInfoBlockShow(\Bitrix\Main\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' ); }
Таким образом, вы можете вернуть необходимую дополнительную информацию, которую будете показывать менеджеру.
Пользовательские блоки могут быть созданы наравне со стандартными блоками: они также могут сворачиваться и перетаскиваться:
Чтобы добавить пользовательские блоки в форму просмотра заказа, следует использовать обработчик события OnAdminSaleOrderViewDraggable:
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderViewDraggable", array("MyClass1", "onInit")); class MyClass1 { public static function onInit() { return array("BLOCKSET" => "MyClass1", "getScripts" => array("MyClass1", "mygetScripts"), "getBlocksBrief" => array("MyClass1", "mygetBlocksBrief"), "getBlockContent" => array("MyClass1", "mygetBlockContent"), ); } public static function mygetBlocksBrief($args) { $id = !empty($args['ORDER']) ? $args['ORDER']->getId() : 0; return array( 'custom1' => array("TITLE" => "Пользовательский блок для заказа №".$id), 'custom2' => array("TITLE" => "Еще один блок для заказа №".$id), ); } public static function mygetScripts($args) { return '<script type="text/javascript">... </script>'; } public static function mygetBlockContent($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; } }
В обработчике необходимо вернуть методы, которые система должна вызывать для формирования блоков:
Чтобы добавить пользовательские блоки в форму создания/редактирования заказа, следует использовать обработчики событий OnAdminSaleOrderCreateDraggable/OnAdminSaleOrderEditDraggable:
\Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderEditDraggable", array("MyEditClass", "onInit")); \Bitrix\Main\EventManager::getInstance()->addEventHandler("main", "OnAdminSaleOrderCreateDraggable", array("MyEditClass", "onInit")); class MyEditClass extends MyClass1 { public static function onInit() { return array( "BLOCKSET" => "MyEditClass", "check" => array("MyEditClass", "mycheck"), "action" => array("MyEditClass", "myaction"), "getScripts" => array("MyEditClass", "mygetScripts"), "getBlocksBrief" => array("MyEditClass", "mygetBlocksBrief"), "getBlockContent" => array("MyEditClass", "mygetBlockContent"), ); } public static function myaction($args) { // заказ сохранен, сохраняем данные пользовательских блоков // возвращаем True в случае успеха и False - в случае ошибки // в случае ошибки $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR"); return true; } public static function mycheck($args) { // заказ еще не сохранен, делаем проверки // возвращаем True, если можно все сохранять, иначе False // в случае ошибки $GLOBALS["APPLICATION"]->ThrowException("Ошибка!!!", "ERROR"); return true; } public static function mygetBlockContent($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" id="custom2_field">'; } } return $result; } //вставим итоговую стоимость заказа в кастомное поле №2 на странице создания/изменения заказа public static function mygetScripts($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("custom2_field"); if (custom2_field) custom2_field.value = prices.PRICE_TOTAL; } }); }); </script>'; } }
В обработчик, помимо методов mygetScripts, mygetBlocksBrief и mygetBlockContent, добавляются еще 2 метода: mycheck и myaction, которые вызываются перед сохранением и при сохранении заказа соответственно.