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

Если вы привыкли всегда объявлять для каждой кнопки отдельный 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(). Это сделано для того, чтобы избежать захламления листинга ненужными подробностями в виде второстепенного программного кода.

Drupal Forms API единый обработчик для нескольких кнопок

Согласитесь, что в некоторых случаях этот способ может прогодиться, не правда ли?





© 2012-2014 Druweb.ru. Вы можете спокойно копировать любые материалы сайта только при наличии обратной ссылки.