Есть в КП функция напоминания о задаче на почту (и не только, но т.к. занимался только уведомления на почту о них и буду писать). Но напоминания почему то устанавливаются на определенную дату, без возможности выбрать время напоминания нет.
[spoiler]
Одна беда, сделать это без изменения двух (фактически можно обойтись одним) файлов ядра не получилось...
И так, для решения задачи нам потребуется:
1. в окно ввода даты добавить поля для ввода времени
2. написать свою функцию для агента
Ввод напоминания у нас присутствует на странице создания и просмотра таска, это компоненты tasks.task.edit и tasks.task.detail.
Переходим к вопросу 1 - добавить поля ввода даты в календарь.
Инициализация календаря находится здесь:
Собственно если его скопировать куда то к себе (и соответственно в шаблоне вызывать из "своего места"), то это минус один отредактированный файл в ядре.
Строка 392 bTime: false, меняем на true (метод TaskReminders.prototype.__showCalendar)
После этого мы получим календарь с датой. Но при этом сохраняться будет только число и выводиться в напоминании тоже только число.
Для начала изменим формат отображения даты в js. В шаблоне компонента в скриптах создается шаблон tasksRemindersPopUp, у него есть событие onRemindersChange ну и собственно формат отображения даты задается так:
а сам формат определен здесь
В самом начале шаблона у нас определяются сообщения для скриптов:
туда и добавим наш формат даты
Все, что надо для нормального отображения даты с временем мы сделали.
Решим вторую задачу, свой агент.
Родной агент CTaskReminders::SendAgent(); отрабатывает раз в час и отправляет сообщения у которых дата "меньше чем завтра", т.е. сегодня при этом время не учитывается. Нам такой агент не нужен, поэтому будем писать свой и текущий агент дективируем.
Писать свой - громко сказано, будем переделывать то, что написали специалисты битрикса до нас.
Собственно код функции агента (и комментарии буду писать по тексту), пишем в init.php:
Ну и самое неприятное, изменения в ядре, что бы не наступить на пару граблей выше.
Редактируем файл /bitrix/modules/tasks/classes/general/taskreminders.php
В методах GetFilter и Delete находим $DB->CharToDateF unction($val, "SHORT") и меняем на $DB->CharToDateF unction($val, "FULL").
Функцию цепляем на агент, раз в минуту или по вкусу
Результат:
[spoiler]
Одна беда, сделать это без изменения двух (фактически можно обойтись одним) файлов ядра не получилось...
И так, для решения задачи нам потребуется:
1. в окно ввода даты добавить поля для ввода времени
2. написать свою функцию для агента
Ввод напоминания у нас присутствует на странице создания и просмотра таска, это компоненты tasks.task.edit и tasks.task.detail.
Переходим к вопросу 1 - добавить поля ввода даты в календарь.
Инициализация календаря находится здесь:
$GLOBALS['APPLICATION']->AddHeadScript("/bitrix/js/tasks/task-reminders.js"); |
Строка 392 bTime: false, меняем на true (метод TaskReminders.prototype.__showCalendar)
TaskReminders.prototype.__showCalendar = f unction(e) { if(!e) e = wind ow .event; var curDate = new Date(); var curTimestamp = Math.round(curDate / 1000) - curDate.getTimezoneOffset() * 60; //jsCal endar. Show(BX ("task-reminder-textbox"), "task-reminder-textbox", "", "", false, curTimestamp); BX .calendar({ node: BX ("task-reminder-textbox"), field: "task-reminder-textbox", form: '', bTime: true, currentTime: curTimestamp, bHideTimebar: false }); } |
Для начала изменим формат отображения даты в js. В шаблоне компонента в скриптах создается шаблон tasksRemindersPopUp, у него есть событие onRemindersChange ну и собственно формат отображения даты задается так:
value: BX .date.format(BX .date.convertBitrixFormat(BX .message('FORMAT_DATE')), this.reminders[i].date) |
BX .message('FORMAT_DATE') |
BX .message |
BX .message({ TASKS_DEFAULT_TITLE : "<?php echo GetMessage("TASKS_DEFAULT_TITLE") ?>", ... FORMAT_DATE: "DD.MM.YYYY HH:MI:SS" }); |
Решим вторую задачу, свой агент.
Родной агент CTaskReminders::SendAgent(); отрабатывает раз в час и отправляет сообщения у которых дата "меньше чем завтра", т.е. сегодня при этом время не учитывается. Нам такой агент не нужен, поэтому будем писать свой и текущий агент дективируем.
Писать свой - громко сказано, будем переделывать то, что написали специалисты битрикса до нас.
Собственно код функции агента (и комментарии буду писать по тексту), пишем в init.php:
function TaskRemider() { global $DB; if (!CModule::IncludeModule("tasks")) die(); /* отличие раз - в фильтруем по дате и времени (ищем напоминания с временем исполнения меньше текущего) */ $arFilter = array( "<=REMIND_DATE" => date($DB -> DateFormatToPHP(CSite::GetDateFormat("FULL")), mktime(date("H"), date("i"))) ); /* но тут же натыкаемся на грабли... метод CTaskReminders::GetList для параметров выборки использует метод CTaskReminders::GetFilter, а тот в свою очередь дату переводит в SHORT, об этом ниже */ $rsReminders = CTaskReminders::GetList(array("date" => "asc"), $arFilter); while ($arReminder = $rsReminders -> Fetch()) { $rsTask = CTasks::GetByID($arReminder["TASK_ID"], false); if ($arTask = $rsTask -> Fetch()) { if ($arTask['CLOSED_DATE'] === NULL) { $rsUser = CUser::GetByID($arReminder["USER_ID"]); if ($arUser = $rsUser -> Fetch()) { $arTask["PATH_TO_TASK"] = CTaskNotifications::GetNotificationPath($arUser, $arTask["ID"]); /* здесь мы вместо константы ставим непосредственно значение E (отправлять на e-mail) */ if ($arReminder["TRANSPORT"] == "E" || !CModule::IncludeModule("socialnetwork") || !CTaskReminders::__SendJabberReminder($arUser["ID"], $arTask)) { /* здесь вместо приватного метода CTaskReminders::__SendEmailReminder($arUser["EMAIL"], $arTask); просто отправляем почтовое сообщение (которое в принципе этим приватным методом и отправлялось) */ $arEventFields = array( "PATH_TO_TASK" => $arTask["PATH_TO_TASK"], "TASK_TITLE" => $arTask["TITLE"], "EMAIL_TO" => $arUser['EMAIL'], ); CEvent::Send("TASK_REMINDER", array($arTask["SITE_ID"]), $arEventFields, "N"); } } } } } /* здесь грабли номер два, при формировании запроса в фильтре дата тоже в SHORT */ CTaskReminders::Delete($arFilter); return "TaskRemider();"; } |
Редактируем файл /bitrix/modules/tasks/classes/general/taskreminders.php
В методах GetFilter и Delete находим $DB->CharToDateF unction($val, "SHORT") и меняем на $DB->CharToDateF unction($val, "FULL").
Функцию цепляем на агент, раз в минуту или по вкусу
Результат: