Getting nested set model into a
    but hiding “closed” subtrees

前端 未结 8 1242
北海茫月
北海茫月 2020-12-14 13:02

Based on Getting a modified preorder tree traversal model (nested set) into a

    One of answers gave right code to display full tree. What i need is to alway

8条回答
  •  悲&欢浪女
    2020-12-14 13:49

    Based on answer by satrun77. I created a helper for symfony + doctrine + nestedset (http://www.doctrine-project.org/projects/orm/1.2/docs/manual/hierarchical-data/en):

    function render_tree_html_list($nodes, Doctrine_Record $current_node, $render = true) {
        $html = '';
        $current_node_level = $current_node->getLevel();
        $counter = 0;
        $found = false;
        $nextSibling = false;
    
        foreach ($nodes as $i => $node):
            $node_level = $node->getLevel();
            $node_name = $node->getTitulo();
            $node_id = $node->getId();
    
            if ($current_node !== false) {
                if ($node_level == 0) {
    
                    if ($node->getLft() <= $current_node->getLft() && $node->getRgt() >= $current_node->getRgt()) {
                        // selected root item
                        $root = $node;
                    }
                } else if (!isset($root)) {
                    // skip all items that are not under the selected root
                    continue;
                } else {
                    // when selected root is found
    
                    $isInRange = ($root->getLft() <= $node->getLft() && $root->getRgt() >= $node->getRgt());
                    if (!$isInRange) {
                        // skip all of the items that are not in range of the selected root
                        continue;
                    } else if ($current_node->getLft() && $node->getLft() == $current_node->getLft()) {
                        // selected item reached
                        $found = true;
                        $current_node = $node;
                    } else if ($nextSibling !== false && $nextSibling->getLevel() < $node->getLevel()) {
    
                        // if we have siblings after the selected item
                        // skip any other childerns in the same range or the selected root item
                        continue;
                    } else if ($found && $node_level == $node->getLevel()) {
                        // siblings after the selected item
                        $nextSibling = $node;
                    }
                }
            } else if ($node_level > 0) {
                // show root items only if no childern is selected
                continue;
            }
    
            if ($node_level == $current_node_level) {
                if ($counter > 0)
                    $html .= '
  • '; } elseif ($node_level > $current_node_level) { $html .= '
      '; $current_node_level = $current_node_level + ($node_level - $current_node_level); } elseif ($node_level < $current_node_level) { $html .= str_repeat('
    ', $current_node_level - $node_level) . ''; $current_node_level = $current_node_level - ($current_node_level - $node_level); } $html .= sprintf('
  • %s
    ', $node_id, (isset($nodes[$i + 1]) && $nodes[$i + 1]->getLevel() > $node_level) ? "node" : "leaf", $node->getLevel() > 0 ? link_to($node->getTitulo(), 'cms_categoria_edit', $node) : $node->getTitulo() ); ++$counter; endforeach; $html .= str_repeat('
  • ', $node_level) . ''; $html = '
      '. $html .'
    '; return $render ? print($html) : $html; }

    Extra tags: tree, node

提交回复
热议问题