diff --git a/main/calendar/agenda.php b/main/calendar/agenda.php index e22e8f3439..8d16671df4 100755 --- a/main/calendar/agenda.php +++ b/main/calendar/agenda.php @@ -276,6 +276,10 @@ if ($allowToEdit) { $attachmentList = $sendAttachment ? $_FILES : null; $attachmentCommentList = $values['legend'] ?? ''; $comment = $values['comment'] ?? ''; + $notificationCount = $_REQUEST['notification_count'] ?? []; + $notificationPeriod = $_REQUEST['notification_period'] ?? []; + + $reminders = $notificationCount ? array_map(null, $notificationCount, $notificationPeriod) : []; // This is a sub event. Delete the current and create another BT#7803 if (!empty($event['parent_event_id'])) { @@ -295,7 +299,8 @@ if ($allowToEdit) { $comment, '', $values['invitees'] ?? [], - $values['collective'] ?? false + $values['collective'] ?? false, + $reminders ); $message = Display::return_message(get_lang('Updated'), 'confirmation'); @@ -323,7 +328,8 @@ if ($allowToEdit) { true, 0, $values['invitees'] ?? [], - $values['collective'] ?? false + $values['collective'] ?? false, + $reminders ); if (!empty($values['repeat']) && !empty($eventId)) { diff --git a/main/inc/lib/agenda.lib.php b/main/inc/lib/agenda.lib.php index 1ad63df7df..129bc45f7a 100644 --- a/main/inc/lib/agenda.lib.php +++ b/main/inc/lib/agenda.lib.php @@ -497,6 +497,16 @@ class Agenda $em->flush(); } + public function removeReminders(int $eventId) + { + Database::getManager() + ->createQuery( + 'DELETE FROM ChamiloCoreBundle:AgendaReminder ar WHERE ar.eventId = :eventId AND ar.type = :type' + ) + ->setParameters(['eventId' => $eventId, 'type' => $this->type]) + ->execute(); + } + /** * @param int $eventId * @param int $courseId @@ -799,7 +809,8 @@ class Agenda $updateContent = true, $authorId = 0, array $inviteesList = [], - bool $isCollective = false + bool $isCollective = false, + array $reminders = [] ) { $id = (int) $id; $start = api_get_utc_datetime($start); @@ -1117,6 +1128,14 @@ class Agenda } break; } + + if (api_get_configuration_value('agenda_reminders')) { + $this->removeReminders($id); + + foreach ($reminders as $reminder) { + $this->addReminder($id, $reminder[0], $reminder[1]); + } + } } /** @@ -2482,6 +2501,41 @@ class Agenda return $sendTo; } + public function getEventReminders($eventId): array + { + $em = Database::getManager(); + $remindersRepo = $em->getRepository('ChamiloCoreBundle:AgendaReminder'); + + return $remindersRepo->findBy(['eventId' => $eventId, 'type' => $this->type]); + } + + public function parseEventReminders(array $eventReminders): array + { + return array_map( + function (AgendaReminder $reminder) { + $interval = $reminder->getDateInterval(); + + $reminderInfo = [ + 'id' => $reminder->getId(), + 'type' => $reminder->getType(), + 'sent' => $reminder->isSent(), + 'date_interval' => [$interval->format('%a'), 'd'], + ]; + + if ($interval->i) { + $reminderInfo['date_interval'] = [$interval->i, 'i']; + } elseif ($interval->h) { + $reminderInfo['date_interval'] = [$interval->h, 'h']; + } elseif ($interval->d) { + $reminderInfo['date_interval'] = [$interval->d, 'd']; + } + + return $reminderInfo; + }, + $eventReminders + ); + } + /** * @param array $params * @@ -2741,9 +2795,16 @@ class Agenda $params['collective'] = $isCollective; } - if (api_get_configuration_value('agenda_reminders') && 'add' === $params['action']) { - $form->addHtml('
'); + if (api_get_configuration_value('agenda_reminders')) { + $form->addHtml('
'); + + if ($id) { + $this->addFieldsForRemindersToForm($id, $form); + } + + $form->addHtml('
'); $form->addButton('add_notification', get_lang('AddNotification'), 'bell-o')->setType('button'); + $form->addHtml('
'); } if ($id) { @@ -2763,6 +2824,51 @@ class Agenda return $form; } + public function addFieldsForRemindersToForm(int $eventId, FormValidator $form) + { + $remindersList = $this->parseEventReminders( + $this->getEventReminders($eventId) + ); + + foreach ($remindersList as $reminderInfo) { + $form->addHtml('
'); + $form + ->addNumeric('notification_count[]', '', ['step' => 1, 'min' => 0]) + ->setValue($reminderInfo['date_interval'][0]) + ; + $form + ->addSelect( + 'notification_period[]', + '', + [ + 'i' => get_lang('Minutes'), + 'h' => get_lang('Hours'), + 'd' => get_lang('Days'), + 'w' => get_lang('Weeks'), + ] + ) + ->setValue($reminderInfo['date_interval'][1]) + ; + $form->addHtml('

'.get_lang('Before').'

'); + $form->addHtml( + '
' + .'' + .'
' + ); + $form->addHtml('
'); + } + + $renderer = $form->defaultRenderer(); + $renderer->setElementTemplate( + '
{element}
', + 'notification_count[]' + ); + $renderer->setElementTemplate( + '
{element}
', + 'notification_period[]' + ); + } + /** * @param FormValidator $form * @param array $sendTo array('everyone' => false, 'users' => [1, 2], 'groups' => [3, 4])