Drupal 7: Мултисабмит в формах

Average: 4 (8 votes)

Работая над одним проектом столкнулся с такой ситуацией

Имеется форма с тремя кнопками "SEARCH" и для каждой кнопки прописана своя callback функция

Но какую бы я кнопку не нажимал, всегда выполняется последний callback

Пример кода:

/**
 * @param $form
 * @param $form_state
 */
function sm_multisubmit_form($form, &$form_state) {
  $form['text'] = array(
    '#type'         => 'textfield',
    '#title'        => t('Search keyword'),
    '#description'  => t('Input search keys'),
  );

  $form['submit_1'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_form_submit_1')
  );

  $form['submit_2'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_form_submit_2')
  );

  $form['submit_3'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_form_submit_3')
  );

  return $form;

}

/**
 * @param $form
 * @param $for_state
 */
function sm_multisubmit_form_submit_1(&$form, &$form_state) {
  dpm($form_state, 'Выполнен обработчик: ' . __FUNCTION__);
}

/**
 * @param $form
 * @param $for_state
 */
function sm_multisubmit_form_submit_2(&$form, &$form_state) {
  dpm($form_state, 'Выполнен обработчик: ' . __FUNCTION__);
}

/**
 * @param $form
 * @param $for_state
 */
function sm_multisubmit_form_submit_3(&$form, &$form_state) {
  dpm($form_state, 'Выполнен обработчик: ' . __FUNCTION__);
}

Результат работы видно на этом изображении.

поэекспериминтировать можно тут

Не буду томить, расскажу секрет. Он прост - необходимо для каждого поля типа submit задать параметр #name и о чудо все заработает.  Готовый кусок кода ниже, рабочий пример по ссылке

function sm_multisubmit_real_form($form, &$form_state) {
  $form['text'] = array(
    '#type'         => 'textfield',
    '#title'        => t('Search keyword'),
    '#description'  => t('Input search keys'),
  );

  $form['submit_1'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_real_form_submit_1'),
    '#name'         => 'submit_2',
  );

  $form['submit_2'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_real_form_submit_2'), 
    '#name'         => 'submit_2',
  );

  $form['submit_3'] = array(
    '#type'         => 'submit',
    '#value'        => t('Search'),
    '#submit'       => array('sm_multisubmit_real_form_submit_3'),
    '#name'         => 'submit_2',
  );

  return $form;

}

Поделитесь статьей