Всем известен лозунг о том, что Друпал, будучи открытой системой, обладает обширной и подробной документацией. Безусловно, это так и есть. Тем не менее, работа с этой документацией зачастую происходит в режиме «Слепой котенок 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'
), иначе метод работать не будет.
Теперь не забуду.