Обработка нескольких кнопок одним сабмитом в Drupal FAPI на AJAX

Опубликовано: 23.10.2017

Если вы привыкли всегда объявлять для каждой кнопки отдельный HOOK_form_submit(), то текущий материал вам следует внимательно прочитать. Здесь я покажу способ обработки нажатия нескольких кнопок в форме одним единственным сабмитом. Для большего удобства сделаю все это ещё и с AJAX, который предоставляет API Drupal 7.

<?php /** * Объявляем HOOK_form(): */ function druwebru_example_form($form, &$form_state) { $form['#prefix'] = '<div id="custom-form-wrapper">'; $form['#suffix'] = '</div>'; $form['first_button'] = $form['second_button'] = $form['third_button'] = array( '#type' => 'submit', '#ajax' => array( 'wrapper' => 'custom-form-wrapper', 'callback' => 'druwebru_form_wizard_callback', 'progress' => array('type' => 'none'), ), ); $form['first_button']['#name'] = 'first_button'; $form['first_button']['#value'] = 'Первая кнопка'; $form['second_button']['#name'] = 'second_button'; $form['second_button']['#value'] = 'Вторая кнопка'; $form['third_button']['#name'] = 'third_button'; $form['third_button']['#value'] = 'Третья кнопка'; return $form; } /** * Объявляем AJAX callback: */ function druwebru_form_wizard_callback($form, $form_state) { return $form; } /** * Объявляем HOOK_form_submit(): */ function druwebru_example_form_submit($form, &$form_state) { drupal_set_message('Вы выбрали: ' . $form_state['clicked_button']['#value']); switch ($form_state['clicked_button']['#name']) : case 'first_button': drupal_set_message(1); break; case 'second_button': drupal_set_message(2); break; case 'third_button': drupal_set_message(3); break; endswitch; } ?>

Обратите внимание на конструкцию с $form_state['clicked_button']['#name'] .

Однако у этой записи есть и альтернативный вариант с более прозрачной логикой в HOOK_form():

<?php function druwebru_example_form($form, &$form_state) { $form['#prefix'] = '<div id="custom-form-wrapper">'; $form['#suffix'] = '</div>'; $form['first_button'] = array( '#type' => 'submit', '#value' => 'Первая кнопка', '#name' => 'first_button', '#ajax' => array( 'wrapper' => 'custom-form-wrapper', 'callback' => 'druwebru_form_wizard_callback', 'progress' => array('type' => 'none'), ), ); $form['second_button'] = array( '#type' => 'submit', '#value' => 'Вторая кнопка', '#name' => 'second_button', '#ajax' => array( 'wrapper' => 'custom-form-wrapper', 'callback' => 'druwebru_form_wizard_callback', 'progress' => array('type' => 'none'), ), ); $form['third_button'] = array( '#type' => 'submit', '#value' => 'Третья кнопка', '#name' => 'third_button', '#ajax' => array( 'wrapper' => 'custom-form-wrapper', 'callback' => 'druwebru_form_wizard_callback', 'progress' => array('type' => 'none'), ), ); return $form; } ?>

Стоит также отметить, что в данном примере сознательно опущены такие подробности, как HOOK_menu(). Это сделано для того, чтобы избежать захламления листинга ненужными подробностями в виде второстепенного программного кода.

rss