You are here

public function ParserIcalDateTimeElement::__construct in iCal feed parser 6.2

Same name and namespace in other branches
  1. 7 includes/ParserIcalFeedsParser.inc \ParserIcalDateTimeElement::__construct()

Construct from an iCal VEVENT date array.

Overrides FeedsDateTimeElement::__construct

File

includes/ParserIcalFeedsParser.inc, line 15

Class

ParserIcalDateTimeElement
Overridden version of FeedsDateTimeElement that supports iCal specific parsing and repetition.

Code

public function __construct($feed_element) {
  if (empty($feed_element['DTSTART']['datetime'])) {
    return;
  }
  include_once drupal_get_path('module', 'date_api') . '/date_api_ical.inc';
  $timezone = $feed_element['DTSTART']['tz'];
  if (!empty($timezone)) {
    $timezone = new DateTimeZone($timezone);
  }
  $this->start = new FeedsDateTime($feed_element['DTSTART']['datetime'], $timezone);
  if (!empty($feed_element['DTEND']) && !empty($feed_element['DTEND']['datetime'])) {
    $this->end = new FeedsDateTime($feed_element['DTEND']['datetime'], $timezone);
  }
  if ($feed_element['DTSTART']['all_day']) {

    // All day event; remove time granularity, set to = from
    $this->start
      ->setTime(0, 0, 0);
    $this->start
      ->removeGranularity('hour');
    $this->start
      ->removeGranularity('minute');
    $this->start
      ->removeGranularity('second');
    $this->end = clone $this->start;
  }
  if (array_key_exists('RRULE', $feed_element) && !empty($feed_element['RRULE']) && module_exists('date_repeat')) {

    // Explode the RRULE into parts so we can analyze it.
    $rrule = $feed_element['RRULE']['DATA'] . (!empty($feed_element['EXDATE']) ? "/n" . $feed_element['EXDATE'] : "");

    // In current API the first variable, $field, is unused--may change?
    $form_values = date_ical_parse_rrule(NULL, $rrule);

    /**
     * Make sure we don't end up with thousands of values with RRULES
     * that have no UNTIL or COUNT.
     * @todo could be adjusted or made configurable later.
     * NOTE: This is not properly timezone converted; that's the least of its
     * problems.
     */
    $max = date_now();
    $max_repeats = 52;
    date_modify($max, '+5 years');
    $until = date_format($max, 'Y-m-d H:i:s');
    if (empty($form_values['COUNT']) && (empty($form_values['UNTIL']) || $until < $form_values['UNTIL']['datetime'])) {
      $form_values['UNTIL'] = array(
        'datetime' => $until,
        'tz' => 'UTC',
      );
      $form_values['COUNT'] = $max_repeats;
    }
    elseif (empty($form_values['COUNT'])) {
      $form_values['COUNT'] = $max_repeats;
    }
    elseif (empty($form_values['UNTIL'])) {
      $form_values['UNTIL'] = array(
        'datetime' => $until,
        'tz' => 'UTC',
      );
    }

    // Save these in the form_values format, which date can convert to an
    // rrule with date_api_ical_build_rrule()
    $this->repeat_vals = $form_values;
  }
}