На летней конференции Bitrix Day 2016 были представлены новые возможности кастомизации формы заказа в админке. Эти изменения появились в версии 16.0.33 модуля sale.

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

Добавление параметров в информационную панель

saleform-panel.png

Используем событие onSaleAdminOrderInfoBlockShow, в событии нам доступны ORDER - объект заказа и ORDER_BASKET - объект корзины. Обработчик должен вернуть объект EventResult с массивом нужных параметров. Доступны ключи: TITLE - название параметра, VALUE - значение и необязательный ID - ID элемента в информационной панели со значением нового параметра. VALUE выводится без экранирования, т.е. можно использовать HTML. Добавим местоположение пользователя, как на скриншоте выше:

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler('sale', 'onSaleAdminOrderInfoBlockShow', 'onSaleAdminOrderInfoBlockShow');

function onSaleAdminOrderInfoBlockShow(\Bitrix\Main\Event $event)
{
    $order = $event->getParameter("ORDER");
    //$basket = $event->getParameter("ORDER_BASKET");

    $propertyCollection = $order->getPropertyCollection();
    $location = \Bitrix\Sale\Location\Admin\LocationHelper::getLocationStringByCode($propertyCollection->getDeliveryLocation()->getValue());

    return new \Bitrix\Main\EventResult(
        \Bitrix\Main\EventResult::SUCCESS,
        array(
            array(
                'TITLE' => 'Местоположение:',
                'VALUE' => $location,
                'ID' => 'location'
            ),
        )
    );
}

Добавление вкладок

Для добавления вкладок нужно создать класс и повесить метод класса на событие OnAdminSaleOrderXXXXXXX (событие модуля main!):

  • OnAdminSaleOrderCreate - для формы создания заказа
  • OnAdminSaleOrderEdit- для формы редактирования заказа
  • OnAdminSaleOrderView - для формы просмотра заказа.

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

saleform-tab.png

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("main", "OnAdminSaleOrderView", array("MyAdminOrderFormTabs", "onInit"));

class MyAdminOrderFormTabs
{
    function onInit()
    {
        return array(
            "TABSET" => "MyTabs",
            "GetTabs" => array("MyAdminOrderFormTabs", "getTabs"),
            "ShowTab" => array("MyAdminOrderFormTabs", "showTabs"),
            "Action" => array("MyAdminOrderFormTabs", "onSave"),
            "Check" => array("MyAdminOrderFormTabs", "onBeforeSave"),
        );
    }

    /*
    Возвращает массив вкладок
    */
    function getTabs($args)
    {
        return array(
            array(
                "DIV" => "myTab1", 
                "TAB" => "Важная информация", 
                "TITLE" => "Все любят котят",
                "SORT" => 1
            )
        );
    }

    /*
    Выводит вкладку
    */
    function showTabs($tabName, $args, $varsFromForm)
    {
        if ($tabName == "myTab1") {
            echo "<img style='width: 100%' src='/upload/kotenok_mashet_lapkoj.jpg' />";
        }
    }

    /*
    Вызывается перед onSave
    Для формы просмотра бесполезно, написано для примера
    */
    function onBeforeSave($args)
    {
        return true;
    }

    /*
    Вызывается после onBeforeSave при отправке формы
    Для формы просмотра бесполезно, написано для примера
    */
    function onSave($args)
    {
        return true;
    }
}

В методах можно выбрасывать исключение, чтобы остановить сохранение, с помощью CMain::ThrowException. Аргумент $args содержит массив get-параметров. Не очень понятно, почему не post-параметры и зачем вообще нужен аргумент в этих функциях, ведь можно получить эти массивы и самому. Логичнее было бы передавать объект Request.

Продолжение следует...