form api в drupal 7
TRANSCRIPT
План доклада
1. Что такое Form API, в чем преимущества использования.
2. Процесс построения и обработки формы.
3. Обзор основных свойств и элементов форм.
4. Создание собственного элемента.5. Создание динамических форм.
Form API в Drupal 7
1. Что дает нам FORM API.
Формы создаются в виде структурированных массивов.
Любую форму можно изменять. К любой форме можно добавлять
функции валидации и обработки. Предоставляется встроенная
защита от ряда уязвимостей. Для элементов генерируется
стандартный HTML.
Form API в Drupal 7
2. Процесс построения и обработки формы.
Пример формы
Form API в Drupal 7
function example_nameform($form, &$form_state){
$form['user_name'] = array(
'#title' => t('Your Name'),
'#type' => 'textfield',
'#description' => t('Enter your name.'),
);
$form['submit'] = array( '#type' => 'submit', '#value' => t('Submit') ); return $form;}
Пример формы
Form API в Drupal 7
Функция валидации (validate)
function example_nameform_validate($form, &$form_state){
if (!check_user_name($form_state['values']['user_name'])) { form_set_error('user_name', t('Invalid user name.')); }
}
Form API в Drupal 7
Функция отправки (submit)
function example_nameform_submit($form, &$form_state){
$name = $form_state['values']['user_name']; example_nameform_save($name, $color);
}
Form API в Drupal 7
Обработка форм в Drupal
Инициализация drupal_get_form()
Сбор всех элементов формы
Поиск #validate #submit
Изменения модулями (alter)
Построение формы form_builder()
Выполнение #after_build
Form API в Drupal 7
Обработка форм в Drupal
Отправлена ли форма?
drupal_render() Выполнить #validate
Вернуть html Выполнить #submit
Перенаправить браузер
ДаНет
Form API в Drupal 7
Изменение существующих форм
hook_form_FORM_ID_alterfunction example_form_user_login_block_alter(&$form, &$form_state $form_id){ $form['actions']['submit']['#value'] = t('Sign in');}
hook_form_alterfunction example_form_alter(&$form, &$form_state, $form_id){ if ($form_id == 'user_login_block'){ $form['actions']['submit']['#value'] = t('Sign in'); }}
Form API в Drupal 7
3. Обзор основных свойств и элементов форм
Form API в Drupal 7
Свойства формы и элементов
Свойства корневогоэлемента формы
#action#method#redirect
Свойствадобавляемые ко всемэлементам
#description#attributes#required#tree#parents
Form API в Drupal 7
Свойства, доступные во всех элементах
#type #access #after_build #array_parents #attached #default_value #disabled #elements_validate #parents #post_render
#prefix #pre_render #process #states #suffix #theme #theme_wrappers #title #weight
Form API в Drupal 7
Стандартные элементы формы
Form API в Drupal 7
Стандартные элементы формы
Form API в Drupal 7
4. Создание собственного элемента формы
$form['phone_number'] = array( '#type' => 'example_phone_element', '#title' => t('Discrete phone number'), '#default_value' => array('areacode' => '044',
'extension' => '9999999'), '#description' => t('A phone number'),);
Form API в Drupal 7
Создание собственного элемента формы HOOK_element_info
function example_element_info(){ $types['example_phone'] = array(
'#input' => TRUE, '#process' => array('example_phone__process'), '#element_validate' => array('example_phone_validate'), '#theme_wrappers' => array('example_inline_element'), ); return $types; }
Form API в Drupal 7
Возможные значения элемента по умолчанию:
#input #process #after_build #validate #element_validate
#pre_render #post_render #submit #title_display
Form API в Drupal 7
#process функция элемента
function example_phone_process($element, &$form_state, $form){
$element['#tree'] = TRUE;
$element['areacode'] = array( '#type' => 'textfield', '#size' => 3, '#maxlength' => 3, '#value' => $element['#value']['areacode'], '#required' => TRUE, '#prefix' => '(', '#suffix' => ‘)', );
Form API в Drupal 7
#process функция элемента
$element['extension'] = array( '#type' => 'textfield', '#size' => 7, '#maxlength' => 7, '#value' => $element['#value']['extension'], ); return $element;}
Form API в Drupal 7
Валидация элемента.
function example_phone_validate($element, &$form_state) {
if (!areacode_valid($element['#value']['areacode'])) { form_error($element['areacode'], t('The area code is
invalid.')); } if (!areacode_valid($element['#value']['extension'])) form_error($element['extension'], t('The extension is
invalid.')); }
}
Form API в Drupal 7
5. Создание динамических форм.
Form API в Drupal 7
Свойство #states
Свойство #states
Свойство #statesarray( 'visible' => CONDITIONS, 'checked' => OTHER_CONDITIONS,)
array( 'visible' => array( JQUERY_SELECTOR => REMOTE_CONDITIONS, JQUERY_SELECTOR => REMOTE_CONDITIONS, ... ),)
'#states' => array( 'visible' => array( ':input[name="foo"]' => array('checked' => TRUE), ), ), Form API в Drupal 7
Свойство #states
Состояния элемента формы
disabled required optional visible invisible checked unchecked expanded collapsed
Значения для условий
empty filled checked unchecked expanded collapsed value
Form API в Drupal 7
Создание динамических форм
Form API в Drupal 7
Пример Ajax формы
Form API в Drupal 7
Установка ajax параметров $form['changethis'] = array( // other select options '#ajax' => array( 'callback' => 'ajax_example_callback', 'wrapper' => 'replace_textfield_div', ), ); $form['replace_textfield'] = array( // other textfield options '#prefix' => '<div id="replace_textfield_div">', '#suffix' => '</div>', ); if (!empty($form_state['values']['changethis'])) { $form['replace_textfield']['#description'] = t( "Say why you chose '@value'", array('@value' =>$form_state['values']['changethis']) ); } Form API в Drupal 7
Ajax callback
function ajax_example_callback($form, $form_state) {
return $form['replace_textfield'];
}
Form API в Drupal 7
Этапы обработки ajax
Произошло событие#ajax['event']
ajax запрос по пути #ajax['path'] либо
‘system/ajax’
Обработка ответа
Html заполняет #ajax['wrapper'].
Массив ajax команд выполняется
Параметры #ajax
#ajax['callback'] #ajax['effect'] #ajax['event'] #ajax['keypress'] #ajax['method'] #ajax['path'] #ajax['prevent'] #ajax['progress'] #ajax['trigger_as'] #ajax['wrapper']
Form API в Drupal 7
Ajax commands
function ajax_example_callback($form, $form_state) {
$commands = array(); $commands[] = ajax_command_alert("Alert requested);
return array( '#type' => 'ajax', '#commands' => $commands );
}
Form API в Drupal 7
Информация по темеhttp://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html
http://drupal.org/project/examples
http://drupalace.ru/lesson/sozdanie-svoego-elementa-formy-v-drupal-7-rasshiryaem-forms-api
http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax/7
http://api.drupal.org/api/drupal/includes%21ajax.inc/group/ajax_commands/7
http://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_process_states/7
http://api.drupal.org/api/drupal/modules%21system%21system.api.php/function/hook_element_info/7
Form API в Drupal 7