You are here

function bat_api_services_events_index_calendar in Booking and Availability Management API 7.2

Retrieve a list of events to use with Fullcalendar scheduler.

Parameters

string $unit_ids:

string $unit_types:

string $start_date:

string $end_date:

string $event_types:

bool $background:

1 string reference to 'bat_api_services_events_index_calendar'
bat_api_services_resources in ./bat_api.module
Implements hook_services_resources().

File

./bat_api.module, line 953
API access to booking data for BAT.

Code

function bat_api_services_events_index_calendar($unit_ids, $unit_types, $start_date, $end_date, $event_types, $background) {
  if ($unit_types == 'all') {
    $unit_types = array();
    foreach (bat_unit_get_types() as $type => $info) {
      $unit_types[] = $type;
    }
  }
  else {
    $unit_types = array_filter(explode(',', $unit_types));
  }
  if ($event_types == 'all') {
    $types = array();
    foreach (bat_event_get_types() as $type => $info) {
      $types[] = $type;
    }
  }
  else {
    $types = array_filter(explode(',', $event_types));
  }
  $events_json = array();
  foreach ($types as $type) {

    // Check if user has permission to view calendar data for this event type.
    if (!user_access('view calendar data for any ' . $type . ' event')) {
      continue;
    }

    // Get the event type definition from Drupal.
    $bat_event_type = bat_event_type_load($type);
    $target_entity_type = $bat_event_type->target_entity_type;
    $controller = entity_get_controller($target_entity_type);

    // For each type of event create a state store and an event store.
    $event_store = new DrupalDBStore($type, DrupalDBStore::BAT_EVENT, bat_get_db_prefix());
    $start_date_object = new DateTime($start_date);
    $end_date_object = new DateTime($end_date);
    $today = new DateTime();
    if (!user_access('view past event information') && $today > $start_date_object) {
      if ($today > $end_date_object) {
        $return->events = array();
        return $return;
      }
      $start_date_object = $today;
    }
    $ids = array_filter(explode(',', $unit_ids));
    foreach ($unit_types as $unit_type) {
      $entities = $controller
        ->getReferencedIds($unit_type, $ids);
      $childrens = array();

      // Create an array of unit objects - the default value is set to 0 since we want
      // to know if the value in the database is actually 0. This will allow us to identify
      // which events are represented by events in the database (i.e. have a value different to 0)
      $units = array();
      foreach ($entities as $entity) {
        $units[] = new Unit($entity['id'], 0);
      }
      if (!empty($units)) {
        $event_calendar = new Calendar($units, $event_store);
        $event_ids = $event_calendar
          ->getEvents($start_date_object, $end_date_object);

        // @TODO - this is an undeclared dependency of bat_event_ui
        if ($bat_event_type->fixed_event_states) {
          $event_formatter = new FullCalendarFixedStateEventFormatter($bat_event_type, $background);
        }
        else {
          $event_formatter = new FullCalendarOpenStateEventFormatter($bat_event_type, $background);
        }
        foreach ($event_ids as $unit_id => $unit_events) {
          foreach ($unit_events as $key => $event) {
            $events_json[] = array(
              'id' => 'U' . $unit_id . 'E' . $key,
              'bat_id' => $event
                ->getValue(),
              'resourceId' => 'S' . $unit_id,
            ) + $event
              ->toJson($event_formatter);
          }
        }
      }
    }
  }
  $events_json = _bat_api_merge_non_blocking_events($events_json);
  $context = array(
    'unit_ids' => $unit_ids,
    'unit_types' => $unit_types,
    'start_date' => $start_date_object,
    'end_date' => $end_date_object,
    'event_types' => $event_types,
    'background' => $background,
  );
  drupal_alter('bat_api_events_index_calendar', $events_json, $context);
  return array_values($events_json);
}