We’ve packaged the tree control used in the SilverStripe CMS into component that you can re-use in your own applications.
The first thing to do is include the appropriate JavaScript and CSS files:
<link rel="stylesheet" type="text/css" media="all" href="tree.css" /> <script type="text/javascript" src="tree.js"></script>
Then, create the HTML for you tree. This is basically a nested set of bullet pointed links. The “tree” class at the top is what the script will look for. Note that you can make a tree node closed to begin with by adding class=”closed”.
Here’s the HTML code that I inserted to create the demo tree above.
<ul class="tree"> <li><a href="#">item 1</a> <ul> <li><a href="#">item 1.1</a></li> <li class="closed"><a href="#">item 1.2</a> <ul> <li><a href="#">item 1.2.1</a></li> <li><a href="#">item 1.2.2</a></li> <li><a href="#">item 1.2.3</a></li> </ul> </li> <li><a href="#">item 1.3</a></li> </ul> </li> <li><a href="#">item 2</a> <ul> <li><a href="#">item 2.1</a></li> <li><a href="#">item 2.2</a></li> <li><a href="#">item 2.3</a></li> </ul> </li> </ul>
Your tree is now complete!
Obviously, this isn’t a complete detail of everything that’s going on, but it gives you an insight into the overall process.
In simple situations, creating an auto-loading script is a simple matter of setting window.onload to a function. But what if there’s more than one script? To this end, we created an appendLoader() function that will execute multiple loader functions, including a previously defined loader function
Rather than write a piece of script to define where your tree is, we’ve tried to make the script as automatic as possible - it finds all ULs with a class name containing “tree”.
Unfortunately, an LI containing an A isn’t sufficient for doing all of the necessary tree styling. Rather than force people to put non-semantic HTML into their file, the script generates extra <span> tags.
So, the following HTML:
<li> <a href="#">My item</a> </li>
Is turned into the more ungainly, and yet more easily styled:
<li> <span class="a"><span class="b"><span class="c"> <a href="#">My item</a> </span></span></span> </li>
Additionally, some helper classes are applied to the <li> and <span class=”a”> elements:
Why the heck do we need 5 styling elements? Basically, because there are 5 background-images to apply:
Having come this far, the “dynamic” aspect of the tree control is very trivial. We set a “closed” class on the <li> and <span class=”a”> elements, and our CSS takes care of hiding the children, changing the - to a + and changing the folder icon.
Like the rest of our open-source software, the SilverStripe Tree Control is released under the BSD License, which means that you can put it into both open-source and commercial projects.
Please use comments for notes, tips and corrections about the described
functionality.
Use the Silverstripe Forum to
ask questions.