Ejemplo n.º 1
0
 /**
  * @param RecurrenceRule $rule
  * @param \DateTime      $dt
  *
  * @return array
  */
 public static function getTimeSet(RecurrenceRule $rule, \DateTime $dt)
 {
     $set = array();
     if (null === $rule || $rule->getFreq() >= RecurrenceRule::FREQ_HOURLY) {
         return $set;
     }
     $byHour = $rule->getByHour();
     $byMinute = $rule->getByMinute();
     $bySecond = $rule->getBySecond();
     if (empty($byHour)) {
         $byHour = array($dt->format('G'));
     }
     if (empty($byMinute)) {
         $byMinute = array($dt->format('i'));
     }
     if (empty($bySecond)) {
         $bySecond = array($dt->format('s'));
     }
     foreach ($byHour as $hour) {
         foreach ($byMinute as $minute) {
             foreach ($bySecond as $second) {
                 $set[] = new Time($hour, $minute, $second);
             }
         }
     }
     return $set;
 }
 private function buildRRule($settings)
 {
     $allday = $settings['allday'];
     $startDate = $settings['start_date'];
     $endDate = $settings['end_date'];
     $startTime = $settings['start_time'];
     $endTime = $settings['end_time'];
     $repeats = $settings['repeats'];
     //Does it repeat?
     $frequency = $settings['frequency'];
     //Weekly, Daily, Monthly, Yearly
     $interval = $settings['interval'];
     // i.e. Every 1-30 Months?
     $weekDays = $settings['weekdays'];
     //Which weekdays
     $repeatBy = $settings['repeat_by'];
     //Monthly, by day of week, or day of month
     $ends = $settings['ends'];
     //how it ends (never, after, until)
     $count = $settings['count'];
     // if ending occurs amounts
     $untilDate = $settings['until'];
     // if ending until date
     $exDates = $settings['exdates'];
     $dbString = '';
     //Builds RRULE based on UI Elements Input
     if ($repeats) {
         $rule = new Recurr\RecurrenceRule();
         $rule->setStartDate(DateTime::createFromString($startDate, craft()->getTimeZone()));
         $rule->setInterval($interval);
         if ($ends == 'until') {
             $rule->setEndDate(DateTime::createFromString($untilDate, craft()->getTimeZone()));
         } else {
             if ($ends == 'after') {
                 $rule->setCount($count);
             }
         }
         switch ($frequency) {
             case 'daily':
                 $rule->setFreq(Recurr\RecurrenceRule::FREQ_DAILY);
                 break;
             case 'weekly':
                 $rule->setFreq(Recurr\RecurrenceRule::FREQ_WEEKLY);
                 if (empty($weekDays)) {
                     //If weekdays empty set monday by default
                     $rule->setByDay(array('MO'));
                 } else {
                     $rule->setByDay($weekDays);
                 }
                 break;
             case 'monthly':
                 $rule->setFreq(Recurr\RecurrenceRule::FREQ_MONTHLY);
                 if ($repeatBy == 'month') {
                     $dayOfMonth = date('j', $startDate);
                     $rule->setByMonthDay(array($dayOfMonth));
                 } else {
                     if ($repeatBy == 'week') {
                         $uStartDate = $startDate;
                         $dayOfWeek = strtoupper(substr(date('D', $uStartDate), 0, -1));
                         $numberOfWeek = ceil(date('j', $uStartDate) / 7);
                         $rule->setByDay(array('+' . $numberOfWeek . $dayOfWeek));
                     }
                 }
                 break;
             case 'yearly':
                 $rule->setFreq(Recurr\RecurrenceRule::FREQ_YEARLY);
                 break;
         }
         if ($startTime) {
             $time = date('Ymd\\THis', strtotime(date('Y-m-d', $startDate) . date(' H:i:s', strtotime($startTime))));
             $dbString .= 'DTSTART=' . $time . ';' . $rule->getString();
         } else {
             $time = $startDate;
             var_dump($startDate);
             $dbString .= 'DTSTART=' . date('Ymd', $time) . ';' . $rule->getString();
         }
         if (count($exDates) > 0) {
             $dbString .= ';EXDATE=';
             foreach ($exDates as $index => $date) {
                 $dbString .= date('Ymd', $date);
                 if ($date !== end($exDates)) {
                     $dbString .= ',';
                 }
             }
             $dbString .= ';';
         }
     } else {
         if ($startTime) {
             $time = date('Ymd\\THis', strtotime(date('Ymd', $startDate) . date('\\THis', strtotime($startTime))));
             $dbString .= 'DTSTART=' . $time . ';';
         } else {
             $dbString .= 'DTSTART=' . date('Ymd', $startDate) . ';';
         }
     }
     return $dbString;
 }