1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- <?php
- include '../connection.php';
- try {
- $params = json_decode(file_get_contents('php://input'));
- unset($params->id);
- $db->beginTransaction();
- if($params->parentId > 0) {
- // find the list's parent node
- $statement = $db->prepare("select * from list where id = $params->parentId");
- if($statement->execute()) {
- $parent = $statement->fetch(PDO::FETCH_ASSOC);
- if(!$parent) {
- throw new Exception('parent node could not be found');
- }
- } else {
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- // the left bound of the new node is it's parent's right bound (append node to end of parent's child nodes)
- $leftBound = $parent['rgt'];
- // the right bound of the new node is leftBound + 1, because the new node has no children
- $rightBound = $leftBound + 1;
- // before we can insert a new node we need to increment by 2 the left and right values for all nodes to the right of where the new node is being inserted
- $statement = $db->prepare("update list set lft = lft + 2 where lft >= $rightBound");
- if(!$statement->execute()) {
- $db->rollBack();
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- $statement = $db->prepare("update list set rgt = rgt + 2 where rgt >= $leftBound");
- if(!$statement->execute()) {
- $db->rollBack();
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- } else {
- // if there is no parent, append the new node as a root node at the very end
- $statement = $db->prepare('select max(rgt) from list');
- if($statement->execute()) {
- // the left bound of the new node is right after the right bound of the node with the highest right bound in the table
- $leftBound = $statement->fetch(PDO::FETCH_COLUMN) + 1;
- // the right bound of the new node is leftBound + 1, because the new node has no children
- $rightBound = $leftBound + 1;
- } else {
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- }
- // insert the new list node into the database
- $statement = $db->prepare("insert into list (name, leaf, lft, rgt) values('$params->name', " . intval($params->leaf) . ", $leftBound, $rightBound)");
- if(!$statement->execute()) {
- $db->rollBack();
- throw new Exception(implode(', ', $statement->errorInfo()));
- }
- $params->id = $db->lastInsertId();
- $jsonResult = array(
- 'success' => true,
- 'children' => (array)$params
- );
- $db->commit();
- } catch(Exception $e) {
- $db->rollBack();
- $jsonResult = array(
- 'success' => false,
- 'message' => $e->getMessage()
- );
- }
- echo json_encode($jsonResult);
- ?>
|