Example #1
0
 /** delete node */
 public function delNode($node, $cascade = false)
 {
     global $ari;
     $ari->internalChrono('delNode_start');
     if (!is_a($node, 'OOB_tree_node')) {
         if ($this->multiple) {
             return false;
         } else {
             if ($node = OOB_tree::getNode(false, $node, $this)) {
             } else {
                 return false;
             }
         }
     }
     //var_dump ($node);
     //exit;
     //
     $id = $ari->db->qMagic($node->id());
     // $node['id'];
     $left = $ari->db->qMagic($node->left());
     // $node['left'];
     $right = $ari->db->qMagic($node->right());
     // $node['right'];
     $tree = $ari->db->qMagic($node->treeid());
     //$node['treeid'];
     //	$move_cascade =  $ari->db->qMagic($node->right() - $node->left() + 1); //$node['right'] - $node['left'] +1 ;
     $delta = $node->left() - $node->right() - 1;
     $ari->db->StartTrans();
     if ($cascade) {
         // @todo: verify, no estoy seguro que esto funcione del todo bien!
         //borro en cascada los hijos
         $sql_cascade = "DELETE FROM OOB_Tree_Node\n \t\t\t     \t \t\tWHERE TreeID = {$tree}\n\t\t\t\t\t\t    AND `OOB_Tree_Node.Left` >= {$left} AND `OOB_Tree_Node.Right` <= {$right}";
         $ari->db->Execute($sql_cascade);
         $this->addDelta($node->right() + 1, $delta);
         //actualizo la cantidad de nodos
         $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t           SET `Nodes` = (SELECT COUNT(True) \n\t\t\t\t           \t\t\t\t  FROM OOB_Tree_Node\n \t\t    \t \t       \t\t\t\t  WHERE TreeID = {$tree}) \n\t\t\t\t\t       ";
         $ari->db->Execute($sql_update);
     } else {
         $sql = "DELETE FROM OOB_Tree_Node\n \t\t\t\t\t   WHERE ID = {$id} ";
         $ari->db->Execute($sql);
         //actualizo los hijos del borrado
         $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t           SET `Left` = `Left` - 1,  `Right` = `Right` - 1\n \t\t    \t \t       WHERE TreeID = {$tree} \n\t\t\t\t\t       AND `Left` BETWEEN {$left} AND {$right} ";
         $ari->db->Execute($sql_update);
         //actualizo el padre del borrado el cual tiene izquiera menor y derecha mayor
         $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t           SET `Right` = `Right` - 2\n \t\t    \t \t       WHERE TreeID = {$tree}\n\t\t\t\t\t       AND `Right` > {$right} \n\t\t\t\t\t       AND `Left` < {$left} ";
         $ari->db->Execute($sql_update);
         //actualizo los nodos q no estan en la rama del borrado
         $sql_update = "UPDATE OOB_Tree_Node \n\t\t\t\t           SET `Left` = `Left` - 2,  `Right` = `Right` - 2\n \t\t    \t \t       WHERE TreeID = {$tree} \n\t\t\t\t\t       AND `Left` > {$right} ";
         $ari->db->Execute($sql_update);
         //actualizo la cantidad de nodos
         $sql_update = "UPDATE OOB_Tree_Tree \n\t\t\t\t           SET `Nodes` = `Nodes` - 1\n \t\t    \t \t       WHERE ID = {$tree}\n\t\t\t\t\t       ";
         $ari->db->Execute($sql_update);
     }
     if (!$ari->db->CompleteTrans()) {
         throw new OOB_exception("Error en DB: {$ari->db->ErrorMsg()}", "010", "Error en la Base de Datos", false);
         //return false;
     } else {
         $this->fill();
         return true;
     }
     $ari->internalChrono('delNode_end');
 }