Подтвердить что ты не робот

Обрабатывать несколько кнопок отправки в API формы Drupal

У меня есть 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';
 }

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

4b9b3361

Ответ 1

Лучшее, что нужно сделать, если у вас есть две кнопки отправки в форме и хотите, чтобы они делали разные вещи, - создать другую функцию отправки для каждой кнопки и подключить их. Одна из приятных вещей в 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') в соответствующие массивы кнопок. Но это не требуется, и если стандартная функция проверки формы отлично работает, то идите с этим.

Ответ 2

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

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

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

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