code/template/helper/behavior.php
public function tree($config = array())
    {
        $config = new ObjectConfigJson($config);
        $config->append(array(
            'debug'   => false,
            'element' => '',
            'selected'  => '',
            'list'    => array()
        ))->append(array(
            'options_callback' => null,
            'options' => array(
                'selected' => $config->selected
            )
        ));

        $html = '';

        /**
         * Loading the assets, if not already loaded
         */
        if (!static::isLoaded('tree'))
        {
            $html .= $this->kodekit();
            $html .= '<ktml:script src="assets://js/'.($config->debug ? 'build/' : 'min/').'kodekit.tree.js" />';

            static::setLoaded('tree');
        }

        /**
         * Parse and validate list data, if any. And load the inline js that initiates the tree on specified html element
         */
        $signature = md5('tree-'.$config->element);
        if($config->element && !static::isLoaded($signature))
        {
            /**
             * If there's a list set, but no 'data' in the js options, parse it
             */
            if(isset($config->list) && !isset($config->options->data))
            {
                $data = array();
                foreach($config->list as $item)
                {
                    $parts = explode('/', $item->path);
                    array_pop($parts); // remove current id
                    $data[] = array(
                        'label'  => $item->title,
                        'id'     => (int)$item->id,
                        'level'  => (int)$item->level,
                        'path'   => $item->path,
                        'parent' => (int)array_pop($parts)
                    );
                }
                $config->options->append(array('data' => $data));
            }
            /**
             * Validate that the data is the right format
             */
            elseif(isset($config->options->data, $config->options->data[0]))
            {
                $data     = $config->options->data[0];
                $required = array('label', 'id', 'level', 'path', 'parent');
                foreach($required as $key)
                {
                    if(!isset($data[$key])) {
                        throw new \InvalidArgumentException('Data must contain required param: '.$key);
                    }
                }
            }

            $options = (string) $config->options;

            if ($config->options_callback) {
                $options = $config->options_callback.'('.$options.')';
            }

            $html .= '<script>
            kQuery(function($){
                new Kodekit.Tree('.json_encode($config->element).', '.$options.');
            });</script>';

            static::setLoaded($signature);
        }

        return $html;
    }
public function tree($config = array())
    {
        $config = new ObjectConfigJson($config);
        $config->append(array(
            'debug'   => false,
            'element' => '',
            'selected'  => '',
            'list'    => array()
        ))->append(array(
            'options_callback' => null,
            'options' => array(
                'selected' => $config->selected
            )
        ));

        $html = '';

        /**
         * Loading the assets, if not already loaded
         */
        if (!static::isLoaded('tree'))
        {
            $html .= $this->kodekit();
            $html .= '<ktml:script src="assets://js/'.($config->debug ? 'build/' : 'min/').'kodekit.tree.js" />';

            static::setLoaded('tree');
        }

        /**
         * Parse and validate list data, if any. And load the inline js that initiates the tree on specified html element
         */
        $signature = md5('tree-'.$config->element);
        if($config->element && !static::isLoaded($signature))
        {
            /**
             * If there's a list set, but no 'data' in the js options, parse it
             */
            if(isset($config->list) && !isset($config->options->data))
            {
                $data = array();
                foreach($config->list as $item)
                {
                    $parts = explode('/', $item->path);
                    array_pop($parts); // remove current id
                    $data[] = array(
                        'label'  => $item->title,
                        'id'     => (int)$item->id,
                        'level'  => (int)$item->level,
                        'path'   => $item->path,
                        'parent' => (int)array_pop($parts)
                    );
                }
                $config->options->append(array('data' => $data));
            }
            /**
             * Validate that the data is the right format
             */
            elseif(isset($config->options->data, $config->options->data[0]))
            {
                $data     = $config->options->data[0];
                $required = array('label', 'id', 'level', 'path', 'parent');
                foreach($required as $key)
                {
                    if(!isset($data[$key])) {
                        throw new \InvalidArgumentException('Data must contain required param: '.$key);
                    }
                }
            }

            $options = (string) $config->options;

            if ($config->options_callback) {
                $options = $config->options_callback.'('.$options.')';
            }

            $html .= '<script>
            kQuery(function($){
                new Kodekit.Tree('.json_encode($config->element).', '.$options.');
            });</script>';

            static::setLoaded($signature);
        }

        return $html;
    }
public function tree ( $ config = array ( ) ) { $ config = new ObjectConfigJson ( $ config ) ; $ config -> append ( array ( 'debug' => false , 'element' => '' , 'selected' => '' , 'list' => array ( ) ) ) -> append ( array ( 'options_callback' => null , 'options' => array ( 'selected' => $ config -> selected ) ) ) ; $ html = '' ; /**
         * Loading the assets, if not already loaded
         */ if ( ! static :: isLoaded ( 'tree' ) ) { $ html .= $ this -> kodekit ( ) ; $ html .= '<ktml:script src="assets://js/' . ( $ config -> debug ? 'build/' : 'min/' ) . 'kodekit.tree.js" />' ; static :: setLoaded ( 'tree' ) ; } /**
         * Parse and validate list data, if any. And load the inline js that initiates the tree on specified html element
         */ $ signature = md5 ( 'tree-' . $ config -> element ) ; if ( $ config -> element && ! static :: isLoaded ( $ signature ) ) { /**
             * If there's a list set, but no 'data' in the js options, parse it
             */ if ( isset ( $ config -> list ) && ! isset ( $ config -> options -> data ) ) { $ data = array ( ) ; foreach ( $ config -> list as $ item ) { $ parts = explode ( '/' , $ item -> path ) ; array_pop ( $ parts ) ; // remove current id $ data [ ] = array ( 'label' => $ item -> title , 'id' => ( int ) $ item -> id , 'level' => ( int ) $ item -> level , 'path' => $ item -> path , 'parent' => ( int ) array_pop ( $ parts ) ) ; } $ config -> options -> append ( array ( 'data' => $ data ) ) ; } /**
             * Validate that the data is the right format
             */ elseif ( isset ( $ config -> options -> data , $ config -> options -> data [ 0 ] ) ) { $ data = $ config -> options -> data [ 0 ] ; $ required = array ( 'label' , 'id' , 'level' , 'path' , 'parent' ) ; foreach ( $ required as $ key ) { if ( ! isset ( $ data [ $ key ] ) ) { throw new \ InvalidArgumentException ( 'Data must contain required param: ' . $ key ) ; } } } $ options = ( string ) $ config -> options ; if ( $ config -> options_callback ) { $ options = $ config -> options_callback . '(' . $ options . ')' ; } $ html .= '<script>
            kQuery(function($){
                new Kodekit.Tree(' . json_encode ( $ config -> element ) . ', ' . $ options . ');
            });</script>' ; static :: setLoaded ( $ signature ) ; } return $ html ; }
Loads the Kodekit customized jQtree behavior and renders a sidebar-nav list useful in split views

@see    http://mbraak.github.io/jqTree/

@note   If no 'element' option is passed, then only assets will be loaded.

@param  array|ObjectConfig $config
@throws \InvalidArgumentException
@return string    The html output
Loads the Kodekit customized jQtree behavior and renders a sidebar - nav list useful in split views