2009-09-11 4 views
2

У меня есть две кнопки отправки в моей форме. Одним из них является нормальной кнопкой отправки, которая вызывает `my_form_submit` нравится-а-а-так:Как добавить две кнопки отправки в форму Drupal 5?

$form['fieldset']['submit'] = array(
    '#type' => 'submit', 
    '#value' => 'Show Applications', 
); 

Я хочу добавить еще одну кнопки, которая будет представлять форму, но вызовет другой обработчик представить. Есть какой-либо способ сделать это? Я посмотрел на добавление #submit свойство элемента, как-а-а-так:

$form['fieldset']['evil_plan'] = array(
    '#type' => 'submit', 
    '#value' => 'Big Red Button', 
    '#submit' => array('steal_formula_for_icantbeliveitsnotbutter'), 
); 

надеясь вызвать `steal_formula_for_icantbeliveitsnotbutter` функцию, но не worky. Когда я нажимаю кнопку Big Red, вызывается обычная функция `my_form_submit`, которая возвращает мой план сделать миллионы из заменителя масла. Кто может пролить свет на этот темный беспорядок?

ответ

4

для Drupal 5, это единственное решение:

function my_form_submit($form_id, $form_values) { 
    if ($form_values['op'] == 'Show Applications') { 
    // handle 'Show Applications' submission 
    } 
    elseif ($form_values['op'] == 'Big Red Button') { 
    // handle 'Big Red Button' submission 
    } 
} 

же для my_form_validate.

в Drupal 6, это проще сделать с недавно введенным custom #submit and #validate handlers for form buttons.

+0

Я пытался избежать делать это в том же отправьте функцию. Неужели нет способа перенаправить его на другую функцию отправки, не пройдя обычную? – jergason

+0

+1, поскольку это был исходный и правильный ответ Drupal 5! (Теперь, если вы только что упомянули, что вы проверили разницу 5/6, я бы не вмешался в первую очередь;) –

+0

всегда старался быть как можно более кратким :) tnx для +1. –

3

Edit: Пристальной проверка формы API документации показала, что мой первоначальный ответ ниже действителен для Drupal 6, но только частично справедлив для Drupal 5. Сравнивая Drupal 5 docs с Drupal 6 docs показывает, что в Drupal 5, вы можете только регистрировать функции обратного вызова в самой форме - свойство #submit кнопки - это просто логическое значение, указывающее, что кнопка должна обрабатываться как кнопка отправки. Таким образом, добавление «обратная связь» для каждой кнопки - это только функция Drupal 6!

Для данного вопроса, это означает, что есть только если/ElseIf варианта, предложенный топор, или изменение регистрации два представить обратные вызовы для формы, каждый из проверки, если они вызываются для правой кнопки (в основном версия if/elseif, но с использованием двух отдельных обратных вызовов).


(первоначальный ответ)

Есть несколько механизмов, на работе здесь:

  1. Submit (и подтвердить) обратные вызовы могут быть зарегистрированы для отдельных кнопок, но и для самой формы ($form['#submit']). Те, которые зарегистрированы для формы, вызываются для каждой кнопки отправки, те, которые зарегистрированы для отдельной кнопки только для этого. (ПРИМЕЧАНИЕ: Важное различие Drupal 5/6 здесь см. В разделе ниже).
  2. Обработка формы по умолчанию (отправка и проверка функций, названных в честь формы), выполняется Drupal, автоматически добавляя обратные вызовы для форм в формы '#submit' и '#validate' массивов.
  3. Регистрация использует массивы, чтобы разрешить несколько функций отправки/проверки, вызываемых один за другим (в том же порядке, что и в массиве).

Так что в вашем случае, вы могли бы сделать, если/ELSEIF переключатель, предложенный топором, или вам нужно, чтобы сбросить на «глобальные» обратные вызовы для формы, перемещая ее в явном виде по умолчанию кнопка отправки:

$form['fieldset']['submit']['#submit'] = $form['#submit']; 
unset($form['#submit']; 

(то же самое для VALIDATE обратных вызовов)

После этого Опубликованная пример для Big Red Button, выполняющей коварный план должен работать, как ожидалось;)

+0

Это имеет смысл. Таким образом, обратные вызовы $ form ['# submit'] (и проверки) переопределяют отдельные элементы. Есть ли # callidate callback, который мне нужно установить? – jergason

+0

Yup, проверка выполняется по тому же механизму, поэтому, если вам нужна проверка использования, вы бы сделали то же самое для обратных вызовов проверки. –

+0

Oups, просто наткнувшись на разницу Drupal 5/6 в этом контексте, см. В разделе «Подробности». –

Смежные вопросы