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' => '