'Calendar', 'description' => 'Calendar administration.', 'page callback' => 'drupal_get_form', 'page arguments' => array('calendar_admin_settings'), 'access callback' => 'user_access', 'access arguments' => array('administer site configuration'), ); return $items; } /** * General Calendar administration. */ function calendar_admin_settings() { $form = array(); $form['#prefix'] = '
View complete documentation at !link.
", array('!link' => l(t('Date and Calendar Documentation'), 'http://drupal.org/node/262062'))); } } /** * Implements hook_theme(). */ function calendar_theme() { $module_path = drupal_get_path('module', 'calendar'); $base = array( 'file' => 'theme.inc', 'path' => "$module_path/theme", ); return array( 'calendar_item' => $base + array( 'template' => 'calendar-item', 'variables' => array('view' => NULL, 'rendered_fields' => NULL, 'item' => NULL), ), 'calendar_datebox' => $base + array( 'template' => 'calendar-datebox', 'variables' => array( 'date' => NULL, 'view' => NULL, 'items' => NULL, 'selected' => NULL), ), 'calendar_empty_day' => $base + array( 'variables' => array('curday' => NULL, 'view' => NULL), ), 'calendar_stripe_legend' => $base + array( 'variables' => array('view' => NULL), ), 'calendar_stripe_stripe' => $base + array( 'variables' => array('node' => NULL), ), 'calendar_time_row_heading' => $base + array( 'variables' => array('start_time' => NULL, 'next_start_time' => NULL, 'curday_date' => NULL), ), 'calendar_month_col' => $base + array( 'template' => 'calendar-month-col', 'variables' => array('item' => NULL), ), 'calendar_month_row' => $base + array( 'template' => 'calendar-month-row', 'variables' => array('inner' => NULL, 'class' => NULL, 'iehint' => NULL), ), 'calendar_month_multiple_entity' => $base + array( 'template' => 'calendar-month-multiple-entity', 'variables' => array(' curday' => NULL, 'count' => NULL, 'view' => NULL, 'ids' => NULL), ), ); } /** * Implements hook_node_view(). * * Add link to calendar to nodes, formerly hook_link(). * Controlled by value of 'calendar_date_link' in the view. */ function calendar_node_view($node, $view_mode, $langcode) { $path = variable_get('calendar_date_link_' . $node->type); if (!empty($path)) { $links['calendar_link'] = array( 'title' => t('Calendar'), 'href' => $path, 'attributes' => array('title' => t('View the calendar.')), ); $node->content['links']['calendar'] = array( '#theme' => 'links__node__calendar', '#links' => $links, '#attributes' => array('class' => array('links', 'inline')), ); } } /** * Helper function to link an entity type to a calendar. * * @param $entity_type - the type of entity. * @param $bundle - the entity bundle name. * @param $path - the calendar path to use for this bundle. */ function calendar_set_link($entity_type, $bundle, $path) { switch ($entity_type) { case 'node': variable_set('calendar_date_link_' . $bundle, $path); break; default: variable_set('calendar_date_link_' . $entity_type . '_' . $bundle, $path); break; } } /** * Helper function to clear previously-set links to calendars. * * @param $bundle, Clear all links for this bundle. If NULL, clear all links. */ function calendar_clear_link_bundle($bundle = NULL) { if (empty($bundle)) { $result = db_select('variable', 'v') ->fields('v', 'name') ->condition('name', 'calendar_date_link_%', 'LIKE') ->execute()->fetchAll(PDO::FETCH_ASSOC); } else { $result = db_select('variable', 'v') ->fields('v', 'name') ->condition('name', 'calendar_date_link_' . $bundle) ->execute()->fetchAll(PDO::FETCH_ASSOC); } // Iterate over all the values and delete them. foreach ($result as $row) { variable_del($row['name']); } } /** * Helper function to clear previously-set links to calendars. * * @param $path, Clear all links to this path. If NULL, clear all links. */ function calendar_clear_link_path($path = NULL) { $result = db_select('variable', 'v') ->fields('v', array('name', 'value')) ->condition('name', 'calendar_date_link_%', 'LIKE') ->execute()->fetchAll(PDO::FETCH_ASSOC); // Iterate over all the values and delete them. foreach ($result as $row) { if (empty($path) || unserialize($row['value']) == $path) { variable_del($row['name']); } } if (isset($_SESSION['calendar_links'][$path]['actions'])) { unset($_SESSION['calendar_links'][$path]['actions']); if (empty($_SESSION['calendar_links'][$path])) { unset($_SESSION['calendar_links'][$path]); } } } /** * Formats the weekday information into table header format * * @ingroup event_support * @return array with weekday table header data */ function calendar_week_header($view) { $len = isset($view->date_info->style_name_size) ? $view->date_info->style_name_size : (!empty($view->date_info->mini) ? 1 : 3); $with_week = !empty($view->date_info->style_with_weekno); // create week header $untranslated_days = calendar_untranslated_days(); $full_translated_days = date_week_days_ordered(date_week_days(TRUE)); if ($len == 99) { $translated_days = $full_translated_days; } else { $translated_days = date_week_days_ordered(date_week_days_abbr(TRUE)); } if ($with_week) { $row[] = array('header' => TRUE, 'class' => "days week", 'data' => ' ', 'header_id' => 'Week'); } foreach ($untranslated_days as $delta => $day) { $label = $len < 3 ? drupal_substr($translated_days[$delta], 0 , $len) : $translated_days[$delta]; $row[] = array('header' => TRUE, 'class' => "days " . $day, 'data' => $label, 'header_id' => $full_translated_days[$delta]); } return $row; } /** * Array of untranslated day name abbreviations, forced to lowercase * and ordered appropriately for the site setting for the first day of week. * * The untranslated day abbreviation is used in css classes. */ function calendar_untranslated_days() { $untranslated_days = date_week_days_ordered(date_week_days_untranslated()); foreach ($untranslated_days as $delta => $day) { $untranslated_days[$delta] = strtolower(substr($day, 0, 3)); } return $untranslated_days; } /** * Default settings array for calendar time grouping. */ function calendar_groupby_times($type = '') { $times = array(); switch ($type) { case 'hour': for ($i = 0; $i <= 23; $i++) { $times[] = date_pad($i) . ':00:00'; } break; case 'half': for ($i = 0; $i <= 23; $i++) { $times[] = date_pad($i) . ':00:00'; $times[] = date_pad($i) . ':30:00'; } break; default: break; } return $times; } function calendar_list_views() { $calendar_views = array(); $views = views_get_enabled_views(); foreach ($views as $view) { $displays = array(); $view->init_display(); // Make sure all the handlers are set up foreach ($view->display as $display_id => $display) { if ($display_id != 'default' && !empty($display->display_options['style_plugin']) && $display->display_options['style_plugin'] == 'calendar_style') { $index = $view->name . ':' . $display_id; $calendar_views[$index] = ucfirst($view->name) . ' ' . strtolower($view->display[$display_id]->display_title) . ' [' . $view->name . ':' . $display_id . ']'; } } } return $calendar_views; } /** * Implementation of hook_block_info() */ function calendar_block_info() { $blocks['calendar_legend'] = array( 'info' => t('Calendar Legend'), ); return $blocks; } /** * Implementation of hook_block_configure(). */ function calendar_block_configure($delta = '') { switch ($delta) { case 'calendar_legend': $options = calendar_list_views(); $form['calendar_legend_view'] = array( '#type' => 'select', '#title' => t('Legend View'), '#description' => t('Choose the view display that contains the settings for the stripes that should be displayed in a legend in this block. Note that if you change the stripe values in that view you will need to clear the cache to pick up the new values in this block.'), '#default_value' => variable_get('calendar_legend_view_' . $delta, ''), '#options' => $options, ); return $form; } } /** * Implementation of hook_block_save(). */ function calendar_block_save($delta, $edit = array()) { if ($delta == 'calendar_legend') { variable_set('calendar_legend_view_' . $delta, $edit['calendar_legend_view']); drupal_set_message(t('The view for the calendar legend has been set.')); } } /** * Implementation of hook_block_view(). */ function calendar_block_view($delta = '') { switch ($delta) { case 'calendar_legend': // Create the content before returning the block // so empty content won't still create the block. $view = variable_get('calendar_legend_view_' . $delta, ''); $content = theme('calendar_stripe_legend', array('view' => $view)); $block['subject'] = t('Calendar Legend'); $block['content'] = $content; return $block; } } /** * Find the path for the calendar display that has a specific granularity. */ function calendar_granularity_path(&$view, $granularity) { $paths = &drupal_static(__FUNCTION__, array()); if (!array_key_exists($view->name, $paths) || !(array_key_exists($granularity, $paths[$view->name]))) { $paths[$view->name][$granularity] = ''; foreach ($view->display as $id => $display) { // Check for !empty() in case the view is not fully formed or has displays that are marked to be deleted if (!empty($display->deleted) || empty($display->display_options['style_plugin']) || (isset($display->display_options['enabled']) && $display->display_options['enabled'] == FALSE)) { continue; } if ($display->display_plugin != 'feed' && !empty($display->display_options['path']) && !empty($display->display_options['arguments'])) { // Set to the default value, reset below if another value is found. $type = 'month'; foreach ($display->display_options['arguments'] as $name => $argument) { if (!empty($argument['granularity'])) { $type = $argument['granularity']; } } if ($type == $granularity) { $part_path = $display->display_options['path']; $parts = explode('/', $part_path); if (in_array('%', $parts)) { $current_path = parse_url($_GET['q']); $current_parts = explode('/', $current_path['path']); foreach ($parts as $key => $part) { if ($part == '%' && !empty($current_parts[$key])) { $parts[$key] = $current_parts[$key]; } } $part_path = implode('/', $parts); } $paths[$view->name][$granularity] = $part_path; } } } } return $paths[$view->name][$granularity]; } /** * Check to make sure the user has entered a valid 6 digit hex color. */ function calendar_validate_hex_color($element, &$form_state) { if (!$element['#required'] && empty($element['#value'])) { return; } if (!preg_match('/^#(?:(?:[a-f\d]{3}){1,2})$/i', $element['#value'])) { form_error($element, t("'@color' is not a valid hex color", array('@color' => $element['#value']))); } else { form_set_value($element, $element['#value'], $form_state); } }