Не могу понять, почему код не работает, хотя статусы у меня совпадают. Можете ли помочь? Вот код: <br/> <br/> <pre><code>AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");
function OnTaskUpdateHandler($taskId, $arFields) {
$taskData = CTaskItem::getInstance($taskId, 1);
$taskStatus = $taskData->data["STATUS"];
if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто"
$taskCreatedBy = $taskData->data["CREATED_BY"]; // Получаем ID постановщика задачи
$notificationParams = array(
"TO_USER_ID" => $taskCreatedBy, // Постановщик задачи
"NOTIFY_TYPE" => IM_NOTIFY_FROM,
"NOTIFY_MODULE" => "tasks",
"NOTIFY_EVENT" => "task_update",
"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
);
CIMNotify::Add($notificationParams); // Отправляем уведомление
}
}</code></pre>
Давайте посмотрим на ваш код и попробуем понять, почему он может не работать.
1. **Проверка статуса**: Вы проверяете, равен ли статус задачи `5`, что, как вы отметили, соответствует статусу "Закрыто". Убедитесь, что действительно статус "Закрыто" имеет значение `5`. Иногда статусы могут быть определены через константы или перечисления.
2. **Правильность обработки события**: Убедитесь, что ваше событие `OnTaskUpdate` обрабатывается корректно и вызывается. Возможно, стоит добавить логирование в начале вашей функции, чтобы убедиться, что она срабатывает.
3. **Получение данных о задаче**: Убедитесь, что вы получаете корректные данные о задаче через `CTaskItem::getInstance($taskId, 1)`. Возможно, у вас нет нужных прав доступа или задача была удалена/изменена между обработкой события.
4. **Параметры уведомления**: Убедитесь, что параметры уведомления передаются правильно. Используйте `CIMNotify::Add($notificationParams)` только если у вас есть такой метод и он доступен.
5. **Отсутствие ошибок**: Проверьте, нет ли ошибок в журнале или консоли (если у вас есть доступ к ней). Иногда ошибки могут давать подсказки, что идет не так.
Попробуйте следующий улучшенный код с добавлением логирования:
```php
AddEventHandler("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");
function OnTaskUpdateHandler($taskId, $arFields) {
$taskData = CTaskItem::getInstance($taskId, 1);
if (!$taskData) {
// Логируем, если задача не найдена
error_log("Задача с ID $taskId не найдена.");
return;
}
$taskStatus = $taskData->data["STATUS"];
// Логируем статус задачи
error_log("Статус задачи $taskId: $taskStatus");
if ($taskStatus == 5) { // Проверяем, что статус задачи равен "Закрыто"
$taskCreatedBy = $taskData->data["CREATED_BY"]; // Получаем ID постановщика задачи
// Логируем ID создателя задачи
error_log("Постановщик задачи $taskId: $taskCreatedBy");
$notificationParams = array(
"TO_USER_ID" => $taskCreatedBy, // Постановщик задачи
"NOTIFY_TYPE" => IM_NOTIFY_FROM,
"NOTIFY_MODULE" => "tasks",
"NOTIFY_EVENT" => "task_update",
"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
);
if (CIMNotify::Add($notificationParams)) {
error_log("Уведомление отправлено для задачи $taskId.");
} else {
error_log("Не удалось отправить уведомление для задачи $taskId.");
}
}
}
```
Этот код добавляет несколько логов, которые могут помочь вам понять, на каком этапе происходит проблема. Вы можете проверить вывод логов, чтобы увидеть, работает ли ваш обработчик событий и какие значения он получает.
Без лишних слов, вот так: <br/> <br/> <pre><code class="php">// Подписываемся на событие через современный механизм
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");
function OnTaskUpdateHandler($taskId, $editedFields, $originalFields)
{
// Если статус не меняется, ничего делать не нужно
if ( !array_key_exists('STATUS', $editedFields) )
{
return true;
}
// Если статус меняется НЕ в состояние completed - ничего делать не нужно
if ( intval($editedFields["STATUS"]) != \Bitrix\Tasks\Internals\Task\Status::COMPLETED )
{
return true;
}
// Если вы меняете что-то другое, например название завершенной задачи, а статус просто летит за компанию, то делать ничего не нужно
if ( $editedFields["STATUS"] == $editedFields["originalFields"] )
{
return true;
}
// Наш обработчик не имеет смысла, если модуль "Веб-мессенджер" не подключен
if (!\Bitrix\Main\Loader::includeModule('im'))
{
return true;
}
/**
* Посмотреть поля можно через этот метод.
* Они будут в той же директории где и текущий файл, в файле log.log
*/
//\Bitrix\Main\Diag\Debug::dumpToFile(
// [
// '$taskId' => $taskId,
// '$arFields' => $arFields,
// '$eventTaskData' => $eventTaskData
// ],
// date('d.m.Y H:i:s'),
// str_replace($_SERVER['DOCUMENT_ROOT'], '', __DIR__.'/log.log')
//);
$notificationParams = [
"TO_USER_ID" => $originalFields["CREATED_BY"],
"FROM_USER_ID" => $originalFields["CREATED_BY"],
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
"NOTIFY_MODULE" => 'tasks',
"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
];
\CIMNotify::Add($notificationParams);
}</code></pre>