You are here

event_calendar.list.inc in Event Calendar 7

Event administration UI.

File

event_calendar.list.inc
View source
<?php

/**
 * @file
 * Event administration UI.
 */

/**
 * Form builder: Builds the event administration overview.
 *
 * @see event_available_terms()
 * @see event_build_filter_query()
 * @see event_calendar_dates()
 * @see event_calendar_status()
 */
function event_admin_events() {
  $admin_access = user_access('administer event status');
  $node_type = variable_get('event_calendar_node_type', 'event_calendar');

  // Build the 'Update options' form.
  $form['options'] = array(
    '#type' => 'fieldset',
    '#title' => t('Update Status'),
    '#attributes' => array(
      'class' => array(
        'container-inline',
      ),
    ),
    '#access' => $admin_access,
  );
  $options = event_available_terms();

  // Unset 'any' option.
  unset($options['0']);

  // Sort options array.
  asort($options);
  $form['options']['operation'] = array(
    '#type' => 'select',
    '#title' => t('Operation'),
    '#title_display' => 'invisible',
    '#options' => $options,
    '#default_value' => 'approve',
  );
  $form['options']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Update'),
    '#validate' => array(
      'event_admin_events_validate',
    ),
    '#submit' => array(
      'event_admin_events_submit',
    ),
  );

  // Build the sortable table header.
  $header = array(
    'title' => array(
      'data' => t('Title'),
      'field' => 'n.title',
    ),
    'start-date' => array(
      'data' => t('Start Date (y-m-d)'),
      'field' => 'n.changed',
      'sort' => 'desc',
    ),
    'end-date' => array(
      'data' => t('End Date (y-m-d)'),
      'field' => 'n.changed',
      'sort' => 'desc',
    ),
    'status' => array(
      'data' => t('Status'),
      'field' => 'n.status',
    ),
  );
  $query = db_select('node', 'n')
    ->extend('PagerDefault')
    ->extend('TableSort');
  event_build_filter_query($query);
  $nids = $query
    ->fields('n', array(
    'nid',
  ))
    ->condition('type', $node_type)
    ->limit(50)
    ->orderByHeader($header)
    ->addTag('node_access')
    ->execute()
    ->fetchCol();
  $nodes = node_load_multiple($nids);

  // Prepare the list of event nodes.
  $languages = language_list();
  $destination = drupal_get_destination();
  $options = array();
  foreach ($nodes as $node) {

    // Collect events Dates.
    $dates = event_calendar_dates($node);

    // Collect events status/
    $status = event_calendar_status($node);

    // Set flag for expired events.
    if (is_event_expired($node, 'load')) {
      $flag1 = t("<i>**");
      $flag2 = t("</i>");
    }
    else {
      $flag1 = "";
      $flag2 = "";
    }
    $langcode = '';
    if (function_exists('entity_language')) {
      $langcode = entity_language('node', $node);
    }
    $l_options = $langcode != LANGUAGE_NONE && isset($languages[$langcode]) ? array(
      'language' => $languages[$langcode],
    ) : array();
    $options[$node->nid] = array(
      'title' => array(
        'data' => array(
          '#type' => 'link',
          '#title' => $node->title,
          '#href' => 'node/' . $node->nid,
          '#options' => $l_options,
          '#suffix' => ' ' . theme('mark', array(
            'type' => node_mark($node->nid, $node->changed),
          )),
        ),
      ),
      'start-date' => $dates['start_date'],
      'end-date' => $dates['end_date'],
      'status' => $flag1 . $status . $flag2,
    );
  }
  $form['events'] = array(
    '#type' => 'tableselect',
    '#header' => $header,
    '#options' => $options,
    '#empty' => t('No content available.'),
  );
  $form['pager'] = array(
    '#markup' => theme('pager'),
  );
  return $form;
}

/**
 * Menu callback: Events administration.
 */
function event_calendar_content($form, $form_state) {

  // Form elements to provide filter options.
  $form['filter'] = event_filter_form();

  // Submit callback to filter events.
  $form['#submit'][] = 'event_filter_form_submit';

  // Form elements to provide list of events.
  $form['admin_events'] = event_admin_events();

  // Form elements to provide status explaination.
  $form['event_calendar_note'] = event_calendar_status_note();
  return $form;
}

/**
 * Callback function Form element and form element explaining status state.
 */
function event_calendar_status_note() {

  // From element to explain expired events.
  $form['event_status_note'] = array(
    '#type' => 'item',
    '#markup' => t('<i>** these events are expired.</i>'),
  );
  return $form;
}

/**
 * Callback function events status,
 * If event is expired then return a custom status as 'expired'.
 */
function event_calendar_status($node) {

  // Build query to fetch status of events.
  $query = db_select('field_data_event_calendar_status', 'ecs');
  $query
    ->join('taxonomy_term_data', 'td', 'td.tid = ecs.event_calendar_status_tid');
  $query
    ->fields('td', array(
    'name',
  ))
    ->condition('ecs.entity_id', $node->nid);
  $result = $query
    ->execute();
  foreach ($result as $status) {
    return $status->name;
  }
}

/**
 * Callback: function to collect events start date and end date.
 */
function event_calendar_dates($node) {

  // Build query to fetch events dates.
  // Event start date.
  $dates = array(
    NULL,
  );
  $field_lang_code = field_language('node', $node, 'event_calendar_date', LANGUAGE_NONE);
  if (isset($node->event_calendar_date[$field_lang_code][0]['value'])) {
    $dates['start_date'] = $node->event_calendar_date[$field_lang_code][0]['value'];

    // Event end date.
  }
  if (isset($node->event_calendar_date[$field_lang_code][0]['value2'])) {
    $dates['end_date'] = $node->event_calendar_date[$field_lang_code][0]['value2'];
  }
  return $dates;
}

/**
 * Callback: Function to collect available terms for event calendar.
 */
function event_available_terms() {

  // Build query to fetch available terms.
  $vid = db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE machine_name = :machine_name", array(
    ':machine_name' => TAXONOMY_NAME,
  ))
    ->fetchField();

  // Get all terms of a vocabulary.
  $taxonomy = taxonomy_get_tree($vid);

  // Add an extra option 'any', will be show as filter option.
  $terms = array(
    'any',
  );
  foreach ($taxonomy as $term) {
    $terms[$term->tid] = $term->name;
  }
  return $terms;
}

/**
 * Return form for events node administration filters.
 */
function event_filter_form() {

  // Collect all terms to show in filter option.
  $terms = event_available_terms();
  asort($terms);

  // Creating filter form.
  $form['filters'] = array(
    '#type' => 'fieldset',
    '#title' => t('Show only events where'),
    '#theme' => 'exposed_filters__node',
  );
  if (!empty($_SESSION['event_overview_filter'])) {

    // Find filter status.
    $status = db_query("SELECT name FROM {taxonomy_term_data} WHERE tid = :tid", array(
      ':tid' => $_SESSION['event_overview_filter'],
    ))
      ->fetchField();

    // Extra field to show filter status.
    $form['filters']['status']['text'] = array(
      '#markup' => t('where status is <b> %status </b>', array(
        '%status' => $status,
      )),
      '#value' => t('Reset'),
    );
  }
  $form['filters']['status']['filters'] = array(
    '#title' => t('status'),
    '#type' => 'select',
    '#options' => $terms,
  );
  $form['filters']['status']['actions'] = array(
    '#type' => 'actions',
    '#attributes' => array(
      'class' => array(
        'container-inline',
      ),
    ),
  );
  $form['filters']['status']['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Filter'),
  );
  if (!empty($_SESSION['event_overview_filter'])) {
    $form['filters']['status']['actions']['reset'] = array(
      '#type' => 'submit',
      '#value' => t('Reset'),
    );
  }
  return $form;
}

/**
 * Apply filters for event node administration filters based on session.
 *
 * @param string $query
 *   A Select Query to which the filters should be applied.
 */
function event_build_filter_query(SelectQueryInterface $query) {

  // Build query.
  $filter_data = isset($_SESSION['event_overview_filter']) ? $_SESSION['event_overview_filter'] : '';
  if ($filter_data) {
    $query
      ->join('field_data_event_calendar_status', 'ecs', 'ecs.entity_id = n.nid');
    $query
      ->condition('ecs.event_calendar_status_tid', $filter_data);
  }
}

/**
 * Process result from event node administration filter form.
 */
function event_filter_form_submit($form, &$form_state) {
  $filters = $form_state['values']['filters'];
  if (!empty($_SESSION['event_overview_filter'])) {
    unset($_SESSION['event_overview_filter']);
  }
  if ($filters) {
    $_SESSION['event_overview_filter'] = $filters;
  }
}

/**
 * Validate event_admin_events form submissions.
 *
 * Check if any nodes have been selected to perform the chosen
 * 'Update option' on.
 */
function event_admin_events_validate($form, &$form_state) {

  // Error if there are no items to select.
  if (!is_array($form_state['values']['events']) || !count(array_filter($form_state['values']['events']))) {
    form_set_error('', t('No event selected.'));
  }
}

/**
 * Process event_admin_events form submissions.
 *
 * Execute the chosen 'Update option' on the selected nodes.
 */
function event_admin_events_submit($form, &$form_state) {

  // Filter out unchecked event nodes.
  $events = array_filter($form_state['values']['events']);

  // Find out the term id.
  $op = $form_state['values']['operation'];
  global $user;
  $node_type = variable_get('event_calendar_node_type', 'event_calendar');

  // Update each selected event node with new taxonomy status.
  foreach ($events as $nid) {
    $obj = node_load($nid);
    $field_lang_code = field_language('node', $obj, 'event_calendar_date', LANGUAGE_NONE);
    $obj->event_calendar_status[$field_lang_code][0]['tid'] = $op;
    $node_save = node_save($obj);
  }
  drupal_set_message(t('The status has been changed.'));
}

Functions

Namesort descending Description
event_admin_events Form builder: Builds the event administration overview.
event_admin_events_submit Process event_admin_events form submissions.
event_admin_events_validate Validate event_admin_events form submissions.
event_available_terms Callback: Function to collect available terms for event calendar.
event_build_filter_query Apply filters for event node administration filters based on session.
event_calendar_content Menu callback: Events administration.
event_calendar_dates Callback: function to collect events start date and end date.
event_calendar_status Callback function events status, If event is expired then return a custom status as 'expired'.
event_calendar_status_note Callback function Form element and form element explaining status state.
event_filter_form Return form for events node administration filters.
event_filter_form_submit Process result from event node administration filter form.