Active
Project:
CCK Time
Version:
7.x-1.0-beta3
Component:
Code
Priority:
Normal
Category:
Feature request
Assigned:
Unassigned
Reporter:
Created:
5 Apr 2012 at 20:22 UTC
Updated:
5 Apr 2012 at 20:22 UTC
I modified the module to store both 12hr and 24 hr formats as 24 hour in the database so that views can sort by time if 12 hour.
Who knows if this is solid code but it works for my needs.
/**
* @file
* Creates a time widget for CCK text fields
*
* @author
* steve@openconcept.ca
*/
/**
* Implements hook_field_info().
*/
function cck_time_field_info() {
return $info = array(
'cck_time' => array(
'label' => t('Time'),
'description' => t('Store a time of day.'),
'translatable' => 0,
'settings' => array('format' => 24, 'increment' => 1),
'instance_settings' => array(),
'default_widget' => 'cck_time_select',
'default_formatter' => 'cck_time_default',
),
);
}
/**
* Implements hook_field_settings_form().
*/
function cck_time_field_settings_form($field, $instance, $has_data) {
$settings = $field['settings'];
$form = array();
$form['format'] = array(
'#type' => 'select',
'#title' => t('Time format'),
'#default_value' => $settings['format'],
'#options' => array(24 => '24-hour (23:59)', 12 => '12-hour (12:59AM)'),
'#description' => t('Record times in 24-hour format or in 12-hour format (with AM/PM).'),
'#element_validate' => array('cck_time_settings_format_validate'),
);
$form['increment'] = array(
'#type' => 'select',
'#title' => t('Minute increment'),
'#default_value' => $settings['increment'],
'#options' => array(1 => 1, 5 => 5, 10 => 10, 15 => 15, 30 => 30),
'#description' => t('Increment the minute values by this amount.'),
'#element_validate' => array('cck_time_settings_increment_validate'),
);
return $form;
}
/**
* Implements hook_field_instance_settings_form().
*/
function cck_time_field_instance_settings_form($field, $instance) {
return $form = array();
}
/**
* Validate the field settings form format element.
*/
function cck_time_settings_format_validate($element, &$form_state) {
$format_ok = array('12', '24');
if (!in_array($element['#value'], $format_ok)) {
form_set_error('', 'There was a a problem with the time settings. Please check your values.');
}
}
/**
* Validate the field instance settings form increment element.
*/
function cck_time_settings_increment_validate($element, &$form_state) {
$increment_ok = array('1', '5', '10', '15', '30');
if (!in_array($element['#value'], $increment_ok)) {
form_set_error('', 'There was a a problem with the time settings. Please check your values.');
}
}
/**
* Implements hook_field_is_empty().
*/
function cck_time_field_is_empty($item, $field) {
if ($item['hour'] === '' || $item['minute'] === '') {
return TRUE;
}
return FALSE;
}
/**
* Implements hook_field_presave().
*/
function cck_time_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
if (empty($items)) {
return;
}
if (($items[0]['hour'] === '') || ($items[0]['minute'] === '')) {
return;
}
//intentional lack of support for multiple values
$items[0]['value'] = DATE("H:i", STRTOTIME($items[0]['hour'] . ':'. $items[0]['minute'] .' '. $items[0]['meridiem']));
}
/**
* Implements hook_field_widget_info().
*/
function cck_time_field_widget_info() {
return $info = array(
'cck_time_select' => array(
'label' => t('Time'),
'field types' => array('cck_time'),
),
);
}
/**
* Implements hook_field_widget_form().
*/
function cck_time_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$element += array(
'#type' => 'cck_time_select',
'#default_value' => ''
);
//deal with default values when editing a form
if (isset($items[0]['value'])) {
//value comes from a previously stored node with this cck field;
//divide the single string value from the database into its drop-down boxes on the form
list($hour, $minute) = explode(':', $items[0]['value']);
if ($field['settings']['format'] == 12) {
$items[0]['minute'] = substr($minute, 0, 2);
$items[0]['meridiem'] = substr($minute, 2, 2);
}
else {
$items[0]['minute'] = $minute;
}
$items[0]['hour'] = $hour;
$element['#default_value'] = $items[0];
}
elseif (isset($items[0]['hour'])) {
//brand-new node: assign the default values from the cck field setup form that
//happen to be stored in $items[0]
$element['#default_value'] = $items[0];
}
elseif (!$instance['required']) {
//CCK field not required, so could be empty intentionally
$element['#default_value'] = array('hour' => '', 'minute' => '');
}
elseif (isset($items[0])) {
//the CCK field was added later to the node; the field is empty -> get the default values
$element['#default_value'] = $instance['widget']['default_value'][0];
}
return $element;
}
/**
* Implements hook_field_formatter_info().
*/
function cck_time_field_formatter_info() {
return $info = array(
'cck_time_default' => array(
'label' => t('Time'),
'field types' => array('cck_time'),
),
);
}
/**
* Implements hook_field_formatter_settings_form().
*/
function cck_time_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
return $form = array();
}
/**
* Implements hook_field_formatter_settings_summary().
*/
function cck_time_field_formatter_settings_summary($field, $instance, $view_mode) {
return $summary = t('No summary available.');
}
/**
* Implements hook_field_formatter_view().
*/
function cck_time_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
foreach ($items as $item) {
$element[]['#markup'] = theme('cck_time_formatter_default', array('item' => DATE("g:i a", STRTOTIME($item['value']))));
}
return $element;
}
/**
* Implements hook_element_info().
*/
function cck_time_element_info() {
$elements = array();
$elements['cck_time_select'] = array(
'#input' => TRUE,
'#columns' => array('value'),
'#delta' => 0, //new from text.module
'#process' => array('cck_time_select_process'),
'#theme_wrappers' => array('form_element'),
);
return $elements;
}
/**
* Process the element before displaying the field.
*/
function cck_time_select_process($element, &$form_state, $form) {
// to do: add CSS using #attach.
drupal_add_css(drupal_get_path('module', 'cck_time') . '/cck_time.css', 'module', 'screen', FALSE);
$field = field_widget_field($element, $form_state);
$instance = field_widget_instance($element, $form_state);
$delta = $element['#delta'];
$required = ($delta == 0 && $instance['required']) ? $element['#required'] : FALSE;
$format = $field['settings']['format'];
$increment = $field['settings']['increment'];
if ($increment < 1) {
$increment = 1;
}
switch ($format) {
case 12 :
$h_min = 1;
$h_max = 12;
break;
case 24 :
default;
$h_min = 0;
$h_max = 23;
break;
}
// hours
$hours = $required ? array() : array('' => '');
for ($i = $h_min; $i <= $h_max; $i++) {
if ($format == 24) {
$val = ($i < 10) ? "0$i" : $i;
$hours[$val] = $val;
}
else {
$hours[$i] = $i;
}
}
// minutes
$minutes = $required ? array() : array('' => '');
for ($i = 0; $i <= 59; $i+=$increment) {
$val = ($i < 10) ? "0$i" : $i;
$minutes[$val] = $val;
}
$element['#type'] = 'fieldset';
$element['#tree'] = TRUE;
$element['#attributes'] = array('class' => 'cck-time');
$element['#title'] = $instance['label'];
$element['hour'] = array(
'#type' => 'select',
'#title' => t('Hour'),
'#title_display' => 'invisible',
'#options' => $hours,
'#required' => $required,
'#default_value' => isset($element['#value']['hour']) ? DATE("g", STRTOTIME($element['#value']['hour'].':00'. $element['#value']['meridiem'])) : NULL,
'#prefix' => '<div class="cck-time-element">',
'#suffix' => '</div>',
);
$element['minute'] = array(
'#type' => 'select',
'#title' => t('Minute'),
'#title_display' => 'invisible',
'#options' => $minutes,
'#required' => $required,
'#default_value' => isset($element['#value']['minute']) ? $element['#value']['minute'] : NULL,
'#prefix' => '<div class="cck-time-element">',
'#suffix' => '</div>',
);
if ($format == 12) {
$element['meridiem'] = array(
'#type' => 'select',
'#title' => t('Meridiem'),
'#title_display' => 'invisible',
'#options' => array('AM' => 'AM', 'PM' => 'PM'),
'#required' => $required,
'#default_value' => isset($element['#value']['meridiem']) ? DATE("A", STRTOTIME($element['#value']['hour'].':00'. $element['#value']['meridiem'])) : NULL,
'#prefix' => '<div class="cck-time-element">',
'#suffix' => '</div>',
);
}
return $element;
}
/**
* Implements hook_theme().
*/
function cck_time_theme() {
return array(
'cck_time_select' => array(
'render element' => 'element',
),
'cck_time_formatter_default' => array(
'variables' => array('item' => 'foobar'),
),
);
}
/**
* Theme function for 'default' text field formatter.
*/
function theme_cck_time_formatter_default($variables) {
return '<span>' . $variables['item'] . '</span>';
}
/**
* FAPI theme for an individual text element.
*/
function theme_cck_time_select($variables) {
//no idea what should go in here; the date module suggests
//that one moves the fieldset declaration in here
return $variables['element']['#children'];
}