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

前端 未结 8 1253
北海茫月
北海茫月 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:38

    Just wanted to provide a OOP, cleaner version, which should make it easier to add any sort of logic apart from the selected one.

    It works properly with the array structure posted by @satrun77.

    class Node
    {
        var $name;
        var $category;
        var $depth;
        var $lft;
        var $rgt;
        var $selected;
        var $nodes = array();
    
        public function __construct( $name, $category, $depth, $lft, $rgt, $selected = false )
        {
            $this->name = $name;
            $this->category = $category;
            $this->depth = $depth;
            $this->lft = $lft;
            $this->rgt = $rgt;
            $this->selected = $selected;
        }
    
        public function addNode( Node $node )
        {
            array_push( $this->nodes, $node );
        }
    
        public function render()
        {
            $renderedNodes = '';
            if ( $this->isSelected() ) {
                $renderedNodes = $this->renderNodes();
            }
            return sprintf( '
  • %s%s
  • ', $this->category, $this->name, $renderedNodes ); } protected function renderNodes() { $renderedNodes = ''; foreach ( $this->nodes as $node ) { $renderedNodes .= $node->render(); } return sprintf( '
      %s
    ', $renderedNodes ); } /** Return TRUE if this node or any subnode is selected */ protected function isSelected() { return ( $this->selected || $this->hasSelectedNode() ); } /** Return TRUE if a subnode is selected */ protected function hasSelectedNode() { foreach ( $this->nodes as $node ) { if ( $node->isSelected() ) { return TRUE; } } return FALSE; } } class RootNode extends Node { public function __construct() {} public function render() { return $this->renderNodes(); } } function MyRenderTree( $tree, $current ) { /** Convert the $tree array to a real tree structure based on the Node class */ $nodeStack = array(); $rootNode = new RootNode(); $nodeStack[-1] = $rootNode; foreach ( $tree as $category => $rawNode ) { $node = new Node( $rawNode['name'], $category, $rawNode['depth'], $rawNode['lft'], $rawNode['rgt'], $rawNode['lft'] == $current['lft'] ); $nodeStack[($node->depth -1)]->addNode( $node ); $nodeStack[$node->depth] = $node; end( $nodeStack ); } /** Render the tree and return the output */ return $rootNode->render(); }

提交回复
热议问题