Дата последнего изменения: 09.11.2023
Для дополнения и неявного изменения (без вмешательства в код компонента) логики работы используйте технологию Событий. Рассмотрим пример использования событий.
Есть потребность напрямую назначать ответственного за обращение в техподдержку. Такое бывает, когда сотрудники компании хорошо знают друг друга, либо когда клиенты ТП желают общаться с конкретным сотрудником.
Есть два варианта решения данной задачи:
Такой подход для непосвященного в такие понятия, как События в Bitrix Framework наиболее очевиден. В результате, задача резко усложняется - нужно разбираться в логике кода компонента, чтобы понять, где нужно добавить свой функционал, а также, не стоит забывать о том, что Bitrix Framework постоянно обновляется. Решение довольно трудоёмкое.
Теория Событий описана ниже. Вкратце: в код ядра, обычно в начало и конец вызова системной функции, разработчики уже вставили вызов системной функции, в нашем случае это: CTicket::ExecuteEvents. Если мы хотим дополнить эту функцию своей, то в файле /bitrix/php_interface/init.php пишем:
AddEventHandler("support", "OnAfterTicketAdd", "MyHandler");
Если вызываемая функция принадлежит классу, то нужно вместо MyHandler написать array("<имя_класса>","<имя_функции>");. Код файла init.php:
<?
// В массиве $arFields передаются все параметры, которые были переданы созданному тикету + ID и MID тикета
// $_REQUEST["PERSONAL"] - Значение, которое мы получаем из нашего шаблона (тега select)
function AfterTicketAdd($arFields)
{
if ($_REQUEST["PERSONAL"]>0)
{
//Добавляем к уже созданому тикету свойство "RESPONSIBLE_USER_ID"=>
CTicket::Set(array(
"RESPONSIBLE_USER_ID"=>$_REQUEST["PERSONAL"]), $intMessage, $arFields['ID'], "N");
}
}
?>
$intMessage - ID нового сообщения, нам не нужно, "N" - здесь указывается, что права на добавление нам проверять не надо.
<?
use Bitrix\Main\Localization\Loc;
// список всех сотрудников техподдержки
// полученный через CTicket::GetSupportTeamList()
$teamList = $arResult['TEAM_LIST'];
?>
<select name="PERSONAL" id="PERSONAL">
<option><?= Loc::getMessage('select_any') ?></option>
<? foreach ($teamList as $item): ?>
<option value="<?= $item['REFERENCE_ID'] ?>"><?= $item['REFERENCE'] ?></option>
<? endforeach ?>
</select>