array( 'label' => t('Time'), 'description' => t('Store a time of day.'), ), ); } /** * Implementation of hook_field(). */ function cck_time_field($op, &$node, $field, &$items, $teaser, $page) { switch ($op) { case 'presave': { if (empty($items)) { return; }; //intentional lack of support for multiple values $items[0]['value'] = $items[0]['hour'] .':'. $items[0]['minute']; if (isset($items[0]['meridien'])) { $items[0]['value'] .= $items[0]['meridien']; }; break; } } } function cck_time_widget_info() { return array( 'cck_time' => array( 'label' => t('Time'), 'field types' => array('text'), 'multiple values' => CONTENT_HANDLE_MODULE, 'callbacks' => array( 'default value' => CONTENT_CALLBACK_DEFAULT, ), ), ); } /** * Implementation of hook_elements(). */ function cck_time_elements() { $elements = array(); $elements['cck_time'] = array( '#input' => TRUE, '#process' => array('cck_time_process'), ); return $elements; } function cck_time_field_formatter_info() { return array( 'default' => array( 'label' => t('Time'), 'field types' => array('cck_time'), ), ); } /** * Theme function for 'default' text field formatter. */ function theme_cck_time_formatter_default($element) { if( empty( $element['#item'] )) { return 'ZZZ'; } $el = $element['#item']; $output = $el['hour'] . ':::' . $el['minute'] . $el['meridien']; print_r($element['#item']); return $output; } /** * Implementation of hook_widget(). */ function cck_time_widget(&$form, &$form_state, $field, $items, $delta = 0) { print_r($element); $element = array( '#type' => $field['widget']['type'], '#default_value' => '' ); //deal with default values when editing a form if (isset($items[$delta]['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) = split(':', $items[$delta]['value']); if ($field['widget']['format'] == 12) { $items[$delta]['minute'] = substr($minute, 0, 2); $items[$delta]['meridien'] = substr($minute, 2, 2); } else { $items[$delta]['minute'] = $minute; } $items[$delta]['hour'] = $hour; $element['#default_value'] = $items[$delta]; } elseif (isset($items[$delta])) { //the CCK field was added later to the node; the field is empty -> get the default values $element['#default_value'] = $field['widget']['default_value'][0]; } return $element; } /** * Implementation of hook_theme(). */ function cck_time_theme() { return array( 'cck_time_formatter_default' => array( 'arguments' => array('element' => NULL), ), ); } function theme_cck_time_widget(&$element) { return theme( 'form_element', $element, $element['#children'] ); } function cck_time_process($element, $edit, $form_state, $form) { $field_name = $element['#field_name']; $field = $form['#field_info'][$element['#field_name']]; $delta = $element['#delta']; $clock = isset($field['widget']['format']) ? (int) $field['widget']['format'] : 24; $increment = isset($field['widget']['increment']) ? (int) $field['widget']['increment'] : 1; if($increment < 1) { $increment = 1; } switch ( $clock ) { case 12 : $h_min = 1; $h_max = 12; break; case 24 : default; $h_min = 0; $h_max = 23; break; } // hours $hours[-1] = '--'; for ($i = $h_min; $i <= $h_max; $i++) { if ($clock == 24) { $val = ($i < 10) ? "0$i" : $i; $hours[$val] = $val; } else { $hours[$i] = $i; } } // minutes $minutes[-1] = '--'; for ($i = 0; $i <= 59; $i+=$increment) { $val = ($i < 10) ? "0$i" : $i; $minutes[$val] = $val; } $form = array(); $element['#type'] = 'fieldset'; $element['#attributes'] = array('class' => 'cck-time'); $element['#title'] = t($field['widget']['label']); $element['hour'] = array( '#type' => 'select', '#title' => '', '#options' => $hours, '#required' => $element['#required'], '#field_name' => $element['#field_name'], '#type_name' => $element['#type_name'], '#delta' => $element['#delta'], '#default_value' => isset($element['#value']) ? $element['#value'] : NULL, '#prefix' => '
', '#suffix' => '
', ); $element['minute'] = array( '#type' => 'select', '#title' => '', '#options' => $minutes, '#required' => $element['#required'], '#field_name' => $element['#field_name'], '#type_name' => $element['#type_name'], '#delta' => $element['#delta'], '#default_value' => isset($element['#value']) ? $element['#value'] : NULL, '#prefix' => '
', '#suffix' => '
', ); if ($clock == 12) { $element['meridien'] = array( '#type' => 'select', '#title' => '', '#options' => array('AM' => 'AM', 'PM' => 'PM'), '#required' => $element['#required'], '#field_name' => $element['#field_name'], '#type_name' => $element['#type_name'], '#delta' => $element['#delta'], '#default_value' => isset($element['#value']) ? $element['#value'] : NULL, '#prefix' => '
', '#suffix' => '
', ); }; return $element; } function cck_time_widget_settings($op, $widget) { switch ($op) { case 'callbacks': return array('default value' => CONTENT_CALLBACK_CUSTOM); case 'form': $form = array(); $form['cck_time']['format'] = array( '#type' => 'select', '#title' => t('Time format'), '#default_value' => isset($widget['format']) ? $widget['format'] : 1, '#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).'), ); $form['cck_time']['increment'] = array( '#type' => 'select', '#title' => t('Minute increment'), '#default_value' => isset($widget['increment']) ? $widget['increment'] : 1, '#options' => array(1 => 1, 5 => 5, 10 => 10, 15 => 15, 30 => 30), '#description' => t('Increment the minute values by this amount.'), ); return $form; case 'validate': $format_OK = array('12', '24'); $increment_OK = array('1', '5', '10', '15', '30'); if (!in_array( $widget['format'], $format_OK) || !in_array( $widget['increment'], $increment_OK)) { form_set_error('','There was a a problem with the time settings. Please check your values.'); } break; case 'save': return array('increment', 'format'); } } /** * Implementation of hook_content_is_empty(). */ function cck_time_content_is_empty($item, $field) { if (empty($item['value'])) { return TRUE; } return FALSE; } /** * FAPI theme for an individual text elements. */ function theme_cck_time($element) { return $element['#children']; } function cck_time_field_settings($op, $field) { switch ($op) { case 'callbacks': { return array('default value' => CONTENT_CALLBACK_CUSTOM); break; } case 'form': { $form = array(); $form['cck_time']['format'] = array( '#type' => 'select', '#title' => t('Time format'), '#default_value' => isset($field['format']) ? $field['format'] : 1, '#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).'), ); $form['cck_time']['increment'] = array( '#type' => 'select', '#title' => t('Minute increment'), '#default_value' => isset($field['increment']) ? $field['increment'] : 1, '#options' => array(1 => 1, 5 => 5, 10 => 10, 15 => 15, 30 => 30), '#description' => t('Increment the minute values by this amount.'), ); return $form; break; } case 'validate': { $format_OK = array('12', '24'); $increment_OK = array('1', '5', '10', '15', '30'); if (!in_array( $field['format'], $format_OK) || !in_array( $field['increment'], $increment_OK)) { form_set_error('','There was a a problem with the time settings. Please check your values.'); } break; } case 'save': { return array('increment', 'format'); break; } case 'database columns': { $columns['value'] = array('type' => 'varchar', 'length' => 10, 'not null' => FALSE, 'sortable' => TRUE); return $columns; break; } } }