12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- <?php
- include '../connection.php';
- try {
- $statement = $db->prepare('select * from list order by lft asc');
- if(!$statement->execute()) {
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- // fetch the flat result set from the database
- $lists = $statement->fetchAll(PDO::FETCH_ASSOC);
- // convert list result set to nested tree structure.
- // create a dummy root node that will be the base of our tree structure
- $root = array(
- // all nodes in the result set should fall within these left/right bounds
- 'lft' => 0,
- 'rgt' => PHP_INT_MAX,
- 'children' => array()
- );
- $listStack = array(&$root);
- $listCount = count($lists);
- for($i = 0; $i < $listCount; $i++) {
- $list = &$lists[$i];
- $parent = &$listStack[count($listStack) - 1];
- while($list['rgt'] > $parent['rgt']) {
- // if the current list is not a child of parent, pop lists off the stack until we get to a list that is its parent
- array_pop($listStack);
- $parent = &$listStack[count($listStack) - 1];
- }
- // add the node to its parent node's "children" array
- $parent['children'][] = &$list;
- if($list['rgt'] - $list['lft'] > 2) { // if the node has children
- $list['expanded'] = "1"; // nodes that have children are expanded by default
- $list['children'] = array();
- $listStack[] = &$list; // push the node on to the stack
- } else if(empty($list['leaf'])) {
- // for non leaf nodes that do not have any children we have to set "loaded" to true
- // This prevents the TreeStore from trying to dynamically load content for these nodes when they are expanded
- $list['loaded'] = "1";
- unset($list['leaf']); // no need to return "leaf: null" to the client for non leaf nodes
- }
- }
- // remove properties that are not needed by the UI (lft and rgt)
- function removeTreeProperties(&$list) {
- unset($list['lft']);
- unset($list['rgt']);
- if(isset($list['children'])) {
- foreach($list['children'] as &$child) {
- removeTreeProperties(&$child);
- }
- }
- }
- removeTreeProperties(&$root);
- $jsonResult = array(
- 'success' => true,
- 'children' => $root['children']
- );
- } catch(Exception $e) {
- $jsonResult = array(
- 'success' => false,
- 'message' => $e->getMessage()
- );
- }
- echo json_encode($jsonResult);
- ?>
|