What is it?
Nested sets or Nested Set Model is a way to effectively store hierarchical data in a relational table. The main features are:
- Generation of select elements for forms
- Generation of lists (ul) consistent with Twitters Bootstrap framework
- Generation of raw nested (multidimensional) arrays so everyone can extend the script if needed without much trouble
As an bonus you get a Database class which makes use of PHP’s PDO for communication with the database. You can
easily get rid of it and implement your own database class.
Example #1: Creating nodes
The following code
// $root stores the id of the new node $root = Mptt::factory()->create_root('Root node'); Mptt::factory()->create_child('Child node 1', $root); Mptt::factory()->create_child('Child node 2', $root); $child = Mptt::factory()->create_child('Child node 3', $root); Mptt::factory()->create_child('Child node 4', $root); Mptt::factory()->create_child('Child node 5', $root); $sibling = Mptt::factory()->create_child('Child of child', $child); Mptt::factory()->create_sibling('Sibling of child', $sibling);
Please analyze the code carefully…it will generate a data structure similar to the one on the screenshot bellow:
Example #2: Generating form elements
To make a select element simply pass the id of the desired node to the factory method and then call as_select() on the returned object
// Calling as_select will generate a valid select element $root = 1; echo Mptt::factory($root)->as_select('node_id');
Example #3: Getting the path of a node
// Calling get_path will generate a path to the desired node echo Mptt::factory()->get_path(7);
You can than print the path with a simple loop.
Array ( [1] => Array ( [id] => 1 [title] => Root node [lft] => 1 [rgt] => 16 ) [4] => Array ( [id] => 4 [title] => Child node 3 [lft] => 6 [rgt] => 11 ) [7] => Array ( [id] => 7 [title] => Child of child [lft] => 7 [rgt] => 8 ) )
Example #4: Deleting
To delete a node and it’s chidlren simply call the delete method and pass the id of the node you want to delete to it
// don't forget to do some validation after you get the id $node_id = $_POST['node_id']; Mptt::factory()->delete_id($node_id); ?>
Example #4: Check if node is leaf
A leaf node is a node which has no child nodes. Checking this factor can be usefull if you want the user to specify exactly what’s requested from him.
// don't forget to do some validation after you get the id $node_id = $_POST['node_id']; if( Mptt::factory()->is_leaf($node_id) ) { // it is leaf ... do whatever you want } else { // it has child nodes, show an error message }
Example #4: Configuration
There is a number of things you can do to make the returned list more suited for your purposes. Please take a look at the config parameters bellow:
echo Mptt::factory(array('only_leaf' => TRUE, 'limit' => 5))->as_select('node_id');
List of configuration parameters, their description, default and expected values
key | default | type | description |
only_leaf | false | boolean (true/false) | Select only leaf nodes from the database? |
only_leaf_select | false | boolean (true/false) | Make nodes with children unselectable when using as_select()? |
limit | NULL | integer | Limit the number of returned nodes (only usefull in combination with the only_leaf parameter) |
indenter | ` `(four spaces) | string | The bit of text that makes depth of the node visible in select elements |
prefix_leaf | ⊢ | string | Sign that is prepended to the title of leaf items |
prefix_non_leaf | ∟ | string | Sign that is prepended to the title of non-leaf items |
Complete list of functions and their description
as_array() | Returns raw array |
as_html() | Creates a multi-level menu compatible with the Bootstrap css framework |
as_select() | Creates a HTML form select element of the whole tree |
create_child() | Creates a new child node of the node with the given id |
create_root() | Creates a root node |
create_sibling() | Creates a new sibling next to the given node |
delete_node() | Deletes a node and all it’s children |
factory() | Sets config and returns Mptt object |
get_items() | Gets items depending on provided criteria and stores them in a local array |
get_node() | Gets an object with all data of a node |
get_path() | Gets a array containing the path to defined node |
is_descendant() | Checks whether the node is a descendant of another |
is_leaf() | Checks whether the node is leaf or not (A node is leaf when it has no child nodes) |
Questions
If you have any questions before buying, please don’t hesitate to send me contact me.