Несколько одинаковых submit-кнопок в форме

Всем известен лозунг о том, что Друпал, будучи открытой системой, обладает обширной и подробной документацией. Безусловно, это так и есть. Тем не менее, работа с этой документацией зачастую происходит в режиме «Слепой котенок vs. Огромный страшный мир». В основном потому, что обширная и подробная документация не очень удачно организована, так что в результате нужные сведения зачастую лежат в странных, неожиданных местах. И спасает зачастую только опыт: если знаешь, где искать — найдешь, а не знаешь — фиг тебе.

Сегодня, к примеру, решал задачу с формой, у которой несколько (переменное число) одинаковых submit-кнопок с одним и тем же submit-обработчиком, который, все же, должен уметь эти кнопки различать. Задачу решал не в первый раз, поэтому знал, что в описание каждой кнопки нужно добавить собственные свойства, содержащие их отличительные черты, например, вот так:

for ($i = 0; $i < $count; $i ++) {
  $form['line_' .$i]['work'] = array(
    '#type' => 'submit',
    '#value' => t('Work'),
    '#line_index' => $i,
    '#name' => 'work_' .$i,
  );
}

И тогда в submit-обработчике можно будет из определенного поля $form_state вынуть ['#line_index'] и понять, какая именно кнопка была нажата.

Однако я напрочь забыл, где именно в должна быть эта информация. На странице Form API, естественно, ничего об этом нет - это ж, понятно, ерунда, зачем о ней в описании форм Друпала писать. В общем, с горем пополам вспомнил, что эти данные были где-то на странице о различиях между Form API пятерки и шестерки:

$form_state['clicked_button']

A full copy of the button element that was clicked to submit the form. This is more reliable than the old $form_values['op'] name, and also carries any additional information that was placed in the button element's form definition.

Помню, с месяц назад меня как раз об этом кто-то спрашивал, а я так и не вспомнил ответ: описание нажатой кнопки полностью, включая все дополнительные и самодельные параметры, передается в $form_state['clicked_button'].

Также важно, чтобы у кнопок были разные имена (свойство '#name'), иначе метод работать не будет.

Теперь не забуду.

Комментарии