Здравствуйте!
Вопрос, возможно, не из сложных, но ответа на него так и не нашел.
Собственно, каким образом нужно корректно работать с полями форм в процессе валидации/отправки?
Приведу конкретный пример, с которым я зашел в тупик, но вопрос, в целом, глобальный. Я использую Drupal 7, но изменения в Forms API не очень большие, как я мог заметить.
Итак, я изменяю форму редактирования поля для некоторого типа материала (ID формы field_ui_field_edit_form). Тип поля - ссылка на термин таксономии. Использую хук form_alter и добавляю на форму новый textfield.
Моя задача: сделать так, чтобы пользователь мог определять значение для поля по умолчанию как в стандартном виджете, так и в добавленном мной textfield'е, причем мой имеет приоритет. Проще говоря, нужно заменить значение в стандартном виджете на новое, при отправке формы.
Проблема: $form и $form_state представляют собой огромную глыбу нечитабельных вложенных массивов, в которых значения дублируются по несколько раз. Допустим, я назначил #submit'у формы свой обработчик, но где изменять значения - непонятно. Существует огромное множество разных типов полей и форм, и в каждом случае нужное значение оказывается где-то в новом месте.
Существует ли какой-нибудь подробный мануал по структуре этих массивов, функции, обеспечивающие работу с ним? Нашел только form_set_value, да и она почему-то не изменяет ничего. Просто не может быть, чтобы не существовало унифицированных функций для работы со всем этим добром.
Комментарии
Непосредственные элементы формы лежат на первом уровне $form и не имеют префикса #. Для тренировки посмотите на модуль Form example из Examples
Используйте dpm() и другие функции из модуля Devel, чтобы смотреть, что где.
Ну и суперссылка конечно: http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....
В функции обработки сабмита, значения полей формы лежат в $form_state['values'] в виде
[parent][elem_name]=> elem_value
кстати... действительно почитайте суперссылочку... ни разу пользоваться не приходилось, но вроде можно задавать функцию-обработчик валидации-сабмита индивидуально отдельному полю формы.
Суперссылкой уже давно активно пользуюсь. За наводку на Devel и Examples спасибо.
И все же, основной вопрос остается открытым: неужто нет унифицированного способа работы с формами? По сути, нужны лишь две функции, скажем, get и set, которым передаешь $form_state и имя поля, и они устанавливают/получают его значение. Пользователю этих функций не нужно заботиться о типе поля и вложенности.
Просто если таких функций нет, мне придется писать их самому.
поиск выдал field_form_get_state()/field_form_set_state(). не то?
field.form.inc
Да вроде и так болших сложностей нет...
Универсальные функции (get,set) писать сложнее...
$form_state['values'] - массив значений и вложенных массивов
Его структура определяется структурой $form и параметрами элемента формы '#tree' '#parent'
Посмотрите примеры форм, обращая внимание на эти параметры и поймете закономерность..
Вот небольшое описание $form_state
http://ezh-leon.ru/formapi-v-drupale-6
Итак, я решил, что написать свое решение проще, чем найти готовое. Прилагаю кусок кода из модуля, занимающегося изменением значений элементов формы по умолчанию. Может, кто-нибудь укажет на ошибки, или пригодится кому.