Drupal: Obtener un árbol de términos de forma anidada
Este problema es mas viejo que la injusticia. taxonomy_get_tree() devuelve un array de terms plano en lugar de hacerlo de forma anidada. La solución es esta pequeña función:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
function taxonomy_get_nested_tree($vid_or_terms = array(), $max_depth = NULL, $parent = 0, $parents_index = array(), $depth = 0) { if (!is_array($vid_or_terms)) { $vid_or_terms = taxonomy_get_tree($vid_or_terms); } foreach ($vid_or_terms as $term) { foreach ($term->parents as $term_parent) { if ($term_parent == $parent) { $return[$term->tid] = $term; } else { $parents_index[$term_parent][$term->tid] = $term; } } } foreach ($return as &$term) { if (isset($parents_index[$term->tid]) && (is_null($max_depth) || $depth < $max_depth)) { $term->children = taxonomy_get_nested_tree($parents_index[$term->tid], $max_depth, $term->tid, $parents_index, $depth + 1); } } return $return; } |
Y listo, ahora en lugar de usar taxonomy_get_tree(), usa taxonomy_get_nested_tree():
1 2 |
$voc = taxonomy_vocabulary_machine_name_load('categoria'); $tree = taxonomy_get_nested_tree($voc->vid); |
Ya está, el resultado ahora está anidado tal como tengas anidados los terms.
Nota: Me he basado en ésta función, que a su vez se basa en otras.
Renderizar el tree
Acá dejo tambien una función para renderizar el tree:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
function taxonomy_nested_tree_render($tree, $recurring = FALSE) { $items = array(); if (count($tree)) { foreach ($tree as $term) { $path = taxonomy_term_uri($term); $item = array('data' => l($term->name, $path["path"])); if (isset($term->children)) { $item["children"] = taxonomy_nested_tree_render($term->children, TRUE); } $items[] = $item; } } if ($recurring) { return $items; } return array( '#theme' => 'item_list', '#items' => $items, '#attributes' => array('class' => 'taxonomy-tree'), ); } |
Uso:
1 2 3 |
$voc = taxonomy_vocabulary_machine_name_load('categoria'); $tree = taxonomy_get_nested_tree($voc->vid); return taxonomy_nested_tree_render($tree); |