С помощью нового 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'];
}
?>
На основе данного кода в ближайшее время планирую написать виджет для поля таксономии
Комментарии
http://drupal.org/project/hierarchical_select уже есть alpha1, не подошел ?
нет не подошел, у меня стояла задача сделать достаточно сложную форму из нескольких типов элементов, один из которых выпадающие списки таксономии.
Со своим кодом проще, тем в drupal 7 все очень легко реализуется
Полезно и просто. Hierarchical_select всё таки монстроподобен
Это решение, но только для иерархических словарей, полагаю, что конечной вложенности
Не учитывается доступ к словарю и терминам...
HS для 7 серьезно переделан, так что не так страшен
спасибо полезно (ц)
красиво
спасибо за комментарии буду корректировать
Подскажите а как с делать выпадающий ajax список просто в шаблоне node.tpl.php?
Мне надо двухуровневый hierarhical select сделать на основе словаря таксономии