Drupal 7 и улучшенные Form API делает использование AJAX очень простым. Вы можете добавлять, заменять или удалять элементы форм с помощью AJAX, не запачкав свои руки в javascript коде.
Возьмем пример из жизни.
У нас на сайте есть тип содержимого "Резюме"(resume) и профиль "Профессиональная информация"(prof_info) в Profile2. В этом профиле содержится информация, к примеру, об опыте работы в поле 'field_work_experience'. В типе содержимого "Резюме" так же есть поле 'field_work_experience'. И мы не хотим, что бы пользователь ещё раз вводил уже введённую информацию. Для эго над полем 'field_work_experience' в типе содержимого "Резюме" мы поместим кнопку, при нажатии на который данные из профиля вставятся в нашу форму.
Ниже приведен код, реализующий данный функционал:
/** * Implements hook_form_FORM_ID_alter(). * * Форма создания/редактирования типа материала "Резюме". */ function formsd7_form_resume_node_form_alter(&$form, &$form_state, $form_id) { // Загрузка профиля текущего пользователя. $uid = $form['uid']['#value']; $author = user_load($uid); $profile = profile2_load_by_user($author, 'prof_info'); // Кнопка позволяющая импортировать данные о опыте работы из профиля в форму. // Проверка сработает только для нод с нейтральным языком. // Оборачивание элемента в блок, что бы можно было работать с AJAX. $form['field_work_experience']['#prefix'] = '<div id="field-work-experience-wrapper">'; $form['field_work_experience']['#suffix'] = '</div>'; '#type' => 'submit', '#value' => 'Импортировать опыт работы из профиля', '#description' => 'Предупреждение: все ранее введенные данные в поле Опыт работы будут удалены!', '#weight' => -20, // Не производить валидацию когда нажата кнопка! 'callback' => 'formsd7_js_import_work_experience', 'wrapper' => 'field-work-experience-wrapper', 'effect' => 'fade', 'method' => 'replace', ), ); } } /** * Вызов при обработки AJAX запроса с формы составления резюме. */ function formsd7_js_import_work_experience($form, $form_state) { $field_collection = 'field_work_experience'; // Загрузка поле через дополнительную функцию. Это позволит повторять этот процесс для других полей. $element = formsd7_js_import_field_collection($field_collection, $form, $form_state); return $element; } /** * Получаем срендеренный элемент формы. */ function formsd7_js_import_field_collection($field_collection, $form, $form_state) { // Загрузка профиля текущего пользователя. $uid = $form['uid']['#value']; $author = user_load($uid); // Нужно подключить объявление profile формы из profile2. module_load_include('inc', 'profile2_page', 'profile2_page'); // Загрузить объект профиля $profile2 = profile2_by_uid_load($uid, 'prof_info'); // Генерирует форму. Также можно использовать drupal_get_form для форм не использующих entity. $profile2_form = entity_ui_get_form('profile2', $profile2, 'edit'); // Возвращаем срендеренный элемент формы из профиля. return $profile2_form['profile_prof_info'][$field_collection]; } }
Другой пример где может понадобится данные действия, это перенос данных некоторых данных из уже созданного резюме в новое.
При написании статьи и кода использовались данные из Import form values from one form to another via AJAX