@Nurvana_lite

Проблема с добавлением чек листа по событию б24. Что подскажете?

добавил в файл init.php такой код. при создании задачи добавляется новый чек лист и тут же удаляется. (видно по логам самой задачи). Не могу понять почему происходит удаление
use \Bitrix\Main;
use \Bitrix\Tasks\CheckList\Task\TaskCheckListFacade;

AddEventHandler("tasks", "OnTaskAdd", ["TaskEvent", "addCheckList"]);

class TaskEvent {
    public static function addCheckList($arTask,&$field)
    {
        CModule::IncludeModule('tasks');
        global $USER;
        $userId = $USER->getId();

        $result = TaskCheckListFacade::add(
            $field['ID'],
            $userId,
            [
                'TITLE' => 'чек-лист',
                'PARENT_ID' => 0,
                'SORT_INDEX' => 0,
                'IS_COMPLETE' => 'N',
            ]
        );
        $item = TaskCheckListFacade::add(
            $field['ID'],
            $userId,
            [
                'TITLE' => 'пункт 1',
                'PARENT_ID' => $result->getData()['ITEM']->getFields()['ID'],
                'SORT_INDEX' => 0,
                'IS_COMPLETE' => 'N',
            ]
        );
return $field;
    }
}
  • Вопрос задан
  • 228 просмотров
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Не могу понять почему происходит удаление


Это происходит потому что процесс создания задачи не заканчивается на создании записи о задаче.

Добавление задачи из публичной части сводится к методу: `Bitrix\Tasks\Manager\Task::add`, где вначале происходит создание записи и инициирование события (строчка 139), а затем объединение чек-листов (строчка 177). Таким образом получается что изначально при создании задачи передается пустой набор чек-листов, потом вы создаете элементы чек-листов, а затем merge производит удаление существующих чек-листов, которые не были переданы в изначальном запросе, а так как их не было - просто удаляет ваши созданные чек-листы.

Как можно избежать этой ситуации?

1. Наилучшим вариантом будет попробовать использовать другое событие: before.
Т.е. не создавать элементы чек-листов, а дополнить исходный массив данных структурой, которая будет создавать чек-листы.
Попробуйте отловить прочку событий before с чек-листами чтобы понять что нужно делать

2. Удовлетворительным вариантом будет так же создание агента, который добавит чек-листы.
Однако тут будут свои тонкости, поскольку агенты могут исполняться значительно позже чем хотелось бы.

3. Так же, неплохим хаком будет являться использование background job - т.к. он выполняется в конце страницы уже после выполнения всех правок.

Обращу ваше внимание - событие является независимым от контекста, поэтому вполне может быть такая ситуация, что при создании задачи на агентах (или консольном скрипте) у вас `$USER` будет null, таким образом ваш скрипт упадет с фатальной ошибкой. Но наличие `$USER` еще не являетися поводом для радости, сам GetId может вернуть `null`, таким образом фатальная ошибка прилетит уже от контроллера прав.
Рекомендую использовать выполнить проверки и сделать fallback механим - подставить ID = 1 (или самому бросить фатальную ошибку) в случае непредвиденной ситуации
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы