You are here

function availability_calendars_update_node_states_range in Availability Calendars 7.2

Updates/inserts the states for the calendar for the given node and date range.

Note that $from and $to must be ordered and that if the date parts of $from and $to are equal, no pm and am are allowed. Unexpected results will occur when not obeyed.

Parameters

int $calendar_nid:

string $from: Format: yyyy-mm-dd or yyyy-mm-dd(pm)

string $to: Format: yyyy-mm-dd or yyyy-mm-dd(am) $param string $state

1 call to availability_calendars_update_node_states_range()
AvailabilityCalendarsNodeEditCalendarFormHandler::submit in ./availability_calendars.node.inc
Callback to process form submission for the styles form.

File

./availability_calendars.inc, line 431
General helper methods for Availability Calendars, like database access and settings.

Code

function availability_calendars_update_node_states_range($calendar_nid, $from, $to, $state) {
  $from_pm = drupal_substr($from, 10);

  /** @var $from DateTime */
  $from = new DateTime(drupal_substr($from, 0, 10));
  $to_am = drupal_substr($to, 10);

  /** @var $to DateTime */
  $to = new DateTime(drupal_substr($to, 0, 10));

  // Start building the insert query as specific from and to may already lead to insert values.
  $values = array(
    'nid' => $calendar_nid,
    'date' => null,
    'status' => $state,
  );
  $insert = db_insert('availability_calendars_day')
    ->fields(array_keys($values));

  // Get existing dates to be able to differentiate between update and insert.
  $existing_states = availability_calendars_get_node_states_range($calendar_nid, $from, $to);

  // Handle $from and $to dates specially when a split day range is passed in.
  if (!empty($from_pm)) {
    $values['date'] = $from
      ->format(AC_ISODATE);
    if (array_key_exists($values['date'], $existing_states)) {

      // Update PM state, leave AM state, i.e. AM state becomes current whole day state or current AM state.
      $current_state = $existing_states[$values['date']];
      $matches = array();
      if (preg_match('/([^ ]+)-am/', $current_state, $matches) > 0) {
        $current_state = $matches[1];
      }
      $values['status'] = $current_state . '-am ' . $state . '-pm';
      db_update('availability_calendars_day')
        ->fields(array(
        'status' => $values['status'],
      ))
        ->condition('nid', $calendar_nid, '=')
        ->condition('date', $values['date'], '=')
        ->execute();
    }
    else {

      // Insert default AM status and PM state.
      $settings = availability_calendars_get_settings($calendar_nid);
      $values['status'] = $settings->defaultstatus . '-am ' . $state . '-pm';
      $insert
        ->values($values);
    }
    $from
      ->modify('+1 day');
  }
  if (!empty($to_am)) {
    $values['date'] = $to
      ->format(AC_ISODATE);
    if (array_key_exists($values['date'], $existing_states)) {

      // Update AM state, leave PM state, i.e. PM state becomes current whole day state or current PM state.
      $current_state = $existing_states[$values['date']];
      $matches = array();
      if (preg_match('/([^ ]+)-pm/', $current_state, $matches) > 0) {
        $current_state = $matches[1];
      }
      $values['status'] = $state . '-am ' . $current_state . '-pm';
      db_update('availability_calendars_day')
        ->fields(array(
        'status' => $values['status'],
      ))
        ->condition('nid', $calendar_nid, '=')
        ->condition('date', $values['date'], '=')
        ->execute();
    }
    else {

      // Insert AM state and default PM status.
      $settings = availability_calendars_get_settings($calendar_nid);
      $values['status'] = $state . '-am ' . $settings->defaultstatus . '-pm';
      $insert
        ->values($values);
    }
    $to
      ->modify('-1 day');
  }

  // Only continue when handling split from and to dates did not cover the whole range.
  if ($from <= $to) {

    // Update the already existing dates.
    db_update('availability_calendars_day')
      ->fields(array(
      'status' => $state,
    ))
      ->condition('nid', $calendar_nid, '=')
      ->condition('date', array(
      $from
        ->format(AC_ISODATE),
      $to
        ->format(AC_ISODATE),
    ), 'BETWEEN')
      ->execute();

    // Insert the non-existing dates.
    $values['status'] = $state;
    for ($day = $from; $day <= $to; $day
      ->modify('+1 day')) {
      $values['date'] = $day
        ->format(AC_ISODATE);
      if (!array_key_exists($values['date'], $existing_states)) {
        $insert
          ->values($values);
      }
    }
  }
  $insert
    ->execute();
}