Есть в КП функция напоминания о задаче на почту (и не только, но т.к. занимался только уведомления на почту о них и буду писать). Но напоминания почему то устанавливаются на определенную дату, без возможности выбрать время напоминания нет.
[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").
Функцию цепляем на агент, раз в минуту или по вкусу

Результат: