Développement- Fichiers ICS et Calendrier – Partie 2

Série de 3 articles sur les fichiers ICS : (1) Définition; (2) Création et Partage; (3) Automatisation Excel > Outlook

Partie 2: Création et partage

Il y a des évènements qui sont importants et pour les garder en mémoire, ou plutôt dans la mémoire de nos assistants numériques, il faut cliquer sur ‘nouveau rendez-vous’ choisir une date de début, de fin, un texte, cliquer, cliquer et encore cliquer. J’ai tellement de paramètres à définir que cela me fatigue, mais aussi qu’il faut parfois partager sans pour autant l’entrer dans mon calendrier. Voici donc le générateur ICS

Simple page PHP, qui demande du texte par ligne, bien entendu formaté correctement, et génère en sortie un fichier ICS automatiquement poussé sur le navigateur client.

Fonctionnement simple, basique dont voilà la source :

<?php
 
setlocale(LC_TIME, 'fr_FR'); //setlocale (LC_TIME, 'fr_FR.utf8','fra'); 

 function test_input($data) {
	 // nettoyer le texte qui sera envoyé
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

 date_default_timezone_set('Europe/Paris');
 if (!isset($_POST['date_start'])) {  ?> 
// si le formulaire est vierge.. alors continue
 <!doctype html>
 <html lang="fr">

 <head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 <title>Générateur de fichiers ICS</title>
 <link rel="icon" type="image/x-icon" href="favicon.png">
 </head>
 <body>
 <link rel="stylesheet" href="style.css" />
  <h1>Générateur de fichiers ICS<br> <?
    echo '<form method="post">';
 	echo '<h2>Complétez les champs puis validez<h2>';
	echo "<input class='form-control' type='text' placeholder='".ucfirst(utf8_encode(strftime('%A %d %B %Y, %H:%M'))) ."' readonly>"; 
	echo 'Titre - objet du rendez vous<input type=text id="invalidCheck" required class="form-control" name=titre value="titre">';
	echo 'Début - format Année Mois Jour "T" Heure Minute<input type="text" id="invalidCheck" required class="form-control" name="date_start" value="20221006T100000">';
	echo 'Fin - format Année Mois Jour "T" Heure Minute<input type="text" id="invalidCheck" required class="form-control" name="date_end" value="20221006T110000">';
	echo 'Description - détails sur le rendez-vous<input type="text" id="invalidCheck" class="form-control" name="description" value="description longue">';
	echo 'Emplacement - adresse complète <input type="text" id="invalidCheck" class="form-control" name="emplacement" value="adresse ou lien">';
	echo 'Privé - détails invisibles par les personnes ayant délégation sur votre calendrier <input type="checkbox" id="invalidCheck" class="form-control" name="privat">';
	echo 'Important - rendez vous marqué comme tel <input type="checkbox" id="invalidCheck" class="form-control" name="important">';
?>

 <div class="col-12">  <button class="btn btn-primary" type="submit">Générer</button>  </div>
 </form>
 </body>
</html>
<?php 
}else{
// si le formulaire n'est par vierge.. alors crée le fichier ICS
    $_POST[titre]=test_input($_POST[titre]);
    $_POST[date_start]=test_input($_POST[date_start]);
    $_POST[date_end]=test_input($_POST[date_end]);
    $_POST[emplacement]=test_input($_POST[emplacement]);
    $_POST[description]=test_input($_POST[description]);
    $ics_props =  'BEGIN:VCALENDAR'."\r\n";
    $ics_props .= 'VERSION:2.0'."\r\n";
    $ics_props .= 'PRODID:-//68600.fr//iCal Event Maker'."\r\n";
    $ics_props .= 'CALSCALE:GREGORIAN'."\r\n";
    $ics_props .= 'BEGIN:VTIMEZONE'."\r\n";
    $ics_props .= 'TZID:Europe/Berlin'."\r\n";
    $ics_props .= 'BEGIN:STANDARD'."\r\n";
    $ics_props .= 'TZNAME:CET'."\r\n";
    $ics_props .= 'TZOFFSETFROM:+0200'."\r\n";
    $ics_props .= 'TZOFFSETTO:+0100'."\r\n";
    $ics_props .= 'DTSTART:19701025T030000'."\r\n";
    $ics_props .= 'RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU'."\r\n";
    $ics_props .= 'END:STANDARD'."\r\n";
    $ics_props .= 'BEGIN:DAYLIGHT'."\r\n";
    $ics_props .= 'TZNAME:CEST'."\r\n";
    $ics_props .= 'TZOFFSETFROM:+0100'."\r\n";
    $ics_props .= 'TZOFFSETTO:+0200'."\r\n";
    $ics_props .= 'DTSTART:19700329T020000'."\r\n";
    $ics_props .= 'RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU'."\r\n";
    $ics_props .= 'END:DAYLIGHT'."\r\n";
    $ics_props .= 'END:VTIMEZONE'."\r\n";
    $ics_props .= 'LAST-MODIFIED:20201011T015911Z'."\r\n";
    $ics_props .= 'TZURL:http://tzurl.org/zoneinfo-outlook/Europe/Berlin'."\r\n";
    $ics_props .= 'X-LIC-LOCATION:Europe/Berlin'."\r\n";
    $ics_props .= 'BEGIN:VEVENT'."\r\n";
	if (isset($_POST[privat]))     { $ics_props .= 'CLASS:PRIVATE'."\r\n";}
	if (isset($_POST[important]))  { $ics_props .= 'CATEGORIES:Important'."\r\n";}
	$ics_props .= 'DTSTAMP:20220823T131634Z'."\r\n";
    $ics_props .= 'UID:'.uniqid()."\r\n";
    $ics_props .= 'DTSTART;TZID=Europe/Berlin:'.$_POST[date_start]."\r\n";
    $ics_props .= 'DTEND;TZID=Europe/Berlin:'.$_POST[date_end]."\r\n";
    $ics_props .= 'SUMMARY:'.$_POST[titre]."\r\n";
    $ics_props .= 'DESCRIPTION:'.$_POST[description]."\r\n";
    $ics_props .= 'LOCATION:'.$_POST[emplacement]."\r\n";
    $ics_props .= 'TRANSP:OPAQUE'."\r\n";
    $ics_props .= 'X-MICROSOFT-CDO-BUSYSTATUS:BUSY'."\r\n";
    $ics_props .= 'BEGIN:VALARM'."\r\n";
    $ics_props .= 'ACTION:DISPLAY'."\r\n";
    $ics_props .= 'DESCRIPTION:Reminder'."\r\n";
    $ics_props .= 'TRIGGER:-PT15M'."\r\n";
    $ics_props .= 'END:VALARM'."\r\n";
    $ics_props .= 'END:VEVENT'."\r\n";
    $ics_props .= 'END:VCALENDAR'."\r\n";
// créee le fichier
    $uniqueFileName = uniqid(mt_rand(), true) . '.ics';

// affiche le fichier ICS et force le navigateur à le télécharger

    header('Content-type: text/calendar; charset=utf-8');
    header("Content-Disposition: attachment; filename=".$uniqueFileName);
    echo $ics_props;	
}

?> 

Si tout va bien, vous devriez pouvoir générer vos fichiers rdv et les partager !

Mais cela n’est pas tout : ceux qui me connaissent savent que je ne jure que par Excel. C’est mon outil de prédilection. Voyons comment utiliser Excel comme source > Suite Partie 3