Fix handling reminder trigger definition
... and ignore duplicate reminders
This commit is contained in:
parent
ab9f33fbc4
commit
8673bfd15f
1 changed files with 17 additions and 1 deletions
|
@ -498,14 +498,22 @@ abstract class kolab_format_xcal extends kolab_format
|
||||||
$this->obj->setRecurrenceDates($rdates);
|
$this->obj->setRecurrenceDates($rdates);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save alarm
|
// save alarm(s)
|
||||||
$valarms = new vectoralarm;
|
$valarms = new vectoralarm;
|
||||||
|
$valarm_hashes = array();
|
||||||
if ($object['valarms']) {
|
if ($object['valarms']) {
|
||||||
foreach ($object['valarms'] as $valarm) {
|
foreach ($object['valarms'] as $valarm) {
|
||||||
if (!array_key_exists($valarm['action'], $this->alarm_type_map)) {
|
if (!array_key_exists($valarm['action'], $this->alarm_type_map)) {
|
||||||
continue; // skip unknown alarm types
|
continue; // skip unknown alarm types
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get rid of duplicates, some CalDAV clients can set them
|
||||||
|
$hash = serialize($valarm);
|
||||||
|
if (in_array($hash, $valarm_hashes)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$valarm_hashes[] = $hash;
|
||||||
|
|
||||||
if ($valarm['action'] == 'EMAIL') {
|
if ($valarm['action'] == 'EMAIL') {
|
||||||
$recipients = new vectorcontactref;
|
$recipients = new vectorcontactref;
|
||||||
foreach (($valarm['attendees'] ?: array($object['_owner'])) as $email) {
|
foreach (($valarm['attendees'] ?: array($object['_owner'])) as $email) {
|
||||||
|
@ -530,7 +538,15 @@ abstract class kolab_format_xcal extends kolab_format
|
||||||
if (is_object($valarm['trigger']) && $valarm['trigger'] instanceof DateTime) {
|
if (is_object($valarm['trigger']) && $valarm['trigger'] instanceof DateTime) {
|
||||||
$alarm->setStart(self::get_datetime($valarm['trigger'], new DateTimeZone('UTC')));
|
$alarm->setStart(self::get_datetime($valarm['trigger'], new DateTimeZone('UTC')));
|
||||||
}
|
}
|
||||||
|
else if (preg_match('/^@([0-9]+)$/', $valarm['trigger'], $m)) {
|
||||||
|
$alarm->setStart(self::get_datetime($m[1], new DateTimeZone('UTC')));
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
|
// Support also interval in format without PT, e.g. -10M
|
||||||
|
if (preg_match('/^([-+]*)([0-9]+[DHMS])$/', strtoupper($valarm['trigger']), $m)) {
|
||||||
|
$valarm['trigger'] = $m[1] . ($m[2][strlen($m[2])-1] == 'D' ? 'P' : 'PT') . $m[2];
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$period = new DateInterval(preg_replace('/[^0-9PTWDHMS]/', '', $valarm['trigger']));
|
$period = new DateInterval(preg_replace('/[^0-9PTWDHMS]/', '', $valarm['trigger']));
|
||||||
$duration = new Duration($period->d, $period->h, $period->i, $period->s, $valarm['trigger'][0] == '-');
|
$duration = new Duration($period->d, $period->h, $period->i, $period->s, $valarm['trigger'][0] == '-');
|
||||||
|
|
Loading…
Add table
Reference in a new issue