18 foreach($this->
fields as $k => &$v) { $v = $k; }
39 $this->db->query(
"SELECT `".implode(
"` , `", $this->
fields).
"` FROM `".$this->table.
"` WHERE `".$this->fields[
"id"].
"` = ".(
int)
$id);
41 return $this->db->nf() === 0 ? false : $this->db->get_row(
"assoc");
47 $this->db->query(
"SELECT `".implode(
"` , `", $this->
fields).
"` FROM `".$this->table.
"` WHERE `".$this->fields[
"left"].
"` >= ".(
int) $node[$this->fields[
"left"]].
" AND `".$this->fields[
"right"].
"` <= ".(
int) $node[$this->fields[
"right"]].
" ORDER BY `".$this->fields[
"left"].
"` ASC");
50 $this->db->query(
"SELECT `".implode(
"` , `", $this->
fields).
"` FROM `".$this->table.
"` WHERE `".$this->fields[
"parent_id"].
"` = ".(
int)
$id.
" ORDER BY `".$this->fields[
"position"].
"` ASC");
52 while($this->db->nextr()) $children[$this->db->f($this->fields[
"id"])] = $this->db->get_row(
"assoc");
58 if(!$node ===
false)
return false;
59 $this->db->query(
"SELECT `".implode(
"` , `", $this->
fields).
"` FROM `".$this->table.
"` WHERE `".$this->fields[
"left"].
"` <= ".(
int) $node[$this->fields[
"left"]].
" AND `".$this->fields[
"right"].
"` >= ".(
int) $node[$this->fields[
"right"]]);
60 while($this->db->nextr())
$path[$this->db->f($this->fields[
"id"])] = $this->db->get_row(
"assoc");
65 return $this->
_move(0, $parent, $position);
68 if((
int)
$id === 1) {
return false; }
72 $dif = $rgt - $lft + 1;
76 "DELETE FROM `".$this->table.
"` " .
77 "WHERE `".$this->fields[
"left"].
"` >= ".$lft.
" AND `".$this->fields[
"right"].
"` <= ".$rgt
81 "UPDATE `".$this->table.
"` " .
82 "SET `".$this->fields[
"left"].
"` = `".$this->fields[
"left"].
"` - ".$dif.
" " .
83 "WHERE `".$this->fields[
"left"].
"` > ".$rgt
87 "UPDATE `".$this->table.
"` " .
88 "SET `".$this->fields[
"right"].
"` = `".$this->fields[
"right"].
"` - ".$dif.
" " .
89 "WHERE `".$this->fields[
"right"].
"` > ".$lft
97 "UPDATE `".$this->table.
"` " .
98 "SET `".$this->fields[
"position"].
"` = `".$this->fields[
"position"].
"` - 1 " .
99 "WHERE `".$this->fields[
"parent_id"].
"` = ".$pid.
" AND `".$this->fields[
"position"].
"` > ".$pos
103 function _move(
$id, $ref_id, $position = 0, $is_copy =
false) {
104 if((
int)$ref_id === 0 || (
int)
$id === 1) {
return false; }
112 $node_ids =
array(-1);
113 if($node !==
false) {
116 if(in_array($ref_id, $node_ids))
return false;
117 $ndif = $node[$this->
fields[
"right"]] - $node[$this->
fields[
"left"]] + 1;
119 if($position >= count($rchildren)) {
120 $position = count($rchildren);
124 if($node !==
false && $is_copy ==
false) {
126 "UPDATE `".$this->table.
"` " .
127 "SET `".$this->fields[
"position"].
"` = `".$this->
fields[
"position"].
"` - 1 " .
129 "`".$this->fields[
"parent_id"].
"` = ".$node[$this->
fields[
"parent_id"]].
" AND " .
130 "`".$this->fields[
"position"].
"` > ".$node[$this->
fields[
"position"]];
132 "UPDATE `".$this->table.
"` " .
133 "SET `".$this->fields[
"left"].
"` = `".$this->fields[
"left"].
"` - ".$ndif.
" " .
134 "WHERE `".$this->fields[
"left"].
"` > ".$node[$this->fields[
"right"]];
136 "UPDATE `".$this->table.
"` " .
137 "SET `".$this->fields[
"right"].
"` = `".$this->fields[
"right"].
"` - ".$ndif.
" " .
139 "`".$this->fields[
"right"].
"` > ".$node[$this->fields[
"left"]].
" AND " .
140 "`".$this->fields[
"id"].
"` NOT IN (".implode(
",", $node_ids).
") ";
144 "UPDATE `".$this->table.
"` " .
145 "SET `".$this->fields[
"position"].
"` = `".$this->
fields[
"position"].
"` + 1 " .
147 "`".$this->fields[
"parent_id"].
"` = ".$ref_id.
" AND " .
148 "`".$this->fields[
"position"].
"` >= ".$position.
" " .
149 ( $is_copy ?
"" :
" AND `".$this->fields[
"id"].
"` NOT IN (".implode(
",", $node_ids).
") ");
151 $ref_ind = $ref_id === 0 ? (int)$rchildren[count($rchildren) - 1][$this->
fields[
"right"]] + 1 : (int)$ref_node[$this->
fields[
"right"]];
152 $ref_ind = max($ref_ind, 1);
154 $self = ($node !==
false && !$is_copy && (int)$node[$this->
fields[
"parent_id"]] == $ref_id && $position > $node[$this->
fields[
"position"]]) ? 1 : 0;
155 foreach($rchildren as $k => $v) {
156 if($v[$this->fields[
"position"]] - $self == $position) {
157 $ref_ind = (int)$v[$this->fields[
"left"]];
161 if($node !==
false && !$is_copy && $node[$this->fields[
"left"]] < $ref_ind) {
166 "UPDATE `".$this->table.
"` " .
167 "SET `".$this->fields[
"left"].
"` = `".$this->fields[
"left"].
"` + ".$ndif.
" " .
169 "`".$this->fields[
"left"].
"` >= ".$ref_ind.
" " .
170 ( $is_copy ?
"" :
" AND `".$this->fields[
"id"].
"` NOT IN (".implode(
",", $node_ids).
") ");
172 "UPDATE `".$this->table.
"` " .
173 "SET `".$this->fields[
"right"].
"` = `".$this->fields[
"right"].
"` + ".$ndif.
" " .
175 "`".$this->fields[
"right"].
"` >= ".$ref_ind.
" " .
176 ( $is_copy ?
"" :
" AND `".$this->fields[
"id"].
"` NOT IN (".implode(
",", $node_ids).
") ");
178 $ldif = $ref_id == 0 ? 0 : $ref_node[$this->fields[
"level"]] + 1;
180 if($node !==
false) {
181 $ldif = $node[$this->fields[
"level"]] - ($ref_node[$this->fields[
"level"]] + 1);
182 $idif = $node[$this->fields[
"left"]] - $ref_ind;
185 "INSERT INTO `".$this->table.
"` (" .
186 "`".$this->fields[
"parent_id"].
"`, " .
187 "`".$this->fields[
"position"].
"`, " .
188 "`".$this->fields[
"left"].
"`, " .
189 "`".$this->fields[
"right"].
"`, " .
190 "`".$this->fields[
"level"].
"`" .
194 "`".$this->fields[
"position"].
"`, " .
195 "`".$this->fields[
"left"].
"` - (".($idif + ($node[$this->fields[
"left"]] >= $ref_ind ? $ndif : 0)).
"), " .
196 "`".$this->fields[
"right"].
"` - (".($idif + ($node[$this->fields[
"left"]] >= $ref_ind ? $ndif : 0)).
"), " .
197 "`".$this->fields[
"level"].
"` - (".$ldif.
") " .
198 "FROM `".$this->table.
"` " .
200 "`".$this->fields[
"id"].
"` IN (".implode(
",", $node_ids).
") " .
201 "ORDER BY `".$this->fields[
"level"].
"` ASC";
205 "UPDATE `".$this->table.
"` SET " .
206 "`".$this->fields[
"parent_id"].
"` = ".$ref_id.
", " .
207 "`".$this->fields[
"position"].
"` = ".$position.
" " .
209 "`".$this->fields[
"id"].
"` = ".
$id;
211 "UPDATE `".$this->table.
"` SET " .
212 "`".$this->fields[
"left"].
"` = `".$this->fields[
"left"].
"` - (".$idif.
"), " .
213 "`".$this->fields[
"right"].
"` = `".$this->fields[
"right"].
"` - (".$idif.
"), " .
214 "`".$this->fields[
"level"].
"` = `".$this->fields[
"level"].
"` - (".$ldif.
") " .
216 "`".$this->fields[
"id"].
"` IN (".implode(
",", $node_ids).
") ";
221 "INSERT INTO `".$this->table.
"` (" .
222 "`".$this->fields[
"parent_id"].
"`, " .
223 "`".$this->fields[
"position"].
"`, " .
224 "`".$this->fields[
"left"].
"`, " .
225 "`".$this->fields[
"right"].
"`, " .
226 "`".$this->fields[
"level"].
"` " .
236 foreach($sql as $q) { $this->db->query($q); }
237 $ind = $this->db->insert_id();
238 if($is_copy) $this->
_fix_copy($ind, $position);
239 return $node ===
false || $is_copy ? $ind :
true;
246 for(
$i = $node[$this->
fields[
"left"]] + 1;
$i < $node[$this->
fields[
"right"]];
$i++) {
249 foreach($children as $cid => $child) {
250 if((
int)$cid == (
int)
$id) {
251 $this->db->query(
"UPDATE `".$this->table.
"` SET `".$this->fields[
"position"].
"` = ".$position.
" WHERE `".$this->fields[
"id"].
"` = ".$cid);
254 $this->db->query(
"UPDATE `".$this->table.
"` SET `".$this->fields[
"parent_id"].
"` = ".$map[(
int)$child[$this->fields[
"left"]]].
" WHERE `".$this->fields[
"id"].
"` = ".$cid);
255 for(
$i = $child[$this->fields[
"left"]] + 1;
$i < $child[$this->fields[
"right"]];
$i++) {
262 $this->db->query(
"" .
263 "CREATE TEMPORARY TABLE `temp_tree` (" .
264 "`".$this->
fields[
"id"].
"` INTEGER NOT NULL, " .
265 "`".$this->
fields[
"parent_id"].
"` INTEGER NOT NULL, " .
266 "`". $this->
fields[
"position"].
"` INTEGER NOT NULL" .
269 $this->db->query(
"" .
270 "INSERT INTO `temp_tree` " .
272 "`".$this->fields[
"id"].
"`, " .
273 "`".$this->fields[
"parent_id"].
"`, " .
274 "`".$this->fields[
"position"].
"` " .
275 "FROM `".$this->table.
"`" 278 $this->db->query(
"" .
279 "CREATE TEMPORARY TABLE `temp_stack` (" .
280 "`".$this->fields[
"id"].
"` INTEGER NOT NULL, " .
281 "`".$this->fields[
"left"].
"` INTEGER, " .
282 "`".$this->fields[
"right"].
"` INTEGER, " .
283 "`".$this->fields[
"level"].
"` INTEGER, " .
284 "`stack_top` INTEGER NOT NULL, " .
285 "`".$this->fields[
"parent_id"].
"` INTEGER, " .
286 "`".$this->fields[
"position"].
"` INTEGER " .
290 $this->db->query(
"SELECT COUNT(*) FROM temp_tree");
292 $maxcounter = (int) $this->db->f(0) * 2;
294 $this->db->query(
"" .
295 "INSERT INTO `temp_stack` " .
297 "`".$this->fields[
"id"].
"`, " .
302 "`".$this->fields[
"parent_id"].
"`, " .
303 "`".$this->fields[
"position"].
"` " .
304 "FROM `temp_tree` " .
305 "WHERE `".$this->fields[
"parent_id"].
"` = 0" 307 $this->db->query(
"DELETE FROM `temp_tree` WHERE `".$this->fields[
"parent_id"].
"` = 0");
310 $this->db->query(
"" .
312 "`temp_tree`.`".$this->fields[
"id"].
"` AS tempmin, " .
313 "`temp_tree`.`".$this->fields[
"parent_id"].
"` AS pid, " .
314 "`temp_tree`.`".$this->fields[
"position"].
"` AS lid " .
315 "FROM `temp_stack`, `temp_tree` " .
317 "`temp_stack`.`".$this->fields[
"id"].
"` = `temp_tree`.`".$this->fields[
"parent_id"].
"` AND " .
318 "`temp_stack`.`stack_top` = ".$currenttop.
" " .
319 "ORDER BY `temp_tree`.`".$this->fields[
"position"].
"` ASC LIMIT 1" 322 if ($this->db->nextr()) {
323 $tmp = $this->db->f(
"tempmin");
325 $q =
"INSERT INTO temp_stack (stack_top, `".$this->fields[
"id"].
"`, `".$this->fields[
"left"].
"`, `".$this->fields[
"right"].
"`, `".$this->fields[
"level"].
"`, `".$this->fields[
"parent_id"].
"`, `".$this->fields[
"position"].
"`) VALUES(".($currenttop + 1).
", ".$tmp.
", ".
$counter.
", NULL, ".$currenttop.
", ".$this->db->f(
"pid").
", ".$this->db->f(
"lid").
")";
326 $this->db->query($q);
327 $this->db->query(
"DELETE FROM `temp_tree` WHERE `".$this->fields[
"id"].
"` = ".$tmp);
332 $this->db->query(
"" .
333 "UPDATE temp_stack SET " .
334 "`".$this->fields[
"right"].
"` = ".
$counter.
", " .
335 "`stack_top` = -`stack_top` " .
336 "WHERE `stack_top` = ".$currenttop
344 unset($temp_fields[
"parent_id"]);
345 unset($temp_fields[
"position"]);
346 unset($temp_fields[
"left"]);
347 unset($temp_fields[
"right"]);
348 unset($temp_fields[
"level"]);
349 if(count($temp_fields) > 1) {
350 $this->db->query(
"" .
351 "CREATE TEMPORARY TABLE `temp_tree2` " .
352 "SELECT `".implode(
"`, `", $temp_fields).
"` FROM `".$this->table.
"` " 355 $this->db->query(
"TRUNCATE TABLE `".$this->table.
"`");
356 $this->db->query(
"" .
357 "INSERT INTO ".$this->table.
" (" .
358 "`".$this->fields[
"id"].
"`, " .
359 "`".$this->fields[
"parent_id"].
"`, " .
360 "`".$this->fields[
"position"].
"`, " .
361 "`".$this->fields[
"left"].
"`, " .
362 "`".$this->fields[
"right"].
"`, " .
363 "`".$this->fields[
"level"].
"` " .
366 "`".$this->fields[
"id"].
"`, " .
367 "`".$this->fields[
"parent_id"].
"`, " .
368 "`".$this->fields[
"position"].
"`, " .
369 "`".$this->fields[
"left"].
"`, " .
370 "`".$this->fields[
"right"].
"`, " .
371 "`".$this->fields[
"level"].
"` " .
373 "ORDER BY `".$this->fields[
"id"].
"`" 375 if(count($temp_fields) > 1) {
377 "UPDATE `".$this->table.
"` v, `temp_tree2` SET v.`".$this->fields[
"id"].
"` = v.`".$this->fields[
"id"].
"` ";
378 foreach($temp_fields as $k => $v) {
379 if($k ==
"id")
continue;
380 $sql .=
", v.`".$v.
"` = `temp_tree2`.`".$v.
"` ";
382 $sql .=
" WHERE v.`".$this->fields[
"id"].
"` = `temp_tree2`.`".$this->fields[
"id"].
"` ";
383 $this->db->query($sql);
390 $this->db->query(
"" .
392 "`".$this->
fields[
"left"].
"` FROM `".$this->table.
"` s " .
394 "`".$this->fields[
"parent_id"].
"` = 0 " 397 if($this->db->nf() == 0) {
398 $report[] =
"[FAIL]\tNo root node.";
401 $report[] = ($this->db->nf() > 1) ?
"[FAIL]\tMore than one root node." :
"[OK]\tJust one root node.";
403 $report[] = ($this->db->f(0) != 1) ?
"[FAIL]\tRoot node's left index is not 1." :
"[OK]\tRoot node's left index is 1.";
405 $this->db->query(
"" .
407 "COUNT(*) FROM `".$this->table.
"` s " .
409 "`".$this->fields[
"parent_id"].
"` != 0 AND " .
410 "(SELECT COUNT(*) FROM `".$this->table.
"` WHERE `".$this->fields[
"id"].
"` = s.`".$this->fields[
"parent_id"].
"`) = 0 ");
412 $report[] = ($this->db->f(0) > 0) ?
"[FAIL]\tMissing parents." :
"[OK]\tNo missing parents.";
414 $this->db->query(
"SELECT MAX(`".$this->
fields[
"right"].
"`) FROM `".$this->table.
"`");
416 $n = $this->db->f(0);
417 $this->db->query(
"SELECT COUNT(*) FROM `".$this->table.
"`");
419 $c = $this->db->f(0);
420 $report[] = (
$n/2 != $c) ?
"[FAIL]\tRight index does not match node count." :
"[OK]\tRight index matches count.";
422 $this->db->query(
"" .
423 "SELECT COUNT(`".$this->
fields[
"id"].
"`) FROM `".$this->table.
"` s " .
425 "(SELECT COUNT(*) FROM `".$this->table.
"` WHERE " .
426 "`".$this->fields[
"right"].
"` < s.`".$this->fields[
"right"].
"` AND " .
427 "`".$this->fields[
"left"].
"` > s.`".$this->fields[
"left"].
"` AND " .
428 "`".$this->fields[
"level"].
"` = s.`".$this->fields[
"level"].
"` + 1" .
430 "(SELECT COUNT(*) FROM `".$this->table.
"` WHERE " .
431 "`".$this->fields[
"parent_id"].
"` = s.`".$this->fields[
"id"].
"`" .
435 $report[] = ($this->db->f(0) > 0) ?
"[FAIL]\tAdjacency and nested set do not match." :
"[OK]\tNS and AJ match";
437 return implode(
"<br />",$report);
442 $this->db->query(
"SELECT * FROM ".$this->table.
" ORDER BY `".$this->fields[
"left"].
"`");
443 while($this->db->nextr()) $nodes[] = $this->db->get_row(
"assoc");
446 foreach($nodes as $node) {
447 echo str_repeat(
" ",(
int)$node[$this->
fields[
"level"]] * 2);
448 echo $node[$this->fields[
"id"]].
" (".$node[$this->fields[
"left"]].
",".$node[$this->fields[
"right"]].
",".$node[$this->fields[
"level"]].
",".$node[$this->fields[
"parent_id"]].
",".$node[$this->fields[
"position"]].
")<br />";
450 echo str_repeat(
"-",40);
456 $this->db->query(
"TRUNCATE TABLE `".$this->table.
"`");
457 $this->db->query(
"" .
458 "INSERT INTO `".$this->table.
"` (" .
459 "`".$this->fields[
"id"].
"`, " .
460 "`".$this->fields[
"parent_id"].
"`, " .
461 "`".$this->fields[
"position"].
"`, " .
462 "`".$this->fields[
"left"].
"`, " .
463 "`".$this->fields[
"right"].
"`, " .
464 "`".$this->fields[
"level"].
"` " .
480 $this->
fields = array_merge($this->
fields, $add_fields);
481 $this->add_fields = $add_fields;
485 $id = parent::_create((
int)
$data[$this->
fields[
"id"]], (
int)
$data[$this->fields[
"position"]]);
488 $this->set_data(
$data);
489 return "{ \"status\" : 1, \"id\" : ".(int)
$id.
" }";
491 return "{ \"status\" : 0 }";
494 if(count($this->add_fields) == 0) {
return "{ \"status\" : 1 }"; }
495 $s =
"UPDATE `".$this->table.
"` SET `".$this->
fields[
"id"].
"` = `".$this->
fields[
"id"].
"` ";
496 foreach($this->add_fields as $k => $v) {
497 if(isset(
$data[$k]))
$s .=
", `".$this->fields[$v].
"` = \"".$this->db->escape(
$data[$k]).
"\" ";
498 else $s .=
", `".$this->fields[$v].
"` = `".$this->
fields[$v].
"` ";
500 $s .=
"WHERE `".$this->fields[
"id"].
"` = ".(int)
$data[
"id"];
501 $this->db->query(
$s);
502 return "{ \"status\" : 1 }";
507 $id = parent::_move((
int)
$data[
"id"], (
int)$data[
"ref"], (
int)$data[
"position"], (
int)$data[
"copy"]);
508 if(!
$id)
return "{ \"status\" : 0 }";
509 if((
int)$data[
"copy"] && count($this->add_fields)) {
514 foreach($data as $dk => $dv) {
515 $s =
"UPDATE `".$this->table.
"` SET `".$this->
fields[
"id"].
"` = `".$this->
fields[
"id"].
"` ";
516 foreach($this->add_fields as $k => $v) {
517 if(isset($dv[$k]))
$s .=
", `".$this->fields[$v].
"` = \"".$this->db->escape($dv[$k]).
"\" ";
518 else $s .=
", `".$this->fields[$v].
"` = `".$this->
fields[$v].
"` ";
520 $s .=
"WHERE `".$this->fields[
"id"].
"` = ".$ids[
$i];
521 $this->db->query(
$s);
525 return "{ \"status\" : 1, \"id\" : ".$id.
" }";
528 $id = parent::_remove((
int)
$data[
"id"]);
529 return "{ \"status\" : 1 }";
533 if((
int)$data[
"id"] === 1 && count($tmp) === 0) {
534 $this->_create_default();
538 if((
int)$data[
"id"] === 0)
return json_encode(
$result);
539 foreach($tmp as $k => $v) {
541 "attr" =>
array(
"id" =>
"node_".$k,
"rel" => $v[$this->
fields[
"type"]]),
542 "data" => $v[$this->fields[
"title"]],
543 "state" => ((
int)$v[$this->fields[
"right"]] - (
int)$v[$this->fields[
"left"]] > 1) ?
"closed" :
"" 549 $this->db->query(
"SELECT `".$this->
fields[
"left"].
"`, `".$this->
fields[
"right"].
"` FROM `".$this->table.
"` WHERE `".$this->fields[
"title"].
"` LIKE '%".$this->db->escape(
$data[
"search_str"]).
"%'");
550 if($this->db->nf() === 0)
return "[]";
551 $q =
"SELECT DISTINCT `".$this->fields[
"id"].
"` FROM `".$this->table.
"` WHERE 0 ";
552 while($this->db->nextr()) {
553 $q .=
" OR (`".$this->fields[
"left"].
"` < ".(int)$this->db->f(0).
" AND `".$this->
fields[
"right"].
"` > ".(int)$this->db->f(1).
") ";
556 $this->db->query($q);
557 while($this->db->nextr()) {
$result[] =
"#node_".$this->db->f(0); }
563 $this->create_node(
array(
569 $this->create_node(
array(
575 $this->create_node(
array(
581 $this->create_node(
array(
587 $this->create_node(
array(
590 "title" =>
"index.html",
593 $this->create_node(
array(
596 "title" =>
"doc.html",
_fix_copy($id, $position)
__construct($table="tree", $fields=array())
_get_children($id, $recursive=false)
if(!array_key_exists('StateId', $_REQUEST)) $id
if(!is_dir( $entity_dir)) exit("Fatal Error ([A-Za-z0-9]+)\+" &#(? foreach( $entity_files as $file) $output
_create($parent, $position)
_move($id, $ref_id, $position=0, $is_copy=false)
Create styles array
The data for the language used.
__construct($table="tree", $fields=array(), $add_fields=array("title"=> "title", "type"=> "type"))