Drupal → Пишем свой аналог Hierarchical Select на Form API + AJAX Framework (зависимые списки терминов таксономии)
В этом примере покажу, как можно создать зависимые списки терминов таксономии на Form API и AJAX.
Имеем словарь (vid=1):
Нужно создать форму по подобию Hierarchical Select, в которой при выборе значения в одном селекте, рядом будет появляться ещё один с дочерними терминами:
Код:
/** * Форма */ function mymodule_test_form($form, $form_state) { // Враппер для селектов $form['terms'] = array( '#tree' => TRUE, '#prefix' => '<div id="terms">', '#suffix' => '</div>', ); // Если сработает AJAX, то в $form_state['values']['terms'] будут выбранные значения селектов $values = isset($form_state['values']['terms']) ? $form_state['values']['terms'] : array(); // Селектов будет генерится всегда на 1 больше чем есть в $form_state['values']['terms'] $values += array('term' . (count($values)+1) => 'none'); $parent = 0; // в первом селекте будут выводится термины без родителя foreach ($values as $input_name => $tid) { // Завершаем цикл если в предыдущем селекте ничего не выбрано // или у термина нет дочерних терминов if ($parent === 'none' || !($terms = taxonomy_get_tree(1, $parent, 1))) { break; } // Формируем данные для селекта $options = array('none' => '<none>'); foreach ($terms as $term) { $options[$term->tid] = $term->name; } // Создаём сам селект $form['terms'][$input_name] = array( '#type' => 'select', '#options' => $options, '#default_value' => $tid, '#ajax' => array( 'callback' => 'mymodule_test_form_ajax_callback', 'wrapper' => 'terms', ), ); $parent = isset($options[$tid]) ? $tid : 'none'; } $form['submit'] = array( '#type' => 'submit', '#value' => 'Submit', ); return $form; } /** * AJAX callback */ function mymodule_test_form_ajax_callback($form, $form_state) { return $form['terms']; }
Комментарии
Если в кол-во терминов в словаре не очень большое, то удобней такой селект делать без ajax.
А что за дебагер на видеоролике?
http://xandeadx.ru/blog/drupal/304
блин, как раз сейчас озадачен таким селектом, только нужно изначально селект с основными городами, а подгружать регионы/второстепенные города, буду копать...
http://xandeadx.ru/blog/javascript/36
это да, видел, хороший пример, но я пытаюсь найти/сделать решение под друпал, пока не могу понять как добавлять новые вложенные элементы-потомки, но при сабмите формы получать нужный элемент - имя же другое будет
подскажите пожалуйста как это заставить работать на друпал7 куда все это дело вставляется.
Я хочу это вывести в блоке справа, когда пишу весь этот код в page.tpl.php в оответствующем месте, то получаю 500 ошибку.
http://xandeadx.ru/blog/drupal/256
Отличный пример.
а есть какие либо варианты под 6ю ветку?
пишу модуль под 6ку по работе с КЛАДР (база такая)...
пот и застрял с зависимой выборкой.
Использую ahah. но заставить грузиться дальше второго списка не вышло..
заранее спасибо.
Оставить комментарий