<?php namespace Sabre\VObject\Property; use Sabre\VObject; /** * Multi-DateTime property * * This element is used for iCalendar properties such as the EXDATE property. * It basically provides a few helper functions that make it easier to deal * with these. It supports both DATE-TIME and DATE values. * * In order to use this correctly, you must call setDateTimes and getDateTimes * to retrieve and modify dates respectively. * * If you use the 'value' or properties directly, this object does not keep * reference and results might appear incorrectly. * * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class MultiDateTime extends VObject\Property { /** * DateTime representation * * @var DateTime[] */ protected $dateTimes; /** * dateType * * This is one of the Sabre\VObject\Property\DateTime constants. * * @var int */ protected $dateType; /** * Updates the value * * @param array $dt Must be an array of DateTime objects. * @param int $dateType * @return void */ public function setDateTimes(array $dt, $dateType = VObject\Property\DateTime::LOCALTZ) { foreach($dt as $i) if (!$i instanceof \DateTime) throw new \InvalidArgumentException('You must pass an array of DateTime objects'); $this->offsetUnset('VALUE'); $this->offsetUnset('TZID'); switch($dateType) { case DateTime::LOCAL : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd\\THis'); } $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE-TIME'); break; case DateTime::UTC : $val = array(); foreach($dt as $i) { $i->setTimeZone(new \DateTimeZone('UTC')); $val[] = $i->format('Ymd\\THis\\Z'); } $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE-TIME'); break; case DateTime::LOCALTZ : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd\\THis'); } $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE-TIME'); $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName()); break; case DateTime::DATE : $val = array(); foreach($dt as $i) { $val[] = $i->format('Ymd'); } $this->setValue(implode(',',$val)); $this->offsetSet('VALUE','DATE'); break; default : throw new \InvalidArgumentException('You must pass a valid dateType constant'); } $this->dateTimes = $dt; $this->dateType = $dateType; } /** * Returns the current DateTime value. * * If no value was set, this method returns null. * * @return array|null */ public function getDateTimes() { if ($this->dateTimes) return $this->dateTimes; $dts = array(); if (!$this->value) { $this->dateTimes = null; $this->dateType = null; return null; } foreach(explode(',',$this->value) as $val) { list( $type, $dt ) = DateTime::parseData($val, $this); $dts[] = $dt; $this->dateType = $type; } $this->dateTimes = $dts; return $this->dateTimes; } /** * Returns the type of Date format. * * This method returns one of the format constants. If no date was set, * this method will return null. * * @return int|null */ public function getDateType() { if ($this->dateType) return $this->dateType; if (!$this->value) { $this->dateTimes = null; $this->dateType = null; return null; } $dts = array(); foreach(explode(',',$this->value) as $val) { list( $type, $dt ) = DateTime::parseData($val, $this); $dts[] = $dt; $this->dateType = $type; } $this->dateTimes = $dts; return $this->dateType; } }