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

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

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

for ($i=0; $i<5; $i ++) {
  $form['line_' .$i]['work'] = array(
    '#type' => 'submit',
    '#value' => t('Work'),
    '#line_index' => $i,
    '#name' => 'work_' .$i,
  );
}
И тогда в 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'), иначе метод работать не будет.

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

tornadoxxxl
Аватар пользователя tornadoxxxl

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

graker
Аватар пользователя graker

$msg = print_r($form_state, TRUE);
drupal_set_message('<pre>'.$msg.'</pre>');
Блин, вот я тоже обычно такими конструкциями пользуюсь, а ведь надо уже заставлять себя использовать devel.

Ingumsky (гость)
Аватар пользователя Ingumsky

Интересно, а в каком случае могут понадобиться несколько одинаковых кнопок сабмита? Мне как-то в голову ничего не приходит, если честно.

graker
Аватар пользователя graker

Например, у тебя есть таблица людей, которая редактируется табличной формой, где в строчку поля ввода:
Фамилия | Имя | Отчество | Год рождения.
И ты хочешь иметь возможность удалить любую строку из таблицы отдельной кнопкой. То есть справа от года рождения - кнопка "Удалить".

Ingumsky (гость)
Аватар пользователя Ingumsky

Понял. Действительно :)

Гость (гость)
Аватар пользователя Гость

А я бы отправлял на разные submit функции

graker
Аватар пользователя graker

И сколько сабмит-функций вы предлагаете написать, если число кнопок неизвестно? :)

Кислотне (гость)
Аватар пользователя Кислотне

О да, иногда прямо зашукаешься шукать нужную инфу. Вот недавно случайно наткнулся на замечательный архив с примерами для девелоперов - бешено полезная штука, а в гайдах нигде раньше не встречал.

graker
Аватар пользователя graker

Класс!

graker
Аватар пользователя graker

Хм.
Пропустил серьезный момент, без которого ничего не будет работать. Необходимо, чтобы имена (#name) у кнопок были разные. Добавил в заметку.

oktopus (гость)
Аватар пользователя oktopus

* facepalm
Ссылка на примеры совершенно отлично лежит здесь - http://drupal.org/handbook, где ей самое место.)

bohart
Аватар пользователя bohart

graker пишет:
$msg = print_r($form_state, TRUE);
drupal_set_message('<pre>'.$msg.'</pre>');
Блин, вот я тоже обычно такими конструкциями пользуюсь, а ведь надо уже заставлять себя использовать devel.

а я использую такую конструкцию (то есть ещё обворачиваю в check_plain что бы html отображалось как код):
drupal_set_message("boh@rt debug: <pre>". check_plain(print_r($vars, 1)) .'</pre>');

под это в мой IDE даже hot-key настроено.. считаю это крайне удобным и devel в таких случаях использовать не хочу =)

graker
Аватар пользователя graker

В таких наверное и не надо (в смысле, когда нужно код посмотреть).
А так я уже к dpm() и dpr() приучился, объекты и массивы хорошо разворачивать. Теперь на очереди взятие в оборот модуль-билдера.

Кислотне Восьменог
Аватар пользователя Кислотне Восьменог

Я так понял, «Module Builder» генерирует болванку для модуля? Для Netbeans IDE существует плагин, который успешно делает вот что:

Цитата:
Provides a wizard to develop a new Drupal Module and Theme, generating the mandatory files and code contents in these files. Also, provides palette components to generate code snippets for user-defined as well as default Drupal hooks.

http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?plug...

graker
Аватар пользователя graker

Ну да, оно.
Я Нетбинсом не пользуюсь, у меня Zend Studio. Там наверное тоже такое есть, но пока что у меня модуль-визард - это копипаста из другого, уже готового модуля :)

ingumsky
Аватар пользователя ingumsky

Я тоже просто делаю копипаст из готового модуля :)

Layla (гость)
Аватар пользователя Layla

В drupal 5 как это можно реализовать

Отправить комментарий

CAPTCHA
Пройдите, пожалуйста, проверку. Она нужна, чтобы отличать людей от спам-роботов. А если не хотите проходить эту проверку регулярно — зарегистрируйтесь.
Image CAPTCHA
Введите цифры, изображенные на картинке (без пробелов).