Реализация динамической формы
Прислано: Tazik@drupal.org
пн, 18/01/2010 - 22:54
Добрый день.
В ходе изучения друпал возник такой вопрос.
Как реализовать такую форму:
есть несколько зависимых выпадающих списков, а также зависимые от них радиобаттоны, чекбоксы, кнопка "поиск", по нажатию которой значения полей передаются обработчику, который полученные значения ищет в базе, находит их, выводит на экран.
Пробывал для решения данной задачи следующие модули:
conditional fields, но он полезен лишь в создании типов публикации;
web form - не дает зависимости между полями;
есть еще вариант использовать таксономию + views, но тоже немного не то...
Искал решение задачи на форумах... есть похожие темы, но даже на эти похожие темы толком никто ответить не может. Уверен у многих возникает такая задача. Помогите кто чем может :)
- Tazik@drupal.org's blog
- Для комментирования войдите или зарегистрируйтесь
Hierarchical_Select пробовали?
- Для комментирования войдите или зарегистрируйтесь
Думаю придется самостоятельно писать, hierarchical_select справляется только с многоуровневыми словарями.., а у Вас задача, как понимаю посложнее..
- Для комментирования войдите или зарегистрируйтесь
так точно
- Для комментирования войдите или зарегистрируйтесь
а еще Quiz есть, но тоже не то :(
- Для комментирования войдите или зарегистрируйтесь
К сожалению, данный функционал в 6-ке отсутствует, самый подходящий модуль, это
Hierarchical_Select. С данной проблемой сталкиваюсь часто, пока решаю связкой PHP+Ajax, а выводить можно на страницу формируемую на лету модулем Views, отправляя в url в качестве аргументов значение формы. Форму можно создать с помощью WebForms.
Все это относится к прямой связи, когда "А" связано с "Б", "Б" с "В", "В" с "Г" и т.д., вообщем такого же вида, как для Hierarchical_Select (т.е. древовидная структура). Очевидно, что наличие более сложных связей требует более сложного решения.
Есть путь через API Drupal, здесь я еще не пробился, нет достаточных знаний :(.
- Для комментирования войдите или зарегистрируйтесь
form api, ahah
- Для комментирования войдите или зарегистрируйтесь
2Dan, а есть где пример кода глянуть? Хотя бы для двух связанных select box
- Для комментирования войдите или зарегистрируйтесь
Есть примеры на этом сайте. Даже HOW TO кто-то выкладывал.
Вот мой вариант:
/** * Implementation of hook_menu(). */ function ahahtest_menu(){ // Создаём обработчик для AHAH-запросов // код обработчика - ниже $items['ahahtest/autocomplete'] = array( 'title' => 'Ahahtest autocomplete', 'page callback' => 'ahahtest_autocomplete', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } // Создаём форму. Здесь, как самый частый случай, форма выбора региона-города function ahahtest_my_form($form_state){ // получаем список регионов $regions = /* код пропущен */; $form['region'] = array( '#type' => 'select', '#title' => 'Регион', '#options' => array('0' => '-- Выберите регион -- ') + $regions, '#default_value' => 0, // Задаём AHAH-обработчик '#ahah' => array( 'path' => 'ahahtest/autocomplete', 'wrapper' => 'ahahtest-town-select', 'method' => 'replace', 'event' => 'change', 'effect' => 'fade', ), ); $form['town'] = array( '#type' => 'select', '#title' => 'Город', '#options' => array( 0 => '-- Не выбран регион -- '), '#default_value' => 0, '#disabled' => true, '#prefix' => '<div id="ahahtest-town-select">', '#suffix' => '</div>', ); $form['submit'] = array( '#type' => 'submit', '#value' => t('Search'), ); return $form; } // Код обработчика function ahahtest_autocomplete(){ // Строим новую форму $form_state = array('submitted' => FALSE); $form_build_id = $_POST['form_build_id']; // Получаем текущую форму из кэша $form = form_get_cache($form_build_id, $form_state); // Из пост берём нужные переменные, в данном случае - $_POST['region'] // и на их основании делаем выборку из БД $options = /* код пропущен */; // Обновляем элемент формы... $form['town']['#disabled'] = false; $form['town']['#default_value'] = 0; $form['town']['#options'] = $options; // и сохраняем в кэше form_set_cache($form_build_id, $form, $form_state); $form += array( '#post' => $_POST, '#programmed' => FALSE, ); // Перестраиваем форму $form = form_builder('ahahtest_my_form', $form, $form_state); // Рендер элемента формы и отправка клиенту $output = drupal_render($form['town']); drupal_json(array('status' => TRUE, 'data' => $output)); }
- Для комментирования войдите или зарегистрируйтесь
Вот мой вариант:
спасибо, очень пригодилось!
- Для комментирования войдите или зарегистрируйтесь
Да, действительно. Пригодилось, применил решение. Спасибо. А как решить вопрос того, чтобы в результате обработки формы информация выводилась в определенный слой или блок без перезагрузки страницы?
- Для комментирования войдите или зарегистрируйтесь
Рассматривал пример из Вандюка,
penexe дал дельный совет. Сохранил решение - по запросу изменяется текст в диве. Вместе с решением от
Dan, приведенным выше, реализуется вывод отработанной формы.
- Для комментирования войдите или зарегистрируйтесь
div в markup? Замечательно. Спасибо. Думал уже ставить свой Ajax обработчик для div с функцией в template.php
- Для комментирования войдите или зарегистрируйтесь
Наконец нашел нормальный понятный пример AHAH.
Dan, спасибо большое!
- Для комментирования войдите или зарегистрируйтесь







Комментарии