Обработка нескольких кнопок отправки в Drupal form API - PullRequest
27 голосов
/ 21 декабря 2010

У меня есть 2 кнопки отправки и я хочу выполнять различные действия для каждой кнопки отправки.Здесь я хочу установить поля формы, что можно сделать только в form_alter ().Кто-нибудь может подсказать, как проверить наличие нескольких кнопок отправки в функции form_alter ()?

Я использовал

function myform_form_submit($formID, &$form_state) {
if($form_state['clicked_button']['#value'] == $form_state['values']['submit_one'])    //if button 1      is clicked
     $form_state['redirect'] = 'mypath/page_one';   //redirect to whatever page you want
 else if($form_state['clicked_button']['#value'] == $form_state['values']['submit_two'])  /if button      2 is clicked
    $form_state['redirect'] = 'mypath/page_two';
 }

, но это не работает

Ответы [ 3 ]

51 голосов
/ 23 декабря 2010

Лучшее, что нужно сделать, если у вас есть две кнопки отправки в форме и вы хотите, чтобы они делали разные вещи, - это создать отдельную функцию отправки для каждой кнопки и соединить их. Одна из приятных особенностей FormAPI заключается в том, что он автоматически связывает форму с обработчиком отправки, но если у вас есть две кнопки отправки, вы хотите перейти в новое место.

Итак, код вашей формы может содержать:

$form['submit_one'] = array(
  '#type' => 'submit',
  '#value' => t('Submit One'),
  '#submit' => array('my_module_form_submit_one'),
);
$form['submit_two'] = array(
  '#type' => 'submit',
  '#value' => t('Submit Two'),
  '#submit' => array('my_module_form_submit_two'),
);

Но я не знаю, что вы имеете в виду под form_alter () - нет причин использовать какой-либо вид изменения формы.

Редактировать: Как уже упоминалось в комментариях - если вам нужны разные функции проверки для двух кнопок, вы также можете включить '#validate' => array('my module_form_validate_one') и '#validate' => array('my module_form_validate_two') в соответствующие массивы кнопок. Но это не обязательно, и если стандартная функция проверки правильности формы работает нормально, тогда используйте это.

15 голосов
/ 08 декабря 2011

Если вы хотите обрабатывать различные нажатия кнопки отправки в рамках одной функции отправки, вы можете проверить:

if($form_state['values']['op'] == BUTTON_ONE_VALUE){
} else if($form_state['values']['op'] == BUTTON_TWO_VALUE){
}

Или вы можете сначала назначить определенное свойство кнопке, а затем проверить:

$form_state['triggering_element']['#attributes'][YOUR_PROPERTY] == VALUE

Я использую Drupal 7 ... Надеюсь, это поможет

3 голосов
/ 23 ноября 2013

Несмотря на то, что принятый ответ правильный, следует отметить, что вы должны передавать разные значения для каждой из ваших кнопок отправки, иначе используемая функция отправки будет последней определенной кнопкой отправки.

Другими словами, если значение обеих кнопок отправки равно «Отправить», то будет вызываться только вторая функция отправки, независимо от того, какая кнопка нажата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...