:-y

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

{
"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();
 
?>


New comment







 __   __  ____ ____  __  
/  \ /  \    / |    /  \ 
  _/ \__/   /  |__  |  | 
 /     /   /      \ |  | 
/___  /   /___ ___/ \__/