read.php 2.48 KB
<?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);

?>