Я люблю Drupal 7 (выпадающий список таксономии)

Главные вкладки

Аватар пользователя gumk gumk 3 марта 2011 в 0:07

С помощью нового Form api можно избавится от модуля hierarchical select

Для решения задачи подгружаемых выпадающих списков хватило трех функций:

Функция формы:

<?php
function example_form($form, &$form_state$checkout_pane$order) {
$form2['example'] = get_form_building(0$form_state);
$form2['example']['#prefix'] = '<div id="example-wrapper">';
$form2['example']['#suffix'] = '</div>';
return 
$form2;
}
?>

Рекрусивная функция построения выпадающих списков

<?php
function get_form_building($tid$form_state ''$stay 0){
$options = array();
 
$result db_query('SELECT td.tid, td.name
FROM {taxonomy_term_hierarchy} th
INNER JOIN {taxonomy_term_data} td
  ON td.tid = th.tid
WHERE th.parent = :pid
ORDER BY td.weight ASC, td.name ASC '
, array(':pid' => $tid));
foreach (
$result as $record) {
$options[$record->tid] = $record->name;
}

if(

count($options)){

if(

$options[$form_state['values']['example'['term-level-'.$stay]]){
$default_value $form_state['values']['example']['term-level-'.$stay];
}
//если нужно чтобы вся иерархия таксономии не подгружалась сразу можно удалить этот else
 
else {
$default_value key($options);
 }

$out['term-level-'.$stay] = array(
    
'#type' => 'select',
    
'#title' => 'third Dropdown',
    
'#prefix' => '<div id="dropdown_replace_'.$stay.'">',
    
'#suffix' => '</div>',
    
'#options' => $options,
    
'#default_value' => $default_value,
    
'#ajax' => array(
      
'event' => 'change',
      
'callback' => 'ajax_dropdown_callback',
      
'wrapper' => 'example-wrapper',

    ),
  );
  

$stay++;
//вызываем рекурсивно функцию
$out2 get_form_building($default_value$form_state$stay);
if (
$out2){
return 
array_merge($out$out2);
}else{
return 
$out;
}
}
else {
return 
FALSE;
}
}
?>

Функция callback для AJAX запроса, в эту функцию попадает уже перестроенная форма, нам остается только определить часть массива которую нужно вернуть в наш wrapper.

<?php
function ajax_dropdown_callback($form$form_state) {
return 
$form['example'];
}
?>

На основе данного кода в ближайшее время планирую написать виджет для поля таксономии

Комментарии

Аватар пользователя gumk gumk 7 марта 2011 в 17:44

нет не подошел, у меня стояла задача сделать достаточно сложную форму из нескольких типов элементов, один из которых выпадающие списки таксономии.
Со своим кодом проще, тем в drupal 7 все очень легко реализуется

Аватар пользователя andypost@drupal.org andypost@drupal.org 7 марта 2011 в 18:57

Это решение, но только для иерархических словарей, полагаю, что конечной вложенности

Не учитывается доступ к словарю и терминам...

HS для 7 серьезно переделан, так что не так страшен

Аватар пользователя gumk gumk 7 марта 2011 в 20:38

"<a href="mailto:andypost@drupal.org">andypost@drupal.org</a>" wrote:
Не учитывается доступ к словарю и терминам...

спасибо за комментарии буду корректировать

Аватар пользователя Sadchenko Sadchenko 11 марта 2022 в 6:41

Подскажите а как с делать выпадающий ajax список просто в шаблоне node.tpl.php?
Мне надо двухуровневый hierarhical select сделать на основе словаря таксономии