Filtre calendrier ICS
jeudi 27 juin 2019 à 19:06
Quand l'administration utilise Google Calendar pour gérer les plannings avec un seul calendrier, ce n'est pas simple d'ajouter juste les événements qui nous intéressent.
On m'a demandé si c'était possible et après une rapide recherche, je n'ai rien trouvé qui permettait de faire ça : je n'ai pas réussi à utiliser https://icalfilter.com/
Je serai curieux de savoir si c'est possible de le faire avec un https://framagenda.org mais en utilisant un parseur et un formatteur PHP c'est plutôt simple.
Si ça peut être utile à d'autres.
Dans le fichier composer.json
On installe tout ce qu'il faut avec
Dans un fichier index.php
On m'a demandé si c'était possible et après une rapide recherche, je n'ai rien trouvé qui permettait de faire ça : je n'ai pas réussi à utiliser https://icalfilter.com/
Je serai curieux de savoir si c'est possible de le faire avec un https://framagenda.org mais en utilisant un parseur et un formatteur PHP c'est plutôt simple.
Si ça peut être utile à d'autres.
Dans le fichier composer.json
{
"require": {
"johngrogg/ics-parser": "^2",
"jsvrcek/ics": "*@dev"
}
}
On installe tout ce qu'il faut avec
composer install
Dans un fichier index.php
<?php
require_once 'vendor/autoload.php';
use ICal\ICal;
use Jsvrcek\ICS\Model\Calendar;
use Jsvrcek\ICS\Model\CalendarEvent;
use Jsvrcek\ICS\Model\Relationship\Attendee;
use Jsvrcek\ICS\Model\Relationship\Organizer;
use Jsvrcek\ICS\Utility\Formatter;
use Jsvrcek\ICS\CalendarStream;
use Jsvrcek\ICS\CalendarExport;
try {
$ical = new ICal('https://raw.githubusercontent.com/u01jmg3/ics-parser/master/examples/ICal.ics', array(
'defaultSpan' => 2, // Default value
'defaultTimeZone' => 'UTC',
'defaultWeekStart' => 'MO', // Default value
'disableCharacterReplacement' => false, // Default value
'filterDaysAfter' => null, // Default value
'filterDaysBefore' => null, // Default value
'replaceWindowsTimeZoneIds' => false, // Default value
'skipRecurrence' => false, // Default value
'useTimeZoneWithRRules' => false, // Default value
));
} catch (\Exception $e) {
die($e);
}
$forceTimeZone = false;
$newCal = new Calendar();
$newCal->setProdId($ical->cal['VCALENDAR']['PRODID']);
$newCal->setVersion($ical->cal['VCALENDAR']['VERSION']);
$newCal->setName($ical->cal['VCALENDAR']['X-WR-CALNAME']);
$newCal->setCalendarScale($ical->cal['VCALENDAR']['CALSCALE']);
$newCal->setMethod($ical->cal['VCALENDAR']['METHOD']);
$newCal->setCustomHeaders(["X-WR-TIMEZONE" => $ical->cal['VCALENDAR']['X-WR-TIMEZONE']]);
$events = $ical->events();
foreach ($events as $event) {
// add custom filter here
if (preg_match('/.*DST*/', $event->summary)) {
$newEvent = new CalendarEvent();
$newEvent->setStart(new DateTime($event->dtstart));
$newEvent->setEnd(new DateTime($event->dtend));
$newEvent->setSummary($event->summary);
$newEvent->setUid($event->uid);
$newEvent->setStatus($event->status);
$newCal->addEvent($newEvent);
}
}
$calendarExport = new CalendarExport(new CalendarStream, new Formatter());
$calendarExport->addCalendar($newCal);
header('Content-type: text/calendar; charset=utf-8');
echo $calendarExport->getStream();
?>