316 lines
7.4 KiB
PHP
316 lines
7.4 KiB
PHP
<?php
|
|
ini_set('display_errors', '1');
|
|
ini_set('date.timezone', 'Europe/Berlin');
|
|
|
|
class Event
|
|
{
|
|
// phpcs:disable Generic.Arrays.DisallowLongArraySyntax
|
|
|
|
const HTML_TEMPLATE = '<p>%s: %s</p>';
|
|
|
|
public $category;
|
|
|
|
public $start = '';
|
|
public $startInt = 0;
|
|
|
|
public $end = '';
|
|
public $endInt = 0;
|
|
|
|
public $wholeDay = false;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/summary.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $summary;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/dtstart.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $dtstart;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/dtend.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $dtend;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/duration.html
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $duration;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/dtstamp.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $dtstamp;
|
|
|
|
/**
|
|
* When the event starts, represented as a timezone-adjusted string
|
|
*
|
|
* @var string
|
|
*/
|
|
public $dtstart_tz;
|
|
|
|
/**
|
|
* When the event ends, represented as a timezone-adjusted string
|
|
*
|
|
* @var string
|
|
*/
|
|
public $dtend_tz;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/uid.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $uid;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/created.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $created;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/lastModified.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $last_modified;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/description.html
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $description;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/location.html
|
|
*
|
|
* @var string|null
|
|
*/
|
|
public $location;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/sequence.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $sequence;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/status.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $status;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/transp.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $transp;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/organizer.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $organizer;
|
|
|
|
/**
|
|
* https://www.kanzaki.com/docs/ical/attendee.html
|
|
*
|
|
* @var string
|
|
*/
|
|
public $attendee;
|
|
|
|
/**
|
|
* Manage additional properties
|
|
*
|
|
* @var array<string, mixed>
|
|
*/
|
|
public $additionalProperties = array();
|
|
|
|
/**
|
|
* Creates the Event object
|
|
*
|
|
* @param array $data
|
|
* @return void
|
|
*/
|
|
public function __construct(array $data = array())
|
|
{
|
|
foreach ($data as $key => $value) {
|
|
if ($key == 'DTSTART_array' || $key == 'DTEND_array') {
|
|
$timeZone = 'Europe/Berlin';
|
|
if (isset($value[0]['TZID'])) {
|
|
$timeZone = $value[0]['TZID'];
|
|
}
|
|
|
|
$dateString = $value[1];
|
|
|
|
$dateTime = \DateTime::createFromFormat('Ymd\THis', $dateString, new \DateTimeZone($timeZone));
|
|
if (false === $dateTime) {
|
|
$this->wholeDay = true;
|
|
$dateTime = \DateTime::createFromFormat('Ymd', $dateString, new \DateTimeZone($timeZone));
|
|
}
|
|
|
|
$dateTime->setTimezone(new \DateTimeZone('UTC'));
|
|
if ($key == 'DTSTART_array') {
|
|
$this->start = $dateTime->format('d.m.Y H:i:s');
|
|
$this->startInt = $dateTime->getTimestamp();
|
|
} else {
|
|
$this->end = $dateTime->format('d.m.Y H:i:s');
|
|
$this->endInt = $dateTime->getTimestamp();
|
|
}
|
|
} else {
|
|
$variable = self::snakeCase($key);
|
|
if (property_exists($this, $variable)) {
|
|
$this->{$variable} = $this->prepareData($value);
|
|
} elseif ($variable == 'categories') {
|
|
$this->category = $value;
|
|
} else {
|
|
$this->additionalProperties[$variable] = $this->prepareData($value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Magic getter method
|
|
*
|
|
* @param string $additionalPropertyName
|
|
* @return mixed
|
|
*/
|
|
public function __get($additionalPropertyName)
|
|
{
|
|
if (array_key_exists($additionalPropertyName, $this->additionalProperties)) {
|
|
return $this->additionalProperties[$additionalPropertyName];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Magic isset method
|
|
*
|
|
* @param string $name
|
|
* @return boolean
|
|
*/
|
|
public function __isset($name)
|
|
{
|
|
return is_null($this->$name) === false;
|
|
}
|
|
|
|
/**
|
|
* Prepares the data for output
|
|
*
|
|
* @param mixed $value
|
|
* @return mixed
|
|
*/
|
|
protected function prepareData($value)
|
|
{
|
|
if (is_string($value)) {
|
|
return stripslashes(trim(str_replace('\n', "\n", $value)));
|
|
}
|
|
|
|
if (is_array($value)) {
|
|
return array_map(function ($value) {
|
|
return $this->prepareData($value);
|
|
}, $value);
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
|
|
public function getEventTime() {
|
|
$dateTime = explode(' ', $this->start);
|
|
|
|
if ($this->wholeDay) {
|
|
return null;
|
|
}
|
|
|
|
if (isset($dateTime[1])) {
|
|
$time = explode(':', $dateTime[1]);
|
|
return $time[0] . ':' . $time[1] . ' Uhr';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Returns Event data excluding anything blank
|
|
* within an HTML template
|
|
*
|
|
* @param string $html HTML template to use
|
|
* @return string
|
|
*/
|
|
public function printData($html = self::HTML_TEMPLATE)
|
|
{
|
|
$data = array(
|
|
'SUMMARY' => $this->summary,
|
|
'start' => $this->start,
|
|
'end' => $this->end,
|
|
'DTEND' => $this->dtend,
|
|
'DTSTART_TZ' => $this->dtstart_tz,
|
|
'DTEND_TZ' => $this->dtend_tz,
|
|
'DURATION' => $this->duration,
|
|
'DTSTAMP' => $this->dtstamp,
|
|
'UID' => $this->uid,
|
|
'CREATED' => $this->created,
|
|
'LAST-MODIFIED' => $this->last_modified,
|
|
'DESCRIPTION' => $this->description,
|
|
'LOCATION' => $this->location,
|
|
'SEQUENCE' => $this->sequence,
|
|
'STATUS' => $this->status,
|
|
'TRANSP' => $this->transp,
|
|
'ORGANISER' => $this->organizer,
|
|
'ATTENDEE(S)' => $this->attendee,
|
|
'CATEGORIES' => $this->category,
|
|
);
|
|
|
|
// Remove any blank values
|
|
$data = array_filter($data);
|
|
|
|
$output = '';
|
|
foreach ($data as $key => $value) {
|
|
$output .= sprintf($html, $key, $value);
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
/**
|
|
* Converts the given input to snake_case
|
|
*
|
|
* @param string $input
|
|
* @param string $glue
|
|
* @param string $separator
|
|
* @return string
|
|
*/
|
|
protected static function snakeCase($input, $glue = '_', $separator = '-')
|
|
{
|
|
$inputSplit = preg_split('/(?<=[a-z])(?=[A-Z])/x', $input);
|
|
|
|
if ($inputSplit === false) {
|
|
return $input;
|
|
}
|
|
|
|
$inputSplit = implode($glue, $inputSplit);
|
|
$inputSplit = str_replace($separator, $glue, $inputSplit);
|
|
|
|
return strtolower($inputSplit);
|
|
}
|
|
}
|