public function getSchedule() { if (!$this->start_date || !$this->is_recurring || !$this->frequency_id) { return false; } $startDate = $this->getOriginal('last_sent_date') ?: $this->getOriginal('start_date'); $startDate .= ' ' . $this->account->recurring_hour . ':00:00'; $startDate = $this->account->getDateTime($startDate); $endDate = $this->end_date ? $this->account->getDateTime($this->getOriginal('end_date')) : null; $timezone = $this->account->getTimezone(); $rule = $this->getRecurrenceRule(); $rule = new \Recurr\Rule("{$rule}", $startDate, $endDate, $timezone); // Fix for months with less than 31 days $transformerConfig = new \Recurr\Transformer\ArrayTransformerConfig(); $transformerConfig->enableLastDayOfMonthFix(); $transformer = new \Recurr\Transformer\ArrayTransformer(); $transformer->setConfig($transformerConfig); $dates = $transformer->transform($rule); if (count($dates) < 2) { return false; } return $dates; }
/** * Get dates array based on recur template. * * @return array */ public function getRecurDates($start, $rrule) { $timezone = "UTC"; //"UTC"; //'America/New_York' 'America/Denver' craft()->getTimeZone() //convert time back to selected timezone. $startDateString = new \DateTime($start->format('c'), new \DateTimeZone(craft()->getTimeZone())); //$startDateString = $start->format(DateTime::MYSQL_DATETIME, DateTime::UTC); // $rule = new \Recurr\Rule($rrule, $startDateString, null, $timezone); $transformer = new \Recurr\Transformer\ArrayTransformer(); $transformerConfig = new \Recurr\Transformer\ArrayTransformerConfig(); $transformerConfig->enableLastDayOfMonthFix(); $transformer->setConfig($transformerConfig); return $transformer->transform($rule); }
<?php use yii\helpers\Html; use yii\bootstrap\ActiveForm; use dosamigos\datetimepicker\DateTimePicker; $summary = ''; if ($model->recurrence_rule) { $rule = new \Recurr\Rule($model->recurrence_rule); $transformer = new \Recurr\Transformer\ArrayTransformer(); $transformerConfig = new \Recurr\Transformer\ArrayTransformerConfig(); $transformerConfig->enableLastDayOfMonthFix(); $transformer->setConfig($transformerConfig); $textTransformer = new \Recurr\Transformer\TextTransformer(new \Recurr\Transformer\Translator('en')); $summary = $textTransformer->transform($rule); } ?> <?php $form = ActiveForm::begin(['id' => 'event-form', 'layout' => 'horizontal', 'fieldConfig' => ['template' => "{label}\n{beginWrapper}\n{input}\n{endWrapper}", 'horizontalCssClasses' => ['label' => 'col-sm-3', 'offset' => 'col-sm-offset-3', 'wrapper' => 'col-sm-8']]]); ?> <?php echo Html::activeHiddenInput($model, 'id'); ?> <?php echo Html::activeHiddenInput($model, 'calendar_id'); echo Html::activeHiddenInput($model, 'created_by'); echo Html::activeHiddenInput($model, 'recurrence_rule'); ?>
/** * @param int $eventDateUid */ public function updateRecurrences($eventDateUid) { $date = $this->eventDateRepository->findByUid($eventDateUid); if (!$date) { /* Do not update hidden records – they'll be updated when the are activated again */ return; } if ($date->getFrequency() === 0) { /* Remove recurrences that may have existed before switching to frequency=0 */ $this->removeRecurrences($eventDateUid); return; } if ($date->getStart()) { $startDate = $date->getStart(); // Timezone is set to '+01:00' by default (with a European default timzeone) // set the timezone explictly to make DateTransitions work $startDate->setTimezone(new \DateTimeZone(date_default_timezone_get())); $endDate = null; if ($date->getEnd()) { $endDate = $date->getEnd(); $endDate->setTimezone(new \DateTimeZone(date_default_timezone_get())); } if (!in_array($date->getFrequency(), array_keys(self::$freqs))) { return; } $rrule = ['FREQ' => self::$freqs[$date->getFrequency()]]; if ($date->getFrequencyUntil()) { $rrule['UNTIL'] = $date->getFrequencyUntil()->format(\DateTime::ATOM); } else { $rrule['COUNT'] = $date->getFrequencyCount(); } if ($rrule['FREQ'] == 'WEEKLY') { $byday = $this->buildByDay($date->getFrequencyWeekdays()); if ($byday) { $rrule['BYDAY'] = $byday; } } $rule = new \Recurr\Rule($rrule, $startDate, $endDate); $transformer = new \Recurr\Transformer\ArrayTransformer(); $transformerConfig = new \Recurr\Transformer\ArrayTransformerConfig(); $limit = $this->configurationService->get('recurrence_virtual_limit'); if ($limit) { $transformerConfig->setVirtualLimit($limit); } $transformerConfig->enableLastDayOfMonthFix(); $transformer->setConfig($transformerConfig); $this->mergeUpdatesWithExistingRecurrences($date, $transformer->transform($rule)); } }
/** * Get dates array based on recur template. * * @return array */ public function getRecurDates($start, $rrule) { $timezone = craft()->getTimeZone(); //'UTC','America/New_York','America/Denver' craft()->getTimeZone() $startDateString = $start->format(DateTime::MYSQL_DATETIME); #-- returns null or datetime $endOn = craft()->venti_rule->getEndOn($rrule); $rule = new \Recurr\Rule($rrule, $startDateString, $endOn, $timezone); $transformer = new \Recurr\Transformer\ArrayTransformer(); $transformerConfig = new \Recurr\Transformer\ArrayTransformerConfig(); $transformerConfig->enableLastDayOfMonthFix(); $transformer->setConfig($transformerConfig); // if ($endOn !== null) // { // $constraint = new \Recurr\Transformer\Constraint\BetweenConstraint($start, $endOn, true); // } // else // { // $constraint = new \Recurr\Transformer\Constraint\AfterConstraint(new \DateTime(), true); // } return $transformer->transform($rule); }