/** * get calendar property value/params * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.21.09 - 2015-03-29 * @param string $propName * @param int $propix specific property in case of multiply occurences * @param bool $inclParam * @uses vcalendar::$propix * @uses vcalendar::$components * @uses calendarComponent::$objName * @uses iCalUtilityFunctions::$vComps * @uses iCalUtilityFunctions::$mProps1 * @uses calendarComponent::_getProperties() * @uses calendarComponent::getProperty() * @uses iCalUtilityFunctions::_geo2str2() * @uses iCalUtilityFunctions::$geoLatFmt * @uses iCalUtilityFunctions::$geoLongFmt * @uses iCalUtilityFunctions::$fmt * @uses vcalendar::$calscale * @uses vcalendar::$method * @uses vcalendar::$prodid * @uses vcalendar::_makeProdid() * @uses vcalendar::$version * @uses vcalendar::$xprop * @return mixed */ function getProperty($propName = FALSE, $propix = FALSE, $inclParam = FALSE) { $propName = $propName ? strtoupper($propName) : 'X-PROP'; if ('X-PROP' == $propName) { if (empty($propix)) { $propix = isset($this->propix[$propName]) ? $this->propix[$propName] + 2 : 1; } $this->propix[$propName] = --$propix; } switch ($propName) { case 'ATTENDEE': case 'CATEGORIES': case 'CONTACT': case 'DTSTART': case 'GEOLOCATION': case 'LOCATION': case 'ORGANIZER': case 'PRIORITY': case 'RESOURCES': case 'STATUS': case 'SUMMARY': case 'RECURRENCE-ID-UID': case 'RELATED-TO': case 'R-UID': case 'UID': case 'URL': $output = array(); foreach ($this->components as $cix => $component) { if (!in_array($component->objName, iCalUtilityFunctions::$vComps)) { continue; } if (in_array($propName, iCalUtilityFunctions::$mProps1)) { $component->_getProperties($propName, $output); continue; } elseif (3 < strlen($propName) && 'UID' == substr($propName, -3)) { if (FALSE !== ($content = $component->getProperty('RECURRENCE-ID'))) { $content = $component->getProperty('UID'); } } elseif ('GEOLOCATION' == $propName) { $content = FALSE === ($loc = $component->getProperty('LOCATION')) ? '' : $loc . ' '; if (FALSE === ($geo = $component->getProperty('GEO'))) { continue; } $content .= iCalUtilityFunctions::_geo2str2($geo['latitude'], iCalUtilityFunctions::$geoLatFmt) . iCalUtilityFunctions::_geo2str2($geo['longitude'], iCalUtilityFunctions::$geoLongFmt) . '/'; } elseif (FALSE === ($content = $component->getProperty($propName))) { continue; } if (FALSE === $content || empty($content)) { continue; } elseif (is_array($content)) { if (isset($content['year'])) { $key = sprintf(iCalUtilityFunctions::$fmt['Ymd'], (int) $content['year'], (int) $content['month'], (int) $content['day']); if (!isset($output[$key])) { $output[$key] = 1; } else { $output[$key] += 1; } } else { foreach ($content as $partValue => $partCount) { if (!isset($output[$partValue])) { $output[$partValue] = $partCount; } else { $output[$partValue] += $partCount; } } } } elseif (!isset($output[$content])) { $output[$content] = 1; } else { $output[$content] += 1; } } // end foreach ( $this->components as $cix => $component) if (!empty($output)) { ksort($output); } return $output; break; case 'CALSCALE': return !empty($this->calscale) ? $this->calscale : FALSE; break; case 'METHOD': return !empty($this->method) ? $this->method : FALSE; break; case 'PRODID': if (empty($this->prodid)) { $this->_makeProdid(); } return $this->prodid; break; case 'VERSION': return !empty($this->version) ? $this->version : FALSE; break; default: if ($propName != 'X-PROP') { if (!isset($this->xprop[$propName])) { return FALSE; } return $inclParam ? array($propName, $this->xprop[$propName]) : array($propName, $this->xprop[$propName]['value']); } else { if (empty($this->xprop)) { return FALSE; } $xpropno = 0; foreach ($this->xprop as $xpropkey => $xpropvalue) { if ($propix == $xpropno) { return $inclParam ? array($xpropkey, $this->xprop[$xpropkey]) : array($xpropkey, $this->xprop[$xpropkey]['value']); } else { $xpropno++; } } unset($this->propix[$propName]); return FALSE; // not found ?? } } return FALSE; }
/** * get component property value/params * * if property has multiply values, consequtive function calls are needed * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.21.13 - 2015-03-29 * @param string $propName * @param int $propix specific property in case of multiply occurences * @param bool $inclParam * @param bool $specform * @uses calendarComponent::getProperty() * @uses iCalUtilityFunctions::_geo2str2() * @uses iCalUtilityFunctions::$geoLatFmt * @uses iCalUtilityFunctions::$geoLongFmt * @uses calendarComponent::_notExistProp() * @uses iCalUtilityFunctions::$mProps2 * @uses calendarComponent::$propix * @uses calendarComponent::$action * @uses calendarComponent::$attendee * @uses calendarComponent::$categories * @uses calendarComponent::$class * @uses calendarComponent::$comment * @uses calendarComponent::$completed * @uses calendarComponent::$contact * @uses calendarComponent::$created * @uses calendarComponent::$description * @uses calendarComponent::$dtend * @uses iCalUtilityFunctions::$miscComps * @uses calendarComponent::$dtstamp * @uses calendarComponent::_makeDtstamp() * @uses calendarComponent::$dtstart * @uses calendarComponent::$due * @uses calendarComponent::$duration * @uses iCalUtilityFunctions::_duration2date() * @uses calendarComponent::$exdate * @uses calendarComponent::$exrule * @uses calendarComponent::$freebusy * @uses calendarComponent::$geo * @uses calendarComponent::$lastmodified * @uses calendarComponent::$location * @uses calendarComponent::$organizer * @uses calendarComponent::$percentcomplete * @uses calendarComponent::$priority * @uses calendarComponent::$rdate * @uses calendarComponent::$recurrenceid * @uses calendarComponent::$relatedto * @uses calendarComponent::$repeat * @uses calendarComponent::$requeststatus * @uses calendarComponent::$resources * @uses calendarComponent::$rrule * @uses calendarComponent::$sequence * @uses calendarComponent::$status * @uses calendarComponent::$summary * @uses calendarComponent::$transp * @uses calendarComponent::$trigger * @uses calendarComponent::$tzid * @uses calendarComponent::$tzname * @uses calendarComponent::$tzoffsetfrom * @uses calendarComponent::$tzoffsetto * @uses calendarComponent::$tzurl * @uses calendarComponent::$uid * @uses calendarComponent::$objName * @uses calendarComponent::_makeuid() * @uses calendarComponent::$url * @uses calendarComponent::$xprop * @return mixed */ function getProperty($propName = FALSE, $propix = FALSE, $inclParam = FALSE, $specform = FALSE) { if ('GEOLOCATION' == strtoupper($propName)) { $content = FALSE === ($loc = $this->getProperty('LOCATION')) ? '' : $loc . ' '; if (FALSE === ($geo = $this->getProperty('GEO'))) { return FALSE; } return $content . iCalUtilityFunctions::_geo2str2($geo['latitude'], iCalUtilityFunctions::$geoLatFmt) . iCalUtilityFunctions::_geo2str2($geo['longitude'], iCalUtilityFunctions::$geoLongFmt) . '/'; } if ($this->_notExistProp($propName)) { return FALSE; } $propName = $propName ? strtoupper($propName) : 'X-PROP'; if (in_array($propName, iCalUtilityFunctions::$mProps2)) { if (empty($propix)) { $propix = isset($this->propix[$propName]) ? $this->propix[$propName] + 2 : 1; } $this->propix[$propName] = --$propix; } switch ($propName) { case 'ACTION': if (isset($this->action['value'])) { return $inclParam ? $this->action : $this->action['value']; } break; case 'ATTACH': $ak = is_array($this->attach) ? array_keys($this->attach) : array(); while (is_array($this->attach) && !isset($this->attach[$propix]) && 0 < count($this->attach) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->attach[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->attach[$propix] : $this->attach[$propix]['value']; break; case 'ATTENDEE': $ak = is_array($this->attendee) ? array_keys($this->attendee) : array(); while (is_array($this->attendee) && !isset($this->attendee[$propix]) && 0 < count($this->attendee) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->attendee[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->attendee[$propix] : $this->attendee[$propix]['value']; break; case 'CATEGORIES': $ak = is_array($this->categories) ? array_keys($this->categories) : array(); while (is_array($this->categories) && !isset($this->categories[$propix]) && 0 < count($this->categories) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->categories[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->categories[$propix] : $this->categories[$propix]['value']; break; case 'CLASS': if (isset($this->class['value'])) { return $inclParam ? $this->class : $this->class['value']; } break; case 'COMMENT': $ak = is_array($this->comment) ? array_keys($this->comment) : array(); while (is_array($this->comment) && !isset($this->comment[$propix]) && 0 < count($this->comment) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->comment[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->comment[$propix] : $this->comment[$propix]['value']; break; case 'COMPLETED': if (isset($this->completed['value'])) { return $inclParam ? $this->completed : $this->completed['value']; } break; case 'CONTACT': $ak = is_array($this->contact) ? array_keys($this->contact) : array(); while (is_array($this->contact) && !isset($this->contact[$propix]) && 0 < count($this->contact) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->contact[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->contact[$propix] : $this->contact[$propix]['value']; break; case 'CREATED': if (isset($this->created['value'])) { return $inclParam ? $this->created : $this->created['value']; } break; case 'DESCRIPTION': $ak = is_array($this->description) ? array_keys($this->description) : array(); while (is_array($this->description) && !isset($this->description[$propix]) && 0 < count($this->description) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->description[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->description[$propix] : $this->description[$propix]['value']; break; case 'DTEND': if (isset($this->dtend['value'])) { return $inclParam ? $this->dtend : $this->dtend['value']; } break; case 'DTSTAMP': if (in_array($this->objName, iCalUtilityFunctions::$miscComps)) { return; } if (!isset($this->dtstamp['value'])) { $this->_makeDtstamp(); } return $inclParam ? $this->dtstamp : $this->dtstamp['value']; break; case 'DTSTART': if (isset($this->dtstart['value'])) { return $inclParam ? $this->dtstart : $this->dtstart['value']; } break; case 'DUE': if (isset($this->due['value'])) { return $inclParam ? $this->due : $this->due['value']; } break; case 'DURATION': if (!isset($this->duration['value'])) { return FALSE; } $value = $specform && isset($this->dtstart['value']) && isset($this->duration['value']) ? iCalUtilityFunctions::_duration2date($this->dtstart['value'], $this->duration['value']) : $this->duration['value']; $params = $specform && $inclParam && isset($this->dtstart['params']['TZID']) ? array_merge((array) $this->duration['params'], $this->dtstart['params']) : $this->duration['params']; return $inclParam ? array('value' => $value, 'params' => $params) : $value; break; case 'EXDATE': $ak = is_array($this->exdate) ? array_keys($this->exdate) : array(); while (is_array($this->exdate) && !isset($this->exdate[$propix]) && 0 < count($this->exdate) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->exdate[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->exdate[$propix] : $this->exdate[$propix]['value']; break; case 'EXRULE': $ak = is_array($this->exrule) ? array_keys($this->exrule) : array(); while (is_array($this->exrule) && !isset($this->exrule[$propix]) && 0 < count($this->exrule) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->exrule[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->exrule[$propix] : $this->exrule[$propix]['value']; break; case 'FREEBUSY': $ak = is_array($this->freebusy) ? array_keys($this->freebusy) : array(); while (is_array($this->freebusy) && !isset($this->freebusy[$propix]) && 0 < count($this->freebusy) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->freebusy[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->freebusy[$propix] : $this->freebusy[$propix]['value']; break; case 'GEO': if (isset($this->geo['value'])) { return $inclParam ? $this->geo : $this->geo['value']; } break; case 'LAST-MODIFIED': if (isset($this->lastmodified['value'])) { return $inclParam ? $this->lastmodified : $this->lastmodified['value']; } break; case 'LOCATION': if (isset($this->location['value'])) { return $inclParam ? $this->location : $this->location['value']; } break; case 'ORGANIZER': if (isset($this->organizer['value'])) { return $inclParam ? $this->organizer : $this->organizer['value']; } break; case 'PERCENT-COMPLETE': if (isset($this->percentcomplete['value'])) { return $inclParam ? $this->percentcomplete : $this->percentcomplete['value']; } break; case 'PRIORITY': if (isset($this->priority['value'])) { return $inclParam ? $this->priority : $this->priority['value']; } break; case 'RDATE': $ak = is_array($this->rdate) ? array_keys($this->rdate) : array(); while (is_array($this->rdate) && !isset($this->rdate[$propix]) && 0 < count($this->rdate) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->rdate[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->rdate[$propix] : $this->rdate[$propix]['value']; break; case 'RECURRENCE-ID': if (isset($this->recurrenceid['value'])) { return $inclParam ? $this->recurrenceid : $this->recurrenceid['value']; } break; case 'RELATED-TO': $ak = is_array($this->relatedto) ? array_keys($this->relatedto) : array(); while (is_array($this->relatedto) && !isset($this->relatedto[$propix]) && 0 < count($this->relatedto) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->relatedto[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->relatedto[$propix] : $this->relatedto[$propix]['value']; break; case 'REPEAT': if (isset($this->repeat['value'])) { return $inclParam ? $this->repeat : $this->repeat['value']; } break; case 'REQUEST-STATUS': $ak = is_array($this->requeststatus) ? array_keys($this->requeststatus) : array(); while (is_array($this->requeststatus) && !isset($this->requeststatus[$propix]) && 0 < count($this->requeststatus) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->requeststatus[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->requeststatus[$propix] : $this->requeststatus[$propix]['value']; break; case 'RESOURCES': $ak = is_array($this->resources) ? array_keys($this->resources) : array(); while (is_array($this->resources) && !isset($this->resources[$propix]) && 0 < count($this->resources) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->resources[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->resources[$propix] : $this->resources[$propix]['value']; break; case 'RRULE': $ak = is_array($this->rrule) ? array_keys($this->rrule) : array(); while (is_array($this->rrule) && !isset($this->rrule[$propix]) && 0 < count($this->rrule) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->rrule[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->rrule[$propix] : $this->rrule[$propix]['value']; break; case 'SEQUENCE': if (isset($this->sequence['value'])) { return $inclParam ? $this->sequence : $this->sequence['value']; } break; case 'STATUS': if (isset($this->status['value'])) { return $inclParam ? $this->status : $this->status['value']; } break; case 'SUMMARY': if (isset($this->summary['value'])) { return $inclParam ? $this->summary : $this->summary['value']; } break; case 'TRANSP': if (isset($this->transp['value'])) { return $inclParam ? $this->transp : $this->transp['value']; } break; case 'TRIGGER': if (isset($this->trigger['value'])) { return $inclParam ? $this->trigger : $this->trigger['value']; } break; case 'TZID': if (isset($this->tzid['value'])) { return $inclParam ? $this->tzid : $this->tzid['value']; } break; case 'TZNAME': $ak = is_array($this->tzname) ? array_keys($this->tzname) : array(); while (is_array($this->tzname) && !isset($this->tzname[$propix]) && 0 < count($this->tzname) && $propix < end($ak)) { $propix++; } $this->propix[$propName] = $propix; if (!isset($this->tzname[$propix])) { unset($this->propix[$propName]); return FALSE; } return $inclParam ? $this->tzname[$propix] : $this->tzname[$propix]['value']; break; case 'TZOFFSETFROM': if (isset($this->tzoffsetfrom['value'])) { return $inclParam ? $this->tzoffsetfrom : $this->tzoffsetfrom['value']; } break; case 'TZOFFSETTO': if (isset($this->tzoffsetto['value'])) { return $inclParam ? $this->tzoffsetto : $this->tzoffsetto['value']; } break; case 'TZURL': if (isset($this->tzurl['value'])) { return $inclParam ? $this->tzurl : $this->tzurl['value']; } break; case 'UID': if (in_array($this->objName, iCalUtilityFunctions::$miscComps)) { return FALSE; } if (empty($this->uid)) { $this->_makeuid(); } return $inclParam ? $this->uid : $this->uid['value']; break; case 'URL': if (isset($this->url['value'])) { return $inclParam ? $this->url : $this->url['value']; } break; default: if ($propName != 'X-PROP') { if (!isset($this->xprop[$propName])) { return FALSE; } return $inclParam ? array($propName, $this->xprop[$propName]) : array($propName, $this->xprop[$propName]['value']); } else { if (empty($this->xprop)) { return FALSE; } $xpropno = 0; foreach ($this->xprop as $xpropkey => $xpropvalue) { if ($propix == $xpropno) { return $inclParam ? array($xpropkey, $this->xprop[$xpropkey]) : array($xpropkey, $this->xprop[$xpropkey]['value']); } else { $xpropno++; } } return FALSE; // not found ?? } } return FALSE; }
/** * Add children to a SimpleXMLelement * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.18.10 - 2013-09-04 * @param object $parent reference to a SimpleXMLelement node * @param string $name new element node name * @param string $type content type, subelement(-s) name * @param string $content new subelement content * @param array $params new element 'attributes' * @uses iCalUtilityFunctions::_duration2str() * @uses iCalUtilityFunctions::_geo2str2() * @uses iCalUtilityFunctions::$geoLatFmt * @uses iCalUtilityFunctions::$geoLongFmt * @return void */ function _addXMLchild(&$parent, $name, $type, $content, $params = array()) { static $fmtYmd = '%04d-%02d-%02d'; static $fmtYmdHis = '%04d-%02d-%02dT%02d:%02d:%02d'; /** create new child node */ $name = strtolower($name); $child = $parent->addChild($name); if (!empty($params)) { $parameters = $child->addChild('parameters'); foreach ($params as $param => $parVal) { if ('VALUE' == $param) { continue; } $param = strtolower($param); if ('x-' == substr($param, 0, 2)) { $p1 = $parameters->addChild($param); $p2 = $p1->addChild('unknown', htmlspecialchars($parVal)); } else { $p1 = $parameters->addChild($param); switch ($param) { case 'altrep': case 'dir': $ptype = 'uri'; break; case 'delegated-from': case 'delegated-to': case 'member': case 'sent-by': $ptype = 'cal-address'; break; case 'rsvp': $ptype = 'boolean'; break; default: $ptype = 'text'; break; } if (is_array($parVal)) { foreach ($parVal as $pV) { $p2 = $p1->addChild($ptype, htmlspecialchars($pV)); } } else { $p2 = $p1->addChild($ptype, htmlspecialchars($parVal)); } } } } // end if( !empty( $params )) if (empty($content) && '0' != $content || !is_array($content) && ('-' != substr($content, 0, 1) && 0 > $content)) { return; } /** store content */ switch ($type) { case 'binary': $v = $child->addChild($type, $content); break; case 'boolean': break; case 'cal-address': $v = $child->addChild($type, $content); break; case 'date': if (array_key_exists('year', $content)) { $content = array($content); } foreach ($content as $date) { $str = sprintf($fmtYmd, (int) $date['year'], (int) $date['month'], (int) $date['day']); $v = $child->addChild($type, $str); } break; case 'date-time': if (array_key_exists('year', $content)) { $content = array($content); } foreach ($content as $dt) { if (!isset($dt['hour'])) { $dt['hour'] = 0; } if (!isset($dt['min'])) { $dt['min'] = 0; } if (!isset($dt['sec'])) { $dt['sec'] = 0; } $str = sprintf($fmtYmdHis, (int) $dt['year'], (int) $dt['month'], (int) $dt['day'], (int) $dt['hour'], (int) $dt['min'], (int) $dt['sec']); if (isset($dt['tz']) && 'Z' == $dt['tz']) { $str .= 'Z'; } $v = $child->addChild($type, $str); } break; case 'duration': $output = 'trigger' == $name && FALSE !== $content['before'] ? '-' : ''; $v = $child->addChild($type, $output . iCalUtilityFunctions::_duration2str($content)); break; case 'geo': if (!empty($content)) { $v1 = $child->addChild('latitude', iCalUtilityFunctions::_geo2str2($content['latitude'], iCalUtilityFunctions::$geoLatFmt)); $v1 = $child->addChild('longitude', iCalUtilityFunctions::_geo2str2($content['longitude'], iCalUtilityFunctions::$geoLongFmt)); } break; case 'integer': $v = $child->addChild($type, (string) $content); break; case 'period': if (!is_array($content)) { break; } foreach ($content as $period) { $v1 = $child->addChild($type); $str = sprintf($fmtYmdHis, (int) $period[0]['year'], (int) $period[0]['month'], (int) $period[0]['day'], (int) $period[0]['hour'], (int) $period[0]['min'], (int) $period[0]['sec']); if (isset($period[0]['tz']) && 'Z' == $period[0]['tz']) { $str .= 'Z'; } $v2 = $v1->addChild('start', $str); if (array_key_exists('year', $period[1])) { $str = sprintf($fmtYmdHis, (int) $period[1]['year'], (int) $period[1]['month'], (int) $period[1]['day'], (int) $period[1]['hour'], (int) $period[1]['min'], (int) $period[1]['sec']); if (isset($period[1]['tz']) && 'Z' == $period[1]['tz']) { $str .= 'Z'; } $v2 = $v1->addChild('end', $str); } else { $v2 = $v1->addChild('duration', iCalUtilityFunctions::_duration2str($period[1])); } } break; case 'recur': $content = array_change_key_case($content); foreach ($content as $rulelabel => $rulevalue) { switch ($rulelabel) { case 'until': if (isset($rulevalue['hour'])) { $str = sprintf($fmtYmdHis, (int) $rulevalue['year'], (int) $rulevalue['month'], (int) $rulevalue['day'], (int) $rulevalue['hour'], (int) $rulevalue['min'], (int) $rulevalue['sec']) . 'Z'; } else { $str = sprintf($fmtYmd, (int) $rulevalue['year'], (int) $rulevalue['month'], (int) $rulevalue['day']); } $v = $child->addChild($rulelabel, $str); break; case 'bysecond': case 'byminute': case 'byhour': case 'bymonthday': case 'byyearday': case 'byweekno': case 'bymonth': case 'bysetpos': if (is_array($rulevalue)) { foreach ($rulevalue as $vix => $valuePart) { $v = $child->addChild($rulelabel, $valuePart); } } else { $v = $child->addChild($rulelabel, $rulevalue); } break; case 'byday': if (isset($rulevalue['DAY'])) { $str = isset($rulevalue[0]) ? $rulevalue[0] : ''; $str .= $rulevalue['DAY']; $p = $child->addChild($rulelabel, $str); } else { foreach ($rulevalue as $valuePart) { if (isset($valuePart['DAY'])) { $str = isset($valuePart[0]) ? $valuePart[0] : ''; $str .= $valuePart['DAY']; $p = $child->addChild($rulelabel, $str); } else { $p = $child->addChild($rulelabel, $valuePart); } } } break; case 'freq': case 'count': case 'interval': case 'wkst': default: $p = $child->addChild($rulelabel, $rulevalue); break; } // end switch( $rulelabel ) } // end foreach( $content as $rulelabel => $rulevalue ) break; case 'rstatus': $v = $child->addChild('code', number_format((double) $content['statcode'], 2, '.', '')); $v = $child->addChild('description', htmlspecialchars($content['text'])); if (isset($content['extdata'])) { $v = $child->addChild('data', htmlspecialchars($content['extdata'])); } break; case 'text': if (!is_array($content)) { $content = array($content); } foreach ($content as $part) { $v = $child->addChild($type, htmlspecialchars($part)); } break; case 'time': break; case 'uri': $v = $child->addChild($type, $content); break; case 'utc-offset': if (in_array(substr($content, 0, 1), array('-', '+'))) { $str = substr($content, 0, 1); $content = substr($content, 1); } else { $str = '+'; } $str .= substr($content, 0, 2) . ':' . substr($content, 2, 2); if (4 < strlen($content)) { $str .= ':' . substr($content, 4); } $v = $child->addChild($type, $str); break; case 'unknown': default: if (is_array($content)) { $content = implode('', $content); } $v = $child->addChild('unknown', htmlspecialchars($content)); break; } }