View source
<?php
define('FULLCALENDAR_PATH', 'sites/all/libraries/fullcalendar');
define('FULLCALENDAR_MIN_PLUGIN_VERSION', '1.4.10');
function fullcalendar_views_api() {
return array(
'api' => '2',
'path' => drupal_get_path('module', 'fullcalendar'),
);
}
function fullcalendar_library() {
$libraries['fullcalendar'] = array(
'title' => 'FullCalendar',
'website' => 'http://arshaw.com/fullcalendar',
'version' => FULLCALENDAR_MIN_PLUGIN_VERSION,
'js' => array(
fullcalendar_get_js_path() => array(),
),
'css' => array(
variable_get('fullcalendar_path', FULLCALENDAR_PATH) . '/fullcalendar.css' => array(
'type' => 'file',
'media' => 'screen',
),
drupal_get_path('module', 'fullcalendar') . '/fullcalendar.custom.css' => array(
'type' => 'file',
'media' => 'screen',
),
),
'dependencies' => array(
array(
'system',
'ui.draggable',
),
array(
'system',
'ui.droppable',
),
array(
'system',
'ui.resizable',
),
array(
'system',
'effects.highlight',
),
),
);
return $libraries;
}
function fullcalendar_permission() {
return array(
'update any fullcalendar event' => array(
'title' => t('Update any FullCalendar event'),
'description' => t('Allow user to edit events, ignoring other permissions.'),
),
);
}
function fullcalendar_menu() {
$items = array();
$items['admin/config/calendar'] = array(
'title' => 'Calendar',
'description' => 'Settings for calendars.',
'page callback' => 'system_admin_menu_block_page',
'access arguments' => array(
'access administration pages',
),
'file' => 'system.admin.inc',
'file path' => drupal_get_path('module', 'system'),
);
$items['admin/config/calendar/fullcalendar'] = array(
'title' => 'FullCalendar',
'description' => 'Adjust FullCalendar settings.',
'file' => 'fullcalendar.admin.inc',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'fullcalendar_admin_settings',
),
'access arguments' => array(
'administer site configuration',
),
);
$items['fullcalendar/ajax/update/%/%node'] = array(
'title' => 'Update event',
'description' => 'Save the updated event datetime.',
'page callback' => 'fullcalendar_update',
'page arguments' => array(
3,
4,
),
'access callback' => '_fullcalendar_update_access',
'access arguments' => array(
4,
),
'type' => MENU_CALLBACK,
);
return $items;
}
function fullcalendar_update($action, $node) {
$field = $_POST['field'];
$index = $_POST['index'];
$all_day = isset($_POST['all_day']) ? $_POST['all_day'] : '';
$day_delta = $_POST['day_delta'];
$minute_delta = $_POST['minute_delta'];
if (!empty($field) && isset($index)) {
$langcode = field_language('node', $node, $field);
$old_start = $node->{$field}[$langcode][$index]['value'];
$old_end = $node->{$field}[$langcode][$index]['value2'];
switch ($action) {
case 'drop':
$node->{$field}[$langcode][$index]['value'] = date('Y-m-d H:i:s', strtotime($old_start . ' ' . $day_delta . ' days ' . $minute_delta . ' minutes'));
$node->{$field}[$langcode][$index]['value2'] = date('Y-m-d H:i:s', strtotime($old_end . ' ' . $day_delta . ' days ' . $minute_delta . ' minutes'));
break;
case 'resize':
$node->{$field}[$langcode][$index]['value2'] = date('Y-m-d H:i:s', strtotime($old_end . ' ' . $day_delta . ' days ' . $minute_delta . ' minutes'));
break;
}
node_save($node);
drupal_json_output(array(
'msg' => 'The new event time has been saved. [<a href="javascript:void(0);" class="fullcalendar-status-close">close</a>]',
));
}
}
function fullcalendar_theme() {
return array(
'fullcalendar_classname' => array(
'variables' => array(
'node' => NULL,
),
),
'fullcalendar_link' => array(
'variables' => array(
'node' => NULL,
'attributes' => NULL,
'index' => NULL,
),
),
);
}
function theme_fullcalendar_classname($variables) {
$node = $variables['node'];
$className = array(
'fc-event-default',
$node->type,
);
return implode(' ', $className);
}
function template_preprocess_views_view_fullcalendar(&$vars) {
$settings = array(
'defaultView' => $vars['options']['display']['fc_view'],
'firstDay' => $vars['options']['display']['fc_firstday'],
'weekMode' => $vars['options']['display']['fc_weekmode'],
'theme' => $vars['options']['modules']['fc_theme'],
'colorbox' => $vars['options']['modules']['fc_url_colorbox'],
'left' => $vars['options']['header']['fc_left'],
'center' => $vars['options']['header']['fc_center'],
'right' => $vars['options']['header']['fc_right'],
'year' => $vars['options']['defaults']['fc_year'],
'month' => $vars['options']['defaults']['fc_month'],
'day' => $vars['options']['defaults']['fc_day'],
'agenda' => $vars['options']['times']['fc_timeformat'],
'clock' => $vars['options']['times']['fc_clock'],
'monthNames' => array_values(date_month_names(TRUE)),
'monthNamesShort' => array_values(date_month_names_abbr(TRUE)),
'dayNames' => date_week_days(TRUE),
'dayNamesShort' => date_week_days_abbr(TRUE),
'allDayText' => t('All day'),
'dayString' => t('Day'),
'weekString' => t('Week'),
'monthString' => t('Month'),
'todayString' => t('Today'),
);
drupal_add_library('fullcalendar', 'fullcalendar');
drupal_add_js(array(
'fullcalendar' => $settings,
), 'setting');
drupal_add_js(drupal_get_path('module', 'fullcalendar') . '/fullcalendar.views.js');
}
function template_preprocess_views_view_node_fullcalendar(&$vars) {
$entity_type = 'node';
if (isset($vars['view']->empty_text)) {
$vars['empty_text'] = $vars['view']->empty_text;
return;
}
$nid = $vars['row']->{$vars['field_alias']};
if (!is_numeric($nid)) {
return;
}
$node = node_load($nid);
if (empty($node)) {
return;
}
$node->editable = _fullcalendar_update_access($node);
$node->class = theme('fullcalendar_classname', array(
'node' => $node,
));
$vars['node'] = $node;
$vars['data'] = array();
$node->url = 'node/' . $nid;
if ($url_field = $vars['options']['fullcalendar_url_field']) {
if ($url_field = field_get_items('node', $node, $url_field)) {
$vars['url'] = $url_field[0]['value'];
}
}
$title_field = $vars['options']['fullcalendar_title_field'];
if (!empty($title_field) && !empty($node->{$title_field}[0]['value'])) {
$node->title = $node->{$title_field}[0]['value'];
}
$display_field = fullcalendar_date_fields($node);
$field_names = trim(strip_tags($vars['options']['fullcalendar_date_fields']));
if (!empty($field_names)) {
foreach (explode("\n", $field_names) as $field_name) {
$field_name = trim(strip_tags($field_name));
if ($field_name == 'created' || $field_name == 'changed') {
$attributes = _fullcalendar_set_display_times($entity_type, $node, $field_name);
$vars['data'][] = theme('fullcalendar_link', array(
'node' => $node,
'attributes' => $attributes,
'index' => 0,
));
$display_field = array();
break;
}
if (isset($display_field[$field_name])) {
$display_field = array(
$field_name => $display_field[$field_name],
);
break;
}
}
}
foreach ($display_field as $field_name => $field) {
$instance = field_info_instance($entity_type, $field_name, $node->type);
$items = field_get_items($entity_type, $node, $field_name);
if (!empty($items)) {
foreach ($items as $index => $item) {
$vars['data'][] = theme('fullcalendar_link', array(
'node' => $node,
'attributes' => _fullcalendar_set_display_times($entity_type, $node, $field_name, $instance, $field, $item),
'index' => $index,
));
}
}
break;
}
}
function _fullcalendar_set_display_times($entity_type, $entity, $field_name, $instance = NULL, $field = NULL, $item = NULL) {
if (is_array($entity->{$field_name})) {
$date = date_formatter_process(NULL, $entity_type, $entity, $field, $instance, $entity->language, $item, NULL);
$date1 = $date['value']['local']['object'];
$date2 = $date['value2']['local']['object'];
}
else {
$date1 = new DateObject($entity->{$field_name}, date_default_timezone(), DATE_FORMAT_UNIX);
$date2 = $date1;
}
return array(
'field' => $field_name,
'allDay' => date_field_all_day($field, $instance, $date1, $date2),
'start' => $date1,
'end' => $date2,
'nid' => $entity->nid,
'cn' => $entity->class,
'title' => $entity->title,
'class' => 'fullcalendar_event_details',
'editable' => $entity->editable,
);
}
function theme_fullcalendar_link($variables) {
$node = $variables['node'];
$attributes = $variables['attributes'];
$index = $variables['index'];
$text = date_format_date($attributes['start']);
if (!$attributes['allDay']) {
$text .= ' to ' . date_format_date($attributes['end']);
}
$attributes['index'] = $index;
$attributes['start'] = $attributes['start']
->format(DATE_FORMAT_DATETIME);
$attributes['end'] = $attributes['end']
->format(DATE_FORMAT_DATETIME);
return l($text, $node->url, array(
'attributes' => $attributes,
));
}
function _fullcalendar_update_access($node) {
global $user;
if (!empty($node) && (user_access('administer nodes') || user_access('update any fullcalendar event') || user_access('edit any ' . $node->type . ' content') || user_access('edit own ' . $node->type . ' content') && $node->uid == $user->uid)) {
return TRUE;
}
return FALSE;
}
function fullcalendar_date_fields($entity, $entity_type = 'node') {
$bundle = '';
switch ($entity_type) {
case 'node':
$bundle = $entity->type;
break;
}
$fields = array();
foreach (array_keys(field_info_instances($entity_type, $bundle)) as $field_name) {
$field = field_info_field($field_name);
if (in_array($field['type'], array(
'date',
'datestamp',
'datetime',
))) {
$fields[$field_name] = $field;
}
}
return $fields;
}
function _fullcalendar_status() {
$status = array();
$status['fullcalendar_plugin'] = FALSE;
if (version_compare(fullcalendar_get_version(), FULLCALENDAR_MIN_PLUGIN_VERSION, '>=')) {
$status['fullcalendar_plugin'] = TRUE;
}
return $status;
}
function fullcalendar_get_version($fullcalendar_path = NULL) {
$version = 0;
$pattern = '#FullCalendar v([0-9\\.a-z]+)#';
if (is_null($fullcalendar_path)) {
$fullcalendar_path = fullcalendar_get_js_path();
}
$fullcalendar_plugin = file_get_contents($fullcalendar_path, NULL, NULL, 0, 40);
if (preg_match($pattern, $fullcalendar_plugin, $matches)) {
$version = $matches[1];
}
return $version;
}
function fullcalendar_get_js_path() {
$fullcalendar_file = array(
'none' => 'fullcalendar.js',
'min' => 'fullcalendar.min.js',
);
return variable_get('fullcalendar_path', FULLCALENDAR_PATH) . '/' . $fullcalendar_file[variable_get('fullcalendar_compression_type', 'min')];
}