Почему «запускающий элемент» в $ form_state является последней кнопкой на форме? - PullRequest
3 голосов
/ 29 июня 2011

У меня есть mymodule_field_widget_form (), которая создает текстовое поле для автозаполнения, и 3 кнопки для настраиваемого поля. На 2 кнопках я использую функции обратного вызова ajax, которые вызывают пользовательские команды ajax. Когда выполнение функции входит в функцию обратного вызова любой из кнопок, $ form_state ['triggering_element'] всегда одинаков, последняя кнопка (элемент формы ...?) В форме, которая была создана хуком выше. Я хотел бы получить элемент, который фактически вызвал обратный вызов. Возможно, это настраиваемое поле добавляется в тип содержимого более одного раза, и поэтому оно важно. Пользовательская команда ajax создает диалог пользовательского интерфейса jQuery с содержимым iframe или обычным html, в зависимости от нескольких факторов, поэтому я подумал, что нет необходимости повторно отображать всю форму, в которой была нажата кнопка. На самом деле нигде нет повторного рендеринга, может в этом проблема?

Приветствия

Ответы [ 2 ]

8 голосов
/ 29 июня 2011

Установите #default_value, как рекомендовано Spudley, и установите для атрибута #name нечто уникальное (используйте параметр $delta).

5 голосов
/ 29 июня 2011

Когда выполнение функции входит в функцию обратного вызова любой из кнопок, $ form_state ['triggering_element'] всегда одинакова, последняя кнопка

Это, к сожалению, как работает API форм Drupal. Если у вас есть несколько кнопок отправки в форме, вы иногда не можете определить, какая из них была нажата.

Во-первых, посмотрите этот ответ на Drupal.org , который, я думаю, может вам помочь:

Посмотрите в вашем коде настройки формы. Где вы определяете различные кнопки, измените '#value' на '#default_value'. Это позволит Drupal распознавать, что значение поля (т. Е. Значение отправки формы) может измениться, и поэтому оно не будет зафиксировано на значении последней кнопки независимо от того, какая кнопка была нажата.


Если это не поможет, вот несколько других решений, которые могут помочь:

  1. Посмотрите прямо на массив PHP $_POST, чтобы узнать, какая кнопка была нажата. Это работает, но идет вразрез с "The Drupal Way". Весь смысл API форм в Drupal состоит в том, чтобы скрыть от вас необработанную функциональность PHP. Но в такие моменты может быть полезно взглянуть на это.

  2. Положите кнопки в отдельные формы. Это, очевидно, будет работать только в том случае, если вам не нужно одновременно отправлять какие-либо другие поля.

  3. Создайте скрытое поле в вашей форме и используйте Javascript, чтобы заполнить его именем нажатой кнопки непосредственно перед отправкой формы.

Надеюсь, это поможет.

...