xandeadx.ru Блог музицирующего веб-девелопера

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'];
}
Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Если в кол-во терминов в словаре не очень большое, то удобней такой селект делать без ajax.

А что за дебагер на видеоролике?

А что за дебагер на видеоролике?

http://xandeadx.ru/blog/drupal/304

блин, как раз сейчас озадачен таким селектом, только нужно изначально селект с основными городами, а подгружать регионы/второстепенные города, буду копать...

блин, как раз сейчас озадачен таким селектом, только нужно изначально селект с основными городами, а подгружать регионы/второстепенные города, буду копать...

http://xandeadx.ru/blog/javascript/36

блин, как раз сейчас озадачен таким селектом, только нужно изначально селект с основными городами, а подгружать регионы/второстепенные города, буду копать...

http://xandeadx.ru/blog/javascript/36

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

подскажите пожалуйста как это заставить работать на друпал7 куда все это дело вставляется.
Я хочу это вывести в блоке справа, когда пишу весь этот код в page.tpl.php в оответствующем месте, то получаю 500 ошибку.

Отличный пример.
а есть какие либо варианты под 6ю ветку?

пишу модуль под 6ку по работе с КЛАДР (база такая)...
пот и застрял с зависимой выборкой.
Использую ahah. но заставить грузиться дальше второго списка не вышло..

заранее спасибо.

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

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании