/**
  * 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;
 }
Пример #2
0
 /**
  * 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;
 }