diff options
-rw-r--r-- | taxonomy_node_tree.module | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/taxonomy_node_tree.module b/taxonomy_node_tree.module index 07ea515..cbd9b26 100644 --- a/taxonomy_node_tree.module +++ b/taxonomy_node_tree.module @@ -118,19 +118,79 @@ function taxonomy_node_tree_sort(&$tree, $term) { * @param $tree * Tree with term objects. * + * @param $clean + * Set to TRUE to remove branches without nodes. + * * @return * Hierarchical term tree. */ -function taxonomy_node_tree_hierarchy($tree) { +function taxonomy_node_tree_hierarchy($tree, $clean = FALSE) { if (is_array($tree) && $tree != NULL) { - foreach ($tree as $term) { + foreach ($tree as &$term) { taxonomy_node_tree_sort($tree, $term); + + if ($clean) { + taxonomy_node_tree_clean($term); + } } } return $tree; } /** + * @todo + */ +function taxonomy_node_tree_clean(&$term) { + $list = taxonomy_node_tree_get_empty($term); + taxonomy_node_tree_remove($term, $list); +} + +function taxonomy_node_tree_remove(&$term, $list) { + if (in_array($term->tid, $list)) { + $term = NULL; + return; + } + + if (isset($term->below)) { + foreach ($term->below as &$below) { + taxonomy_node_tree_remove($below, $list); + } + } +} + +/** + * TODO: skip parents should be controlled by a parameter. + */ +function taxonomy_node_tree_get_empty($term, &$list = array()) { + if (taxonomy_node_tree_count($term) == 0) { + // Skip parents. + if ($term->parents[0] != 0) { + $list[] = $term->tid; + } + } + else if (isset($term->below)) { + foreach ($term->below as $below) { + taxonomy_node_tree_get_empty($below, $list); + } + } + + return $list; +} + +function taxonomy_node_tree_count($term, &$count = 0) { + if (isset($term->below)) { + foreach ($term->below as &$below) { + taxonomy_node_tree_count($below, $count); + } + } + else if (isset($term->nodes)) { + $count += count($term->nodes); + } + + return $count; +} + +/** * Setup a full taxonomy node hierarchical tree. * * Build a tree with taxonomy terms with full dept and add child node @@ -142,13 +202,17 @@ function taxonomy_node_tree_hierarchy($tree) { * @param $terms * Array with term objects. * + * @param $clean + * Set to TRUE to remove branches without nodes. + * * @return * Hierarchical tree. */ -function taxonomy_node_tree_build($nodes, $terms) { +function taxonomy_node_tree_build($nodes, $terms, $clean = FALSE) { $tree = taxonomy_node_tree_index($nodes, $terms); $tree = taxonomy_node_tree_relation($tree); - $tree = taxonomy_node_tree_hierarchy($tree); + $tree = taxonomy_node_tree_hierarchy($tree, $clean); + return $tree; } @@ -176,7 +240,6 @@ function taxonomy_node_tree_build($nodes, $terms) { * @return * An array of all term objects in the tree. Each term object is extended * to have "depth" and "parents" attributes in addition to its normal ones. - * Results are statically cached. */ function taxonomy_node_tree_taxonomy_get_tree($vid, $parent = 0, $depth = -1, $max_depth = NULL, $cache = FALSE) { static $children, $parents, $terms; |