/** * @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; }