- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_reminder.php
- Класс: CCalendarReminder
- Вызов: CCalendarReminder::updateReminders
static function updateReminders($params = [])
{
$eventId = (int)$params['id'];
$entryFields = $params['arFields'];
$reminders = $params['reminders'] ?? null;
$userId = (int)$params['userId'];
if (!$reminders)
{
$reminders = self::prepareReminder($entryFields['REMIND']);
}
$path = $params['path'];
if (empty($path))
{
$path = CCalendar::GetPath($entryFields['CAL_TYPE'], $entryFields['OWNER_ID'], true);
}
$path = CHTTP::urlDeleteParams($path, ["action", "sessid", "bx_event_calendar_request", "EVENT_ID", "EVENT_DATE"]);
$viewPath = CHTTP::urlAddParams($path, ['EVENT_ID' => $eventId]);
$agentParams = [
'eventId' => $eventId,
'userId' => $entryFields["CREATED_BY"] ?? null,
'viewPath' => $viewPath,
'calendarType' => $entryFields["CAL_TYPE"] ?? null,
'ownerId' => $entryFields["OWNER_ID"] ?? null
];
// 1. clean reminders
self::RemoveAgent($agentParams);
// Prevent dublication of reminders for non-user's calendar context (mantis:0128287)
if (empty($entryFields['IS_MEETING']) || $entryFields['CAL_TYPE'] === 'user')
{
// 2. Set new reminders
if (CCalendarEvent::CheckRecurcion($entryFields))
{
$entryList = CCalendarEvent::GetList(
[
'arFilter' => [
"ID" => $eventId,
"DELETED" => "N",
"FROM_LIMIT" => CCalendar::Date(time() - 3600, false),
"TO_LIMIT" => CCalendar::GetMaxDate()
],
'userId' => $userId,
'parseRecursion' => true,
'maxInstanceCount' => 4,
'preciseLimits' => true,
'fetchAttendees' => true,
'checkPermissions' => false,
'setDefaultLimit' => false
]
);
if (is_array($entryList))
{
$index = 0;
foreach ($entryList as $entry)
{
$eventTimestamp = CCalendar::Timestamp($entry['DATE_FROM'], false, true);
$eventTimestamp = $eventTimestamp - CCalendar::GetTimezoneOffset(
$entry["TZ_FROM"],
$eventTimestamp
) + date("Z", $eventTimestamp);
// List of added timestamps of reminders to avoid duplication
$addedIndex = [];
foreach ($reminders as $reminder)
{
$reminderTimestamp = self::getReminderTimestamp(
$eventTimestamp,
$reminder,
$entryFields['TZ_FROM'] ?? null
);
$limitTime = !empty($params['updateRecursive'])
? time() + self::REMINDER_NEXT_DELAY
: time() - self::REMINDER_INACCURACY;
if (
!is_null($reminderTimestamp)
&& !in_array($reminderTimestamp, $addedIndex)
&& $reminderTimestamp >= $limitTime
)
{
$agentParams['index'] = $index++;
if ($reminder['type'] === self::TYPE_SPECIFIC_DATETIME)
{
unset($agentParams['index']);
}
self::AddAgent(CCalendar::Date($reminderTimestamp), $agentParams);
$addedIndex[] = $reminderTimestamp;
}
}
}
}
}
else
{
// Start of the event in server timezone
$eventTimestamp = $entryFields['DATE_FROM_TS_UTC'] + date("Z", $entryFields['DATE_FROM_TS_UTC']);
$index = 0;
// List of added timestamps of reminders to avoid duplication
$addedIndex = [];
foreach ($reminders as $reminder)
{
$reminderTimestamp = self::getReminderTimestamp(
$eventTimestamp,
$reminder,
$entryFields['TZ_FROM'] ?? null
);
if (
!is_null($reminderTimestamp)
&& !in_array($reminderTimestamp, $addedIndex)
&& $reminderTimestamp >= time() + self::REMINDER_INACCURACY
)
{
$agentParams['index'] = $index++;
self::AddAgent(CCalendar::Date($reminderTimestamp), $agentParams);
$addedIndex[] = $reminderTimestamp;
}
}
}
}
}