Skip to content

Instantly share code, notes, and snippets.

@portapipe
Last active October 30, 2023 12:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save portapipe/25306c4260409ea023d1fb2b3f9fbecb to your computer and use it in GitHub Desktop.
Save portapipe/25306c4260409ea023d1fb2b3f9fbecb to your computer and use it in GitHub Desktop.
Creare file calendari .ics tramite PHP - File libreria (ics.php) e file calendario (calendar.php)
<?php
/*
* Libreria per la creazione di calendari .ics (Apple e Google calendar per dirne alcuni)
* Allego il file ics.php per la creazione
* Autore del binomio: portapipe
* Codice su Github Gist: https://gist.github.com/portapipe/25306c4260409ea023d1fb2b3f9fbecb
*/
$time = time();
//Modifica i dati seguenti in base alle tue esigenze
$setup = array(
//Titolo del caledario (nel caso ci si iscriva)
"title"=>"Cal Esempio",
//Autore del calendario
"author"=>"portapipe",
//Descrizione del calendario
"description"=>"Il mio calendario di esempio",
//Nome del file (default 'calendar')
"filename"=>"ilMioCalendario"
);
//Ripeti da qui:
$eventi[] =array(
//'uid' => '123', NON SERVE, E' AUTOMATICO MA E' PREDISPOSTO
'summary' => 'Esempio di calendario',
'description' => 'Questo evento sarà sempre appena terminato',
'start' => new DateTime('@'.($time - (60*60))),
'end' => new DateTime('@'.$time),
'url' => 'http://google.it',
'location' => 'Milano, Italia'
);
//a qui per creare un nuovo evento (cambiando solo i dati).
$eventi[] = array(
'summary' => 'Sarà sempre tra un\'ora',
'description' => 'Questo evento sarà sempre tra un\'ora!',
'start' => new DateTime('@'.($time + (60*60) )),
'end' => new DateTime('@'.($time + (60*60) + 9000)),
'location' => 'Via Torino 14, Milano, Italia',
'url' => 'http://portapipe.wordpress.com'
);
/* DA QUI NON E' NECESSARIO MODIFICARE */
include("ics.php");
foreach($eventi as $v){
$e[] = new CalendarEvent($v);
}
$calendar = new Calendar($setup);
$calendar->events = $e;
$calendar->generateDownload();
?>
<?php
/*
* Libreria per la creazione di calendari .ics (Apple e Google calendar per dirne alcuni)
* Allego il file calendar.php per la creazione
* Autore del binomio: portapipe
* Codice su Github Gist: https://gist.github.com/portapipe/25306c4260409ea023d1fb2b3f9fbecb
*/
//Original code by pamelafox-coursera
class CalendarEvent {
/**
*
* The event ID
* @var string
*/
private $uid;
/**
* The event start date
* @var DateTime
*/
private $start;
/**
* The event end date
* @var DateTime
*/
private $end;
/**
*
* The event title
* @var string
*/
private $summary;
/**
* The event description
* @var string
*/
private $description;
/**
* The event location
* @var string
*/
private $location;
public function __construct($parameters) {
/*$parameters = array(
'summary' => 'Untitled Event',
'description' => '',
'location' => ''
);
*/
if (isset($parameters['uid'])) {
$this->uid = $parameters['uid'];
} else {
$this->uid = uniqid(rand(0, getmypid()));
}
$this->start = $parameters['start'];
$this->end = $parameters['end'];
$this->summary = $parameters['summary'];
$this->description = (isset($parameters['description'])?$parameters['description']:'');
$this->location = (isset($parameters['location'])?$parameters['location']:'');
$this->url = (isset($parameters['url'])?$parameters['url']:'');
return $this;
}
/**
* Get the start time set for the even
* @return string
*/
private function formatDate($date) {
return $date->format("Ymd\THis\Z");
}
/* Escape commas, semi-colons, backslashes.
http://stackoverflow.com/questions/1590368/should-a-colon-character-be-escaped-in-text-values-in-icalendar-rfc2445
*/
private function formatValue($str) {
return addcslashes($str, ",\\;");
}
public function generateString() {
$created = new DateTime();
$content = '';
$id = md5(uniqid(mt_rand(), true));
$content = "BEGIN:VEVENT\r\n"
. "UID:{$id}\r\n"//$this->uid
. "DTSTART:{$this->formatDate($this->start)}\r\n"
. "DTEND:{$this->formatDate($this->end)}\r\n"
. "DTSTAMP:{$this->formatDate($this->start)}\r\n"
. "CREATED:{$this->formatDate($created)}\r\n"
. "DESCRIPTION:{$this->formatValue($this->description)}\r\n"
. "LAST-MODIFIED:{$this->formatDate($this->start)}\r\n"
. "LOCATION:{$this->location}\r\n"
. "URL:{$this->url}\r\n"
. "SUMMARY:{$this->formatValue($this->summary)}\r\n"
. "SEQUENCE:0\r\n"
. "STATUS:CONFIRMED\r\n"
. "TRANSP:OPAQUE\r\n"
. "END:VEVENT\r\n";
return $content;
}
}
class Calendar {
public $events;
public $title = "";
public $author = "";
public $description = "";
public $filename = "calendar";
public function __construct($parameters) {
/*
$parameters = array(
'events' => array(),
'title' => 'Calendar',
'author' => 'Calender Generator'
);
*/
$this->events = @$parameters['events'];
$this->title = $parameters['title'];
if(isset($parameters['description']))
$this->description = $parameters['description'];
if(isset($parameters['author']))
$this->author = $parameters['author'];
if(isset($parameters['filename']))
$this->filename = $parameters['filename'];
}
/**
*
* Call this function to download the invite.
*/
public function generateDownload() {
$generated = $this->generateString();
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT' ); //date in the past
header('Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' ); //tell it we just updated
header('Cache-Control: no-store, no-cache, must-revalidate' ); //force revaidation
header('Cache-Control: post-check=0, pre-check=0', false );
header('Pragma: no-cache' );
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename="'.$this->filename.'.ics"');
header("Content-Description: File Transfer");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . strlen($generated));
print $generated;
}
/**
*
* The function generates the actual content of the ICS
* file and returns it.
*
* @return string|bool
*/
public function generateString() {
$content = "BEGIN:VCALENDAR\r\n"
. "PRODID:-//" . $this->author . "//NONSGML//EN\r\n"
. "VERSION:2.0\r\n"
. "CALSCALE:GREGORIAN\r\n"
. "METHOD:PUBLISH\r\n"
. "X-WR-CALNAME:" . $this->title . "\r\n"
. "X-WR-TIMEZONE:Europe/Rome\r\n"
. "X-WR-CALDESC:" . $this->description . "\r\n";
foreach($this->events as $event) {
$content .= $event->generateString();
}
$content .= "END:VCALENDAR";
return $content;
}
}
@StefanoBavota
Copy link

ciao, io ho una funzione che mi restituisce tutti gli eventi sul db, posso passarli uno ad uno alla funzione per creare il calendario? così da esportarmi tutti gli eventi in un colpo solo

@portapipe
Copy link
Author

ciao, io ho una funzione che mi restituisce tutti gli eventi sul db, posso passarli uno ad uno alla funzione per creare il calendario? così da esportarmi tutti gli eventi in un colpo solo

Certamente! In linea 22 del file calendar.php se vedi c'è "Ripeti da qui". Se prima metti un ciclo foreach dei tuoi eventi su db, crei un array con tutti i dati che ti servono. Il resto fa da solo ;)

@MizzicaPappara
Copy link

Ciao, bella questa libreria. L'ho provata al volo su MAMP con php 7.4.2 ma mi dava errore (senza visualizzarlo ovviamente). Alla fine ho capito che, nel file calendar.php, spostando $time = time(); dalla riga 46 alla riga 22 tutto funziona alla perfezione. Magari online o con altre versioni di php funziona così com'è. Saluti

@portapipe
Copy link
Author

Ciao, bella questa libreria. L'ho provata al volo su MAMP con php 7.4.2 ma mi dava errore (senza visualizzarlo ovviamente). Alla fine ho capito che, nel file calendar.php, spostando $time = time(); dalla riga 46 alla riga 22 tutto funziona alla perfezione. Magari online o con altre versioni di php funziona così com'è. Saluti

Ciao @MizzicaPappara grazie per la precisazione, in effetti non so perché si trovava così in basso, ho modificato il codice in base alla tua segnalazione!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment