Несколько одинаковых submit-кнопок в форме
Всем известен лозунг о том, что Друпал, будучи открытой системой, обладает обширной и подробной документацией. Безусловно, это так и есть. Тем не менее, работа с этой документацией зачастую происходит в режиме "Слепой котенок vs. Огромный страшный мир". В основном потому, что обширная и подробная документация не очень удачно организована, так что в результате нужные сведения зачастую лежат в странных, неожиданных местах. И спасает зачастую только опыт: если знаешь, где искать - найдешь, а не знаешь - фиг тебе.
Сегодня, к примеру, решал задачу с формой, у которой несколько (переменное число) одинаковых submit-кнопок с одним и тем же submit-обработчиком, который, все же, должен уметь эти кнопки различать. Задачу решал не в первый раз, поэтому знал, что в описание каждой кнопки нужно добавить собственные свойства, содержащие их отличительные черты, например, вот так:
$form_state вынуть ['#line_index'] и понять, какая именно кнопка была нажата.
Однако я напрочь забыл, где именно в $form_state должна быть эта информация. На странице 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'), иначе метод работать не будет.
Теперь не забуду.
Интересно, а в каком случае могут понадобиться несколько одинаковых кнопок сабмита? Мне как-то в голову ничего не приходит, если честно.
Например, у тебя есть таблица людей, которая редактируется табличной формой, где в строчку поля ввода:
Фамилия | Имя | Отчество | Год рождения.
И ты хочешь иметь возможность удалить любую строку из таблицы отдельной кнопкой. То есть справа от года рождения - кнопка "Удалить".
Понял. Действительно :)
А я бы отправлял на разные submit функции
И сколько сабмит-функций вы предлагаете написать, если число кнопок неизвестно? :)
О да, иногда прямо зашукаешься шукать нужную инфу. Вот недавно случайно наткнулся на замечательный архив с примерами для девелоперов - бешено полезная штука, а в гайдах нигде раньше не встречал.
Класс!
Хм.
Пропустил серьезный момент, без которого ничего не будет работать. Необходимо, чтобы имена (#name) у кнопок были разные. Добавил в заметку.
* facepalm
Ссылка на примеры совершенно отлично лежит здесь - http://drupal.org/handbook, где ей самое место.)
а я использую такую конструкцию (то есть ещё обворачиваю в check_plain что бы html отображалось как код):
drupal_set_message("boh@rt debug: <pre>". check_plain(print_r($vars, 1)) .'</pre>');
под это в мой IDE даже hot-key настроено.. считаю это крайне удобным и devel в таких случаях использовать не хочу =)
В таких наверное и не надо (в смысле, когда нужно код посмотреть).
А так я уже к dpm() и dpr() приучился, объекты и массивы хорошо разворачивать. Теперь на очереди взятие в оборот модуль-билдера.
Я так понял, «Module Builder» генерирует болванку для модуля? Для Netbeans IDE существует плагин, который успешно делает вот что:
http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?plug...
Ну да, оно.
Я Нетбинсом не пользуюсь, у меня Zend Studio. Там наверное тоже такое есть, но пока что у меня модуль-визард - это копипаста из другого, уже готового модуля :)
Я тоже просто делаю копипаст из готового модуля :)
В drupal 5 как это можно реализовать














Тоже люблю погулять по api (вдруг что-то уже реализовано, что я хочу :)
Но в таких случаях сначала смотрю что там приходит:
$msg = print_r($form_state, TRUE);
drupal_set_message(''.$msg.'');
А потом уже разбираюсь где то что мне нужно и только потом для проверки в api (правда последнее не всегда).