/** * creates formatted output for calendar component property data value type recur * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.16.25 - 2013-06-30 * @param array $recurlabel * @param array $recurdata * @uses calendarComponent::getConfig() * @uses calendarComponent::_createElement() * @uses calendarComponent::_createParams() * @uses iCalUtilityFunctions::_date2strdate() * @uses iCalUtilityFunctions::_recurBydaySort() * @return string */ function _format_recur($recurlabel, $recurdata) { $output = null; foreach ($recurdata as $therule) { if (empty($therule['value'])) { if ($this->getConfig('allowEmpty')) { $output .= $this->_createElement($recurlabel); } continue; } $attributes = isset($therule['params']) ? $this->_createParams($therule['params']) : null; $content1 = $content2 = null; foreach ($therule['value'] as $rulelabel => $rulevalue) { switch (strtoupper($rulelabel)) { case 'FREQ': $content1 .= "FREQ={$rulevalue}"; break; case 'UNTIL': $parno = isset($rulevalue['hour']) ? 7 : 3; $content2 .= ';UNTIL=' . iCalUtilityFunctions::_date2strdate($rulevalue, $parno); break; case 'COUNT': case 'INTERVAL': case 'WKST': $content2 .= ";{$rulelabel}={$rulevalue}"; break; case 'BYSECOND': case 'BYMINUTE': case 'BYHOUR': case 'BYMONTHDAY': case 'BYYEARDAY': case 'BYWEEKNO': case 'BYMONTH': case 'BYSETPOS': $content2 .= ";{$rulelabel}="; if (is_array($rulevalue)) { foreach ($rulevalue as $vix => $valuePart) { $content2 .= $vix ? ',' : null; $content2 .= $valuePart; } } else { $content2 .= $rulevalue; } break; case 'BYDAY': $byday = array(''); $bx = 0; foreach ($rulevalue as $bix => $bydayPart) { if (!empty($byday[$bx]) && !ctype_digit(substr($byday[$bx], -1))) { // new day $byday[++$bx] = ''; } if (!is_array($bydayPart)) { // day without order number $byday[$bx] .= (string) $bydayPart; } else { // day with order number foreach ($bydayPart as $bix2 => $bydayPart2) { $byday[$bx] .= (string) $bydayPart2; } } } // end foreach( $rulevalue as $bix => $bydayPart ) if (1 < count($byday)) { usort($byday, array('iCalUtilityFunctions', '_recurBydaySort')); } $content2 .= ';BYDAY=' . implode(',', $byday); break; default: $content2 .= ";{$rulelabel}={$rulevalue}"; break; } } $output .= $this->_createElement($recurlabel, $attributes, $content1 . $content2); } return $output; }
/** * transforms a dateTime from a timezone to another using PHP DateTime and DateTimeZone class (PHP >= PHP 5.2.0) * * @author Kjell-Inge Gustafsson, kigkonsult <*****@*****.**> * @since 2.15.1 - 2012-10-17 * @param mixed $date, date to alter * @param string $tzFrom, PHP valid 'from' timezone * @param string $tzTo, PHP valid 'to' timezone, default 'UTC' * @param string $format, date output format, default 'Ymd\THis' * @return bool */ public static function transformDateTime(&$date, $tzFrom, $tzTo = 'UTC', $format = 'Ymd\\THis') { if (is_array($date) && isset($date['timestamp'])) { try { $d = new DateTime("@{$date['timestamp']}"); // set UTC date $d->setTimezone(new DateTimeZone($tzFrom)); // convert to 'from' date } catch (Exception $e) { return FALSE; } } else { if (iCalUtilityFunctions::_isArrayDate($date)) { if (isset($date['tz'])) { unset($date['tz']); } $date = iCalUtilityFunctions::_date2strdate(iCalUtilityFunctions::_chkDateArr($date)); } if ('Z' == substr($date, -1)) { $date = substr($date, 0, strlen($date) - 2); } try { $d = new DateTime($date, new DateTimeZone($tzFrom)); } catch (Exception $e) { return FALSE; } } try { $d->setTimezone(new DateTimeZone($tzTo)); } catch (Exception $e) { return FALSE; } $date = $d->format($format); return TRUE; }