Drupal → Создание своего типа элемента для использования в формах
Пример модуля, который создаёт элемент (поле) для указания времени. Название элемента — time.

/** * Реализация hook_elements() * Определяем элемент time */ function time_elements() { return array( 'time' => array( '#input' => true, '#process' => array('time_process'), '#element_validate' => array('time_validate'), ) ); } /** * Описание элемента time */ function time_process($element) { $element['#tree'] = true; // true означает что элемент содержит коллекцию элементов // значения выпадающих списков $options24 = array('-' => '-') + drupal_map_assoc(range(0, 23), '_time_format_value'); $options60 = array('-' => '-') + drupal_map_assoc(range(0, 59), '_time_format_value'); // список часов $element['hour'] = array( '#type' => 'select', '#default_value' => $element['#value']['hour'], '#options' => $options24, '#suffix' => ':', ); // список минут $element['min'] = array( '#type' => 'select', '#default_value' => $element['#value']['min'], '#options' => $options60, '#suffix' => ':', ); // список секунд $element['sec'] = array( '#type' => 'select', '#default_value' => $element['#value']['sec'], '#options' => $options60, ); return $element; } /** * Служебная ф-я. Добавляет нули к значениям меньше 10 */ function _time_format_value($value) { return sprintf('%02d', $value); } /** * Реализация hook_theme() */ function time_theme() { return array('time' => array('arguments' => array('element' => null))); } /** * Темизация элемента */ function theme_time($element) { return theme('form_element', $element, '<div class="container-inline">' . $element['#children'] . '</div>'); } /** * Валидация элемента */ function time_validate($element, &$form_state) { if ($element['#value']['hour'] == '-') $form_state['values']['time']['hour'] = ''; if ($element['#value']['min'] == '-') $form_state['values']['time']['min'] = ''; if ($element['#value']['sec'] == '-') $form_state['values']['time']['sec'] = ''; }
Пример использования:
/** * Реализация hook_menu() */ function time_test_menu() { $items['time_test'] = array( 'title' => 'Test time element', 'page callback' => 'drupal_get_form', 'page arguments' => array('time_test_form'), 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } /** * Описание формы */ function time_test_form() { $form['time'] = array( '#type' => 'time', // наш новый тип '#title' => 'Время', '#description' => 'Выберите время', '#required' => true, ); $form['submit'] = array( '#type' => 'submit', '#value' => 'Сохранить', ); return $form; } /** * Submit callback */ function time_test_form_submit($form, &$form_state) { drupal_set_message( $form_state['values']['time']['hour'] . ' часов, ' . $form_state['values']['time']['min'] . ' минут, ' . $form_state['values']['time']['sec'] . ' секунд' ); }
По материалам:
— Create Drupal Form elements like ‘DATE’ element.
— Creating Custom Elements Using Drupal 6.x.
Оставить комментарий