Как добавить две кнопки отправки в форму Drupal 5? - PullRequest
2 голосов
/ 11 сентября 2009

У меня есть две кнопки отправки в моей форме. Одним из них является обычная кнопка отправки, которая вызывает `my_form_submit` like-ah-so:

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 11 сентября 2009

для 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 это проще сделать с помощью недавно представленных пользовательских обработчиков #submit и #validate для кнопок формы .

3 голосов
/ 13 сентября 2009

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

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


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

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

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

Итак, в вашем случае вы могли бы сделать переключение if / elseif, предложенное ax, или вам нужно было бы сбросить «глобальные» обратные вызовы для формы, явно переместив ее на кнопку отправки по умолчанию:

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

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

После этого ваш опубликованный пример для Большой Красной Кнопки, выполняющей злой план, должен работать как положено;)

...