'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("**");
$flag2 = t("");
}
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('** these events are expired.'),
);
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 %status ', 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.'));
}