Revision 5656
Added by ben leinfelder about 14 years ago
lib/style/skins/semtools/search.js | ||
---|---|---|
40 | 40 |
// Entity |
41 | 41 |
//for (var i=0; i < submitFormObj.activeEntities.length; i++) { |
42 | 42 |
var searchClass = submitFormObj.activeEntitiesClass.value; |
43 |
var searchValue = submitFormObj.activeEntities.value; |
|
43 |
var searchValue = submitFormObj.activeEntitiesValue.value;
|
|
44 | 44 |
if (searchValue!="") { |
45 | 45 |
submitFormObj.query.value += |
46 | 46 |
"<condition " + |
... | ... | |
53 | 53 |
// Characteristic |
54 | 54 |
//for (var i=0; i < submitFormObj.activeCharacteristics.length; i++) { |
55 | 55 |
var searchClass = submitFormObj.activeCharacteristicsClass.value; |
56 |
var searchValue = submitFormObj.activeCharacteristics.value; |
|
56 |
var searchValue = submitFormObj.activeCharacteristicsValue.value;
|
|
57 | 57 |
if (searchValue!="") { |
58 | 58 |
submitFormObj.query.value += |
59 | 59 |
"<condition " + |
... | ... | |
66 | 66 |
// Protocol |
67 | 67 |
//for (var i=0; i < submitFormObj.activeProtocols.length; i++) { |
68 | 68 |
var searchClass = submitFormObj.activeProtocolsClass.value; |
69 |
var searchValue = submitFormObj.activeProtocols.value; |
|
69 |
var searchValue = submitFormObj.activeProtocolsValue.value;
|
|
70 | 70 |
if (searchValue!="") { |
71 | 71 |
submitFormObj.query.value += |
72 | 72 |
"<condition " + |
... | ... | |
79 | 79 |
// Measurement |
80 | 80 |
//for (var i=0; i < submitFormObj.activeMeasurements.length; i++) { |
81 | 81 |
var searchClass = submitFormObj.activeMeasurementsClass.value; |
82 |
var searchValue = submitFormObj.activeMeasurements.value; |
|
82 |
var searchValue = submitFormObj.activeMeasurementsValue.value;
|
|
83 | 83 |
if (searchValue!="") { |
84 | 84 |
submitFormObj.query.value += |
85 | 85 |
"<condition " + |
lib/style/skins/semtools/jsTree/_demo/_dump.sql | ||
---|---|---|
1 |
CREATE TABLE IF NOT EXISTS `tree` ( |
|
2 |
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, |
|
3 |
`parent_id` bigint(20) unsigned NOT NULL, |
|
4 |
`position` bigint(20) unsigned NOT NULL, |
|
5 |
`left` bigint(20) unsigned NOT NULL, |
|
6 |
`right` bigint(20) unsigned NOT NULL, |
|
7 |
`level` bigint(20) unsigned NOT NULL, |
|
8 |
`title` text CHARACTER SET utf8 COLLATE utf8_unicode_ci, |
|
9 |
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, |
|
10 |
PRIMARY KEY (`id`) |
|
11 |
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ; |
|
12 |
|
|
13 |
INSERT INTO `tree` (`id`, `parent_id`, `position`, `left`, `right`, `level`, `title`, `type`) VALUES |
|
14 |
(1, 0, 2, 1, 14, 0, 'ROOT', ''), |
|
15 |
(2, 1, 0, 2, 11, 1, 'C:', 'drive'), |
|
16 |
(3, 2, 0, 3, 6, 2, '_demo', 'folder'), |
|
17 |
(4, 3, 0, 4, 5, 3, 'index.html', 'default'), |
|
18 |
(5, 2, 1, 7, 10, 2, '_docs', 'folder'), |
|
19 |
(6, 1, 1, 12, 13, 1, 'D:', 'drive'), |
|
20 |
(12, 5, 0, 8, 9, 3, 'zmei.html', 'default'); |
|
0 | 21 |
lib/style/skins/semtools/jsTree/_demo/_install.txt | ||
---|---|---|
1 |
1) Create a database and a user with all privileges for this database. |
|
2 |
2) Edit the config.php file and update the configuration for the database at the top of the file |
|
3 |
3) Import the _dump.sql in your newly created database |
|
4 |
4) You are ready to go |
|
5 |
|
|
6 |
*) PLEASE NOTE THAT THE PHP TREE CLASS HAS NOT BEEN THOROUGHLY TESTED |
|
0 | 7 |
lib/style/skins/semtools/jsTree/_demo/_inc/class._database_i.php | ||
---|---|---|
1 |
<?php |
|
2 |
class _database { |
|
3 |
private $data = false; |
|
4 |
private $result = false; |
|
5 |
private $row = false; |
|
6 |
|
|
7 |
public $settings = array( |
|
8 |
"servername"=> "localhost", |
|
9 |
"serverport"=> "3306", |
|
10 |
"username" => false, |
|
11 |
"password" => false, |
|
12 |
"database" => false, |
|
13 |
"persist" => false, |
|
14 |
"dieonerror"=> false, |
|
15 |
"showerror" => false, |
|
16 |
"error_file"=> true |
|
17 |
); |
|
18 |
|
|
19 |
function __construct() { |
|
20 |
global $db_config; |
|
21 |
$this->settings = array_merge($this->settings, $db_config); |
|
22 |
if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log"; |
|
23 |
} |
|
24 |
|
|
25 |
function connect() { |
|
26 |
$this->data = new mysqli( |
|
27 |
$this->settings["servername"], |
|
28 |
$this->settings["username"], |
|
29 |
$this->settings["password"], |
|
30 |
$this->settings["database"], |
|
31 |
$this->settings["serverport"] |
|
32 |
); |
|
33 |
|
|
34 |
if(mysqli_connect_errno()) { |
|
35 |
$this->error("Connection error: ".mysqli_connect_error() ); |
|
36 |
return false; |
|
37 |
} |
|
38 |
if(!$this->data->set_charset("utf8")) { |
|
39 |
$this->error("Error loading character set utf8"); |
|
40 |
return false; |
|
41 |
} |
|
42 |
return true; |
|
43 |
} |
|
44 |
|
|
45 |
function query($sql) { |
|
46 |
if(!$this->data && !$this->connect()) { |
|
47 |
$this->error("Could node connect for query: ".$sql); |
|
48 |
return false; |
|
49 |
} |
|
50 |
//echo $sql."<br />:"; |
|
51 |
if(!($this->result = $this->data->query($sql))) $this->error($sql); |
|
52 |
return ($this->result) ? true : false; |
|
53 |
} |
|
54 |
|
|
55 |
function nextr(){ |
|
56 |
if(!$this->result) { |
|
57 |
$this->error("No query pending"); |
|
58 |
return false; |
|
59 |
} |
|
60 |
unset($this->row); |
|
61 |
$this->row = $this->result->fetch_array(MYSQL_BOTH); |
|
62 |
return ($this->row) ? true : false ; |
|
63 |
} |
|
64 |
|
|
65 |
function get_row($mode = "both") { |
|
66 |
if(!$this->row) return false; |
|
67 |
|
|
68 |
$return = array(); |
|
69 |
switch($mode) { |
|
70 |
case "assoc": |
|
71 |
foreach($this->row as $k => $v) { |
|
72 |
if(!is_int($k)) $return[$k] = $v; |
|
73 |
} |
|
74 |
break; |
|
75 |
case "num": |
|
76 |
foreach($this->row as $k => $v) { |
|
77 |
if(is_int($k)) $return[$k] = $v; |
|
78 |
} |
|
79 |
break; |
|
80 |
default: |
|
81 |
$return = $this->row; |
|
82 |
break; |
|
83 |
} |
|
84 |
return array_map("stripslashes",$return); |
|
85 |
} |
|
86 |
|
|
87 |
function get_all($mode = "both", $key = false) { |
|
88 |
if(!$this->result) { |
|
89 |
$this->error("No query pending"); |
|
90 |
return false; |
|
91 |
} |
|
92 |
$return = array(); |
|
93 |
while($this->nextr()) { |
|
94 |
if($key !== false) $return[$this->f($key)] = $this->get_row($mode); |
|
95 |
else $return[] = $this->get_row($mode); |
|
96 |
} |
|
97 |
return $return; |
|
98 |
} |
|
99 |
|
|
100 |
function f($index) { |
|
101 |
return stripslashes($this->row[$index]); |
|
102 |
} |
|
103 |
|
|
104 |
function go_to($row) { |
|
105 |
if(!$this->result) { |
|
106 |
$this->error("No query pending"); |
|
107 |
return false; |
|
108 |
} |
|
109 |
if(!$this->data->data_seek($row)) $this->error(); |
|
110 |
} |
|
111 |
|
|
112 |
function nf() { |
|
113 |
if (!$this->result) { |
|
114 |
$this->error("nf: no result set"); |
|
115 |
return false; |
|
116 |
} |
|
117 |
return $this->result->num_rows; |
|
118 |
} |
|
119 |
function af() { |
|
120 |
return $this->data->affected_rows; |
|
121 |
} |
|
122 |
function error($string = "") { |
|
123 |
$error = $this->data->error; |
|
124 |
if($this->settings["show_error"]) echo $error; |
|
125 |
if($this->settings["error_file"] !== false) { |
|
126 |
$handle = @fopen($this->settings["error_file"], "a+"); |
|
127 |
if($handle) { |
|
128 |
@fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n"); |
|
129 |
@fclose($handle); |
|
130 |
} |
|
131 |
} |
|
132 |
if($this->settings["dieonerror"]) { |
|
133 |
if(isset($this->result)) $this->result->free(); |
|
134 |
@$this->data->close(); |
|
135 |
die(); |
|
136 |
} |
|
137 |
} |
|
138 |
function insert_id() { |
|
139 |
return $this->data->insert_id; |
|
140 |
} |
|
141 |
function escape($string) { |
|
142 |
if(!$this->data) return addslashes($string); |
|
143 |
return $this->data->escape_string($string); |
|
144 |
} |
|
145 |
|
|
146 |
function destroy() { |
|
147 |
if(isset($this->result)) $this->result->free(); |
|
148 |
if($this->data) $this->data->close(); |
|
149 |
} |
|
150 |
|
|
151 |
|
|
152 |
} |
|
0 | 153 |
lib/style/skins/semtools/jsTree/_docs/ui.html | ||
---|---|---|
1 |
<!DOCTYPE html |
|
2 |
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
|
3 |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
|
4 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
5 |
<head> |
|
6 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|
7 |
<title>jsTree v.1.0 - UI documentation</title> |
|
8 |
<script type="text/javascript" src="../_lib/jquery.js"></script> |
|
9 |
<script type="text/javascript" src="../_lib/jquery.cookie.js"></script> |
|
10 |
<script type="text/javascript" src="../_lib/jquery.hotkeys.js"></script> |
|
11 |
<script type="text/javascript" src="../jquery.jstree.js"></script> |
|
12 |
|
|
13 |
<link type="text/css" rel="stylesheet" href="syntax/!style.css"/> |
|
14 |
<link type="text/css" rel="stylesheet" href="!style.css"/> |
|
15 |
<script type="text/javascript" src="syntax/!script.js"></script> |
|
16 |
</head> |
|
17 |
<body> |
|
18 |
<div id="container"> |
|
19 |
|
|
20 |
<h1>jsTree v.1.0 - UI plugin</h1> |
|
21 |
<h2>Description</h2> |
|
22 |
<div id="description"> |
|
23 |
<p>The <code>UI</code> plugin handles selecting, deselecting and hovering tree items.</p> |
|
24 |
</div> |
|
25 |
|
|
26 |
<h2 id="configuration">Configuration</h2> |
|
27 |
<div class="panel configuration"> |
|
28 |
<h3>select_limit</h3> |
|
29 |
<p class="meta">A number. Default is <code>-1</code>.</p> |
|
30 |
<p>Defines how many nodes can be selected at a given time (<code>-1</code> means unlimited).</p> |
|
31 |
|
|
32 |
<h3>select_multiple_modifier</h3> |
|
33 |
<p class="meta">A string. Default is <code>"ctrl"</code>.</p> |
|
34 |
<p>The special key used to make a click add to the selection and not replace it (<code>"ctrl"</code>, <code>"shift"</code>, <code>"alt"</code>, <code>"meta"</code>).<br />You can also set this to <code>"on"</code> making every click add to the selection.</p> |
|
35 |
|
|
36 |
<h3>selected_parent_close</h3> |
|
37 |
<p class="meta">A string (or <code>false</code>). Default is <code>"select_parent"</code>.</p> |
|
38 |
<p>What action to take when a selected node's parent is closed (making the selected node invisible). Possible values are <code>false</code> - do nothing, <code>"select_parent"</code> - select the closed node's parent and <code>"deselect"</code> - deselect the node.</p> |
|
39 |
|
|
40 |
<h3>select_prev_on_delete</h3> |
|
41 |
<p class="meta">A boolean. Default is <code>true</code>.</p> |
|
42 |
<p>If set to <code>true</code> when a selected node is deleted, its previous sibling (or parent) is selected.</p> |
|
43 |
|
|
44 |
<h3>disable_selecting_children</h3> |
|
45 |
<p class="meta">A boolean. Default is <code>false</code>.</p> |
|
46 |
<p>If set to <code>true</code> you will not be able to select children of already selected nodes.</p> |
|
47 |
|
|
48 |
<h3>initially_select</h3> |
|
49 |
<p class="meta">An array. Default is <code>[]</code>.</p> |
|
50 |
<p>Defines which nodes are to be automatically selected when the tree finishes loading - a list of IDs is expected.</p> |
|
51 |
|
|
52 |
</div> |
|
53 |
|
|
54 |
<h2 id="demos">Demos</h2> |
|
55 |
<div class="panel"> |
|
56 |
|
|
57 |
<h3>Using the UI plugin</h3> |
|
58 |
<div id="demo1" class="demo"> |
|
59 |
<ul> |
|
60 |
<li id="phtml_1"> |
|
61 |
<a href="#">Root node 1</a> |
|
62 |
<ul> |
|
63 |
<li id="phtml_2"> |
|
64 |
<a href="#">Child node 1</a> |
|
65 |
</li> |
|
66 |
<li id="phtml_3"> |
|
67 |
<a href="#">Child node 2</a> |
|
68 |
</li> |
|
69 |
</ul> |
|
70 |
</li> |
|
71 |
<li id="phtml_4"> |
|
72 |
<a href="#">Root node 2</a> |
|
73 |
</li> |
|
74 |
</ul> |
|
75 |
</div> |
|
76 |
<script type="text/javascript" class="source"> |
|
77 |
$(function () { |
|
78 |
$("#demo1").jstree({ |
|
79 |
"ui" : { |
|
80 |
"select_limit" : 2, |
|
81 |
"select_multiple_modifier" : "alt", |
|
82 |
"selected_parent_close" : "select_parent", |
|
83 |
"initially_select" : [ "phtml_2" ] |
|
84 |
}, |
|
85 |
"core" : { "initially_open" : [ "phtml_1" ] }, |
|
86 |
"plugins" : [ "themes", "html_data", "ui" ] |
|
87 |
}); |
|
88 |
}); |
|
89 |
</script> |
|
90 |
|
|
91 |
</div> |
|
92 |
|
|
93 |
<h2 id="api">API</h2> |
|
94 |
<div class="panel api"> |
|
95 |
|
|
96 |
<h3 id="_get_node">._get_node ( node , allow_multiple )</h3> |
|
97 |
<p>Overrides the function form the <a href="core.html#_get_node">core</a> module.<br />if <code>node</code> is <code>undefined</code> or <code>null</code> and <code>allow_multiple</code> is <code>true</code> all the currently selected nodes are returned<br />if <code>node</code> is <code>undefined</code> or <code>null</code> and <code>allow_multiple</code> is NOT <code>true</code> only the last selected node is returned.</p> |
|
98 |
<ul class="arguments"> |
|
99 |
<li> |
|
100 |
<code class="tp">mixed</code> <strong>node</strong> |
|
101 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
102 |
</li> |
|
103 |
<li> |
|
104 |
<code class="tp">boolean</code> <strong>allow_multiple</strong> |
|
105 |
<p>Whether to return all selected nodes or only the last selected one if <code>node</code> is <code>null</code>.</p> |
|
106 |
</li> |
|
107 |
</ul> |
|
108 |
|
|
109 |
<h3 id="save_selected">.save_selected ( )</h3> |
|
110 |
<p>Saves away the current selection state of the tree (saves it in a variable, so do not expect a restore after a refresh - for that functionality refer to the <a href="cookies.html">cookies plugin</a>. Used mostly internally. Triggers an event.</p> |
|
111 |
|
|
112 |
<h3 id="reselect">.reselect ( )</h3> |
|
113 |
<p>Restores the state of the tree using the variable saved in the above function. Used mostly internally. Triggers an event.</p> |
|
114 |
|
|
115 |
<h3 id="refresh">.refresh ( node )</h3> |
|
116 |
<p>Overrides the function form the <a href="core.html#refresh">core</a> module.<br />Enables saving the selection state before the refresh and restoring it afterwards.</p> |
|
117 |
|
|
118 |
<h3 id="hover_node">.hover_node ( node )</h3> |
|
119 |
<p>Sets the specified node as hovered. Triggers an event.</p> |
|
120 |
<ul class="arguments"> |
|
121 |
<li> |
|
122 |
<code class="tp">mixed</code> <strong>node</strong> |
|
123 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
124 |
</li> |
|
125 |
</ul> |
|
126 |
|
|
127 |
<h3 id="dehover_node">.dehover_node ( )</h3> |
|
128 |
<p>Removes the hover state from the currently hovered node (if there is one). Triggers an event.</p> |
|
129 |
|
|
130 |
|
|
131 |
<h3 id="select_node">.select_node ( node , check , event )</h3> |
|
132 |
<ul class="arguments"> |
|
133 |
<li> |
|
134 |
<code class="tp">mixed</code> <strong>node</strong> |
|
135 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
136 |
</li> |
|
137 |
<li> |
|
138 |
<code class="tp">bool</code> <strong>check</strong> |
|
139 |
<p>Whether to check the specified rules and do appropriate actions (check <code>select_limit</code>, deselect other nodes respectively, etc) or to just force selection of the node regardless of <code>select_limit</code>.</p> |
|
140 |
</li> |
|
141 |
<li> |
|
142 |
<code class="tp">event</code> <strong>event</strong> |
|
143 |
<p>Used internally - when a click on a node caused this function to be executed.</p> |
|
144 |
</li> |
|
145 |
</ul> |
|
146 |
|
|
147 |
<div style="height:1px; visibility:hidden; overflow:hidden;"><span id="toggle_select"> </span></div> |
|
148 |
<h3 id="deselect_node">.deselect_node ( node ), .toggle_select ( node )</h3> |
|
149 |
<p>There functions control the selected state on a node. <code>deselect_node</code> triggers an event.</p> |
|
150 |
<ul class="arguments"> |
|
151 |
<li> |
|
152 |
<code class="tp">mixed</code> <strong>node</strong> |
|
153 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
154 |
</li> |
|
155 |
</ul> |
|
156 |
|
|
157 |
<h3 id="deselect_all">.deselect_all ( context )</h3> |
|
158 |
<p>Deselects all selected nodes. If context is set - only the selected nodes within that context are deselected. Triggers an event.</p> |
|
159 |
<ul class="arguments"> |
|
160 |
<li> |
|
161 |
<code class="tp">mixed</code> <strong>context</strong> |
|
162 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
163 |
</li> |
|
164 |
</ul> |
|
165 |
|
|
166 |
<h3 id="get_selected">.get_selected ( context )</h3> |
|
167 |
<p>Returns all selected nodes. If context is set - only the selected nodes within that context are returned.</p> |
|
168 |
<ul class="arguments"> |
|
169 |
<li> |
|
170 |
<code class="tp">mixed</code> <strong>context</strong> |
|
171 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
172 |
</li> |
|
173 |
</ul> |
|
174 |
|
|
175 |
<h3 id="is_selected">.is_selected ( node )</h3> |
|
176 |
<p>Returns whether the specified node is selected or not.</p> |
|
177 |
<ul class="arguments"> |
|
178 |
<li> |
|
179 |
<code class="tp">mixed</code> <strong>node</strong> |
|
180 |
<p>This can be a DOM node, jQuery node or selector pointing to an element within the tree.</p> |
|
181 |
</li> |
|
182 |
</ul> |
|
183 |
|
|
184 |
</div> |
|
185 |
|
|
186 |
</div> |
|
187 |
</body> |
|
188 |
</html> |
|
0 | 189 |
lib/style/skins/semtools/jsTree/_docs/!style.css | ||
---|---|---|
1 |
html, body { margin:0; padding:0; } |
|
2 |
body, td, th, pre, code, select, option, input, textarea { font-family:"lucida grande",tahoma,verdana,arial,sans-serif; font-size:10pt; } |
|
3 |
h1 { margin:0; padding:0.2em 0 0.5em 0; font-size:14pt; font-family:Georgia; /*text-shadow:1px 1px 2px gray;*/ border-bottom:2px solid; margin-bottom:0.5em; text-align:center; } |
|
4 |
h2 { margin:0.5em 0 0.5em 0; padding:0.5em 0 0.5em 20px; font-size:12pt; font-family:Georgia; color:white; background:silver; text-shadow:1px 1px 2px gray; clear:both; -moz-border-radius:5px; } |
|
5 |
h3 { margin:0; padding:0.5em 0 0.5em 0; font-size:11.5pt; font-family:Georgia; color:gray; clear:both; } |
|
6 |
p { padding:0em 0 0.5em 0; margin:0; line-height:1.8em; } |
|
7 |
p.meta { font-size:9pt; color:gray; margin-top:-5px; } |
|
8 |
.arguments .tp, p code { color:green; padding:0 4px; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-style: normal !important; font-size:13px; } |
|
9 |
#description, .panel { margin:0 20px; } |
|
10 |
#container { width:800px; margin:10px auto; overflow:hidden; } |
|
11 |
.demo { width:255px; float:left; margin:0; border:1px solid gray; background:white; overflow:auto; } |
|
12 |
.code { width:490px; float:right; margin:0 0 10px 0; border:1px solid gray; font-size:12px; } |
|
13 |
pre { display:block; } |
|
14 |
.code_f { border:1px solid gray; margin-bottom:1em; } |
|
15 |
.syntaxhighlighter { margin:0 0 0 0 !important; padding:0 !important; line-height:18px; } |
|
16 |
|
|
17 |
.log { padding:4px; border:1px solid gray; margin-bottom:1em; } |
|
18 |
.button { display:block; margin-bottom:0.5em; } |
|
19 |
.arguments { margin:0em 1em; padding:0; list-style-type:none; } |
|
20 |
.arguments .tp { padding:0 0 0 0; float:left; width:70px; } |
|
21 |
.arguments strong { display:block; } |
|
22 |
|
|
23 |
.api h3 { margin-left:-10px; color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:14px; margin-top:2em; border-top:1px solid; width:780px; } |
|
24 |
.api .arguments li strong { color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:13px; } |
|
25 |
|
|
26 |
.configuration h3 { margin-left:-10px; color:black; font-family: "Consolas", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace !important; font-weight: normal !important; font-size:14px; margin-top:2em; border-top:1px solid; width:780px; } |
|
27 |
.note { background:#ffffee; padding:10px 20px; border:1px solid #333; -moz-border-radius:5px; border-radius:5px; -webkit-border-radius:5px; margin-bottom:15px; text-align:center; font-weight:bold; } |
|
28 |
|
|
29 |
ul.columns { list-style-type:none; width:700px; margin:5px auto 15px auto; padding:0; overflow:hidden; } |
|
30 |
ul.columns li { float:left; margin:0; padding:0 0 0 0px; line-height:18px; width:345px; } |
|
31 |
ul.plugins li { width:220px; text-align:left; padding:5px 0; } |
|
32 |
ul.plugins li a { text-decoration:none; color:#3B5998; } |
|
33 |
ul.plugins li a:hover { text-decoration:underline; } |
|
34 |
ul.plugins li p { text-align:left; font-size:9px; color:#333; margin:0 5px 0 0; } |
|
35 |
|
|
36 |
.demo, .demo input, .jstree-dnd-helper, #vakata-contextmenu { font-size:10px; font-family:Verdana; } |
|
37 |
|
|
0 | 38 |
lib/style/skins/semtools/jsTree/_demo/_inc/class.tree.php | ||
---|---|---|
1 |
<?php |
|
2 |
class _tree_struct { |
|
3 |
// Structure table and fields |
|
4 |
protected $table = ""; |
|
5 |
protected $fields = array( |
|
6 |
"id" => false, |
|
7 |
"parent_id" => false, |
|
8 |
"position" => false, |
|
9 |
"left" => false, |
|
10 |
"right" => false, |
|
11 |
"level" => false |
|
12 |
); |
|
13 |
|
|
14 |
// Constructor |
|
15 |
function __construct($table = "tree", $fields = array()) { |
|
16 |
$this->table = $table; |
|
17 |
if(!count($fields)) { |
|
18 |
foreach($this->fields as $k => &$v) { $v = $k; } |
|
19 |
} |
|
20 |
else { |
|
21 |
foreach($fields as $key => $field) { |
|
22 |
switch($key) { |
|
23 |
case "id": |
|
24 |
case "parent_id": |
|
25 |
case "position": |
|
26 |
case "left": |
|
27 |
case "right": |
|
28 |
case "level": |
|
29 |
$this->fields[$key] = $field; |
|
30 |
break; |
|
31 |
} |
|
32 |
} |
|
33 |
} |
|
34 |
// Database |
|
35 |
$this->db = new _database; |
|
36 |
} |
|
37 |
|
|
38 |
function _get_node($id) { |
|
39 |
$this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["id"]."` = ".(int) $id); |
|
40 |
$this->db->nextr(); |
|
41 |
return $this->db->nf() === 0 ? false : $this->db->get_row("assoc"); |
|
42 |
} |
|
43 |
function _get_children($id, $recursive = false) { |
|
44 |
$children = array(); |
|
45 |
if($recursive) { |
|
46 |
$node = $this->_get_node($id); |
|
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"); |
|
48 |
} |
|
49 |
else { |
|
50 |
$this->db->query("SELECT `".implode("` , `", $this->fields)."` FROM `".$this->table."` WHERE `".$this->fields["parent_id"]."` = ".(int) $id." ORDER BY `".$this->fields["position"]."` ASC"); |
|
51 |
} |
|
52 |
while($this->db->nextr()) $children[$this->db->f($this->fields["id"])] = $this->db->get_row("assoc"); |
|
53 |
return $children; |
|
54 |
} |
|
55 |
function _get_path($id) { |
|
56 |
$node = $this->_get_node($id); |
|
57 |
$path = array(); |
|
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"); |
|
61 |
return $path; |
|
62 |
} |
|
63 |
|
|
64 |
function _create($parent, $position) { |
|
65 |
return $this->_move(0, $parent, $position); |
|
66 |
} |
|
67 |
function _remove($id) { |
|
68 |
if((int)$id === 1) { return false; } |
|
69 |
$data = $this->_get_node($id); |
|
70 |
$lft = (int)$data[$this->fields["left"]]; |
|
71 |
$rgt = (int)$data[$this->fields["right"]]; |
|
72 |
$dif = $rgt - $lft + 1; |
|
73 |
|
|
74 |
// deleting node and its children |
|
75 |
$this->db->query("" . |
|
76 |
"DELETE FROM `".$this->table."` " . |
|
77 |
"WHERE `".$this->fields["left"]."` >= ".$lft." AND `".$this->fields["right"]."` <= ".$rgt |
|
78 |
); |
|
79 |
// shift left indexes of nodes right of the node |
|
80 |
$this->db->query("". |
|
81 |
"UPDATE `".$this->table."` " . |
|
82 |
"SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$dif." " . |
|
83 |
"WHERE `".$this->fields["left"]."` > ".$rgt |
|
84 |
); |
|
85 |
// shift right indexes of nodes right of the node and the node's parents |
|
86 |
$this->db->query("" . |
|
87 |
"UPDATE `".$this->table."` " . |
|
88 |
"SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$dif." " . |
|
89 |
"WHERE `".$this->fields["right"]."` > ".$lft |
|
90 |
); |
|
91 |
|
|
92 |
$pid = (int)$data[$this->fields["parent_id"]]; |
|
93 |
$pos = (int)$data[$this->fields["position"]]; |
|
94 |
|
|
95 |
// Update position of siblings below the deleted node |
|
96 |
$this->db->query("" . |
|
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 |
|
100 |
); |
|
101 |
return true; |
|
102 |
} |
|
103 |
function _move($id, $ref_id, $position = 0, $is_copy = false) { |
|
104 |
if((int)$ref_id === 0 || (int)$id === 1) { return false; } |
|
105 |
$sql = array(); // Queries executed at the end |
|
106 |
$node = $this->_get_node($id); // Node data |
|
107 |
$nchildren = $this->_get_children($id); // Node children |
|
108 |
$ref_node = $this->_get_node($ref_id); // Ref node data |
|
109 |
$rchildren = $this->_get_children($ref_id);// Ref node children |
|
110 |
|
|
111 |
$ndif = 2; |
|
112 |
$node_ids = array(-1); |
|
113 |
if($node !== false) { |
|
114 |
$node_ids = array_keys($this->_get_children($id, true)); |
|
115 |
// TODO: should be !$is_copy && , but if copied to self - screws some right indexes |
|
116 |
if(in_array($ref_id, $node_ids)) return false; |
|
117 |
$ndif = $node[$this->fields["right"]] - $node[$this->fields["left"]] + 1; |
|
118 |
} |
|
119 |
if($position >= count($rchildren)) { |
|
120 |
$position = count($rchildren); |
|
121 |
} |
|
122 |
|
|
123 |
// Not creating or copying - old parent is cleaned |
|
124 |
if($node !== false && $is_copy == false) { |
|
125 |
$sql[] = "" . |
|
126 |
"UPDATE `".$this->table."` " . |
|
127 |
"SET `".$this->fields["position"]."` = `".$this->fields["position"]."` - 1 " . |
|
128 |
"WHERE " . |
|
129 |
"`".$this->fields["parent_id"]."` = ".$node[$this->fields["parent_id"]]." AND " . |
|
130 |
"`".$this->fields["position"]."` > ".$node[$this->fields["position"]]; |
|
131 |
$sql[] = "" . |
|
132 |
"UPDATE `".$this->table."` " . |
|
133 |
"SET `".$this->fields["left"]."` = `".$this->fields["left"]."` - ".$ndif." " . |
|
134 |
"WHERE `".$this->fields["left"]."` > ".$node[$this->fields["right"]]; |
|
135 |
$sql[] = "" . |
|
136 |
"UPDATE `".$this->table."` " . |
|
137 |
"SET `".$this->fields["right"]."` = `".$this->fields["right"]."` - ".$ndif." " . |
|
138 |
"WHERE " . |
|
139 |
"`".$this->fields["right"]."` > ".$node[$this->fields["left"]]." AND " . |
|
140 |
"`".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "; |
|
141 |
} |
|
142 |
// Preparing new parent |
|
143 |
$sql[] = "" . |
|
144 |
"UPDATE `".$this->table."` " . |
|
145 |
"SET `".$this->fields["position"]."` = `".$this->fields["position"]."` + 1 " . |
|
146 |
"WHERE " . |
|
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).") "); |
|
150 |
|
|
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); |
|
153 |
|
|
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"]]; |
|
158 |
break; |
|
159 |
} |
|
160 |
} |
|
161 |
if($node !== false && !$is_copy && $node[$this->fields["left"]] < $ref_ind) { |
|
162 |
$ref_ind -= $ndif; |
|
163 |
} |
|
164 |
|
|
165 |
$sql[] = "" . |
|
166 |
"UPDATE `".$this->table."` " . |
|
167 |
"SET `".$this->fields["left"]."` = `".$this->fields["left"]."` + ".$ndif." " . |
|
168 |
"WHERE " . |
|
169 |
"`".$this->fields["left"]."` >= ".$ref_ind." " . |
|
170 |
( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "); |
|
171 |
$sql[] = "" . |
|
172 |
"UPDATE `".$this->table."` " . |
|
173 |
"SET `".$this->fields["right"]."` = `".$this->fields["right"]."` + ".$ndif." " . |
|
174 |
"WHERE " . |
|
175 |
"`".$this->fields["right"]."` >= ".$ref_ind." " . |
|
176 |
( $is_copy ? "" : " AND `".$this->fields["id"]."` NOT IN (".implode(",", $node_ids).") "); |
|
177 |
|
|
178 |
$ldif = $ref_id == 0 ? 0 : $ref_node[$this->fields["level"]] + 1; |
|
179 |
$idif = $ref_ind; |
|
180 |
if($node !== false) { |
|
181 |
$ldif = $node[$this->fields["level"]] - ($ref_node[$this->fields["level"]] + 1); |
|
182 |
$idif = $node[$this->fields["left"]] - $ref_ind; |
|
183 |
if($is_copy) { |
|
184 |
$sql[] = "" . |
|
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"]."`" . |
|
191 |
") " . |
|
192 |
"SELECT " . |
|
193 |
"".$ref_id.", " . |
|
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."` " . |
|
199 |
"WHERE " . |
|
200 |
"`".$this->fields["id"]."` IN (".implode(",", $node_ids).") " . |
|
201 |
"ORDER BY `".$this->fields["level"]."` ASC"; |
|
202 |
} |
|
203 |
else { |
|
204 |
$sql[] = "" . |
|
205 |
"UPDATE `".$this->table."` SET " . |
|
206 |
"`".$this->fields["parent_id"]."` = ".$ref_id.", " . |
|
207 |
"`".$this->fields["position"]."` = ".$position." " . |
|
208 |
"WHERE " . |
|
209 |
"`".$this->fields["id"]."` = ".$id; |
|
210 |
$sql[] = "" . |
|
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.") " . |
|
215 |
"WHERE " . |
|
216 |
"`".$this->fields["id"]."` IN (".implode(",", $node_ids).") "; |
|
217 |
} |
|
218 |
} |
|
219 |
else { |
|
220 |
$sql[] = "" . |
|
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"]."` " . |
|
227 |
") " . |
|
228 |
"VALUES (" . |
|
229 |
$ref_id.", " . |
|
230 |
$position.", " . |
|
231 |
$idif.", " . |
|
232 |
($idif + 1).", " . |
|
233 |
$ldif. |
|
234 |
")"; |
|
235 |
} |
|
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; |
|
240 |
} |
|
241 |
function _fix_copy($id, $position) { |
|
242 |
$node = $this->_get_node($id); |
|
243 |
$children = $this->_get_children($id, true); |
|
244 |
|
|
245 |
$map = array(); |
|
246 |
for($i = $node[$this->fields["left"]] + 1; $i < $node[$this->fields["right"]]; $i++) { |
|
247 |
$map[$i] = $id; |
|
248 |
} |
|
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); |
|
252 |
continue; |
|
253 |
} |
|
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++) { |
|
256 |
$map[$i] = $cid; |
|
257 |
} |
|
258 |
} |
|
259 |
} |
|
260 |
|
|
261 |
function _reconstruct() { |
|
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" . |
|
267 |
") type=HEAP" |
|
268 |
); |
|
269 |
$this->db->query("" . |
|
270 |
"INSERT INTO `temp_tree` " . |
|
271 |
"SELECT " . |
|
272 |
"`".$this->fields["id"]."`, " . |
|
273 |
"`".$this->fields["parent_id"]."`, " . |
|
274 |
"`".$this->fields["position"]."` " . |
|
275 |
"FROM `".$this->table."`" |
|
276 |
); |
|
277 |
|
|
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 " . |
|
287 |
") type=HEAP" |
|
288 |
); |
|
289 |
$counter = 2; |
|
290 |
$this->db->query("SELECT COUNT(*) FROM temp_tree"); |
|
291 |
$this->db->nextr(); |
|
292 |
$maxcounter = (int) $this->db->f(0) * 2; |
|
293 |
$currenttop = 1; |
|
294 |
$this->db->query("" . |
|
295 |
"INSERT INTO `temp_stack` " . |
|
296 |
"SELECT " . |
|
297 |
"`".$this->fields["id"]."`, " . |
|
298 |
"1, " . |
|
299 |
"NULL, " . |
|
300 |
"0, " . |
|
301 |
"1, " . |
|
302 |
"`".$this->fields["parent_id"]."`, " . |
|
303 |
"`".$this->fields["position"]."` " . |
|
304 |
"FROM `temp_tree` " . |
|
305 |
"WHERE `".$this->fields["parent_id"]."` = 0" |
|
306 |
); |
|
307 |
$this->db->query("DELETE FROM `temp_tree` WHERE `".$this->fields["parent_id"]."` = 0"); |
|
308 |
|
|
309 |
while ($counter <= $maxcounter) { |
|
310 |
$this->db->query("" . |
|
311 |
"SELECT " . |
|
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` " . |
|
316 |
"WHERE " . |
|
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" |
|
320 |
); |
|
321 |
|
|
322 |
if ($this->db->nextr()) { |
|
323 |
$tmp = $this->db->f("tempmin"); |
|
324 |
|
|
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); |
|
328 |
$counter++; |
|
329 |
$currenttop++; |
|
330 |
} |
|
331 |
else { |
|
332 |
$this->db->query("" . |
|
333 |
"UPDATE temp_stack SET " . |
|
334 |
"`".$this->fields["right"]."` = ".$counter.", " . |
|
335 |
"`stack_top` = -`stack_top` " . |
|
336 |
"WHERE `stack_top` = ".$currenttop |
|
337 |
); |
|
338 |
$counter++; |
|
339 |
$currenttop--; |
|
340 |
} |
|
341 |
} |
|
342 |
|
|
343 |
$temp_fields = $this->fields; |
|
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."` " |
|
353 |
); |
|
354 |
} |
|
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"]."` " . |
|
364 |
") " . |
|
365 |
"SELECT " . |
|
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"]."` " . |
|
372 |
"FROM temp_stack " . |
|
373 |
"ORDER BY `".$this->fields["id"]."`" |
|
374 |
); |
|
375 |
if(count($temp_fields) > 1) { |
|
376 |
$sql = "" . |
|
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."` "; |
|
381 |
} |
|
382 |
$sql .= " WHERE v.`".$this->fields["id"]."` = `temp_tree2`.`".$this->fields["id"]."` "; |
|
383 |
$this->db->query($sql); |
|
384 |
} |
|
385 |
} |
|
386 |
|
|
387 |
function _analyze() { |
|
388 |
$report = array(); |
|
389 |
|
|
390 |
$this->db->query("" . |
|
391 |
"SELECT " . |
|
392 |
"`".$this->fields["left"]."` FROM `".$this->table."` s " . |
|
393 |
"WHERE " . |
|
394 |
"`".$this->fields["parent_id"]."` = 0 " |
|
395 |
); |
|
396 |
$this->db->nextr(); |
|
397 |
if($this->db->nf() == 0) { |
|
398 |
$report[] = "[FAIL]\tNo root node."; |
|
399 |
} |
|
400 |
else { |
|
401 |
$report[] = ($this->db->nf() > 1) ? "[FAIL]\tMore than one root node." : "[OK]\tJust one root node."; |
|
402 |
} |
|
403 |
$report[] = ($this->db->f(0) != 1) ? "[FAIL]\tRoot node's left index is not 1." : "[OK]\tRoot node's left index is 1."; |
|
404 |
|
|
405 |
$this->db->query("" . |
|
406 |
"SELECT " . |
|
407 |
"COUNT(*) FROM `".$this->table."` s " . |
|
408 |
"WHERE " . |
|
409 |
"`".$this->fields["parent_id"]."` != 0 AND " . |
|
410 |
"(SELECT COUNT(*) FROM `".$this->table."` WHERE `".$this->fields["id"]."` = s.`".$this->fields["parent_id"]."`) = 0 "); |
|
411 |
$this->db->nextr(); |
|
412 |
$report[] = ($this->db->f(0) > 0) ? "[FAIL]\tMissing parents." : "[OK]\tNo missing parents."; |
|
413 |
|
|
414 |
$this->db->query("SELECT MAX(`".$this->fields["right"]."`) FROM `".$this->table."`"); |
|
415 |
$this->db->nextr(); |
|
416 |
$n = $this->db->f(0); |
|
417 |
$this->db->query("SELECT COUNT(*) FROM `".$this->table."`"); |
|
418 |
$this->db->nextr(); |
|
419 |
$c = $this->db->f(0); |
|
420 |
$report[] = ($n/2 != $c) ? "[FAIL]\tRight index does not match node count." : "[OK]\tRight index matches count."; |
|
421 |
|
|
422 |
$this->db->query("" . |
|
423 |
"SELECT COUNT(`".$this->fields["id"]."`) FROM `".$this->table."` s " . |
|
424 |
"WHERE " . |
|
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" . |
|
429 |
") != " . |
|
430 |
"(SELECT COUNT(*) FROM `".$this->table."` WHERE " . |
|
431 |
"`".$this->fields["parent_id"]."` = s.`".$this->fields["id"]."`" . |
|
432 |
") " |
|
433 |
); |
|
434 |
$this->db->nextr(); |
|
435 |
$report[] = ($this->db->f(0) > 0) ? "[FAIL]\tAdjacency and nested set do not match." : "[OK]\tNS and AJ match"; |
|
436 |
|
|
437 |
return implode("<br />",$report); |
|
438 |
} |
|
439 |
|
|
440 |
function _dump($output = false) { |
|
441 |
$nodes = array(); |
|
442 |
$this->db->query("SELECT * FROM ".$this->table." ORDER BY `".$this->fields["left"]."`"); |
|
443 |
while($this->db->nextr()) $nodes[] = $this->db->get_row("assoc"); |
|
444 |
if($output) { |
|
445 |
echo "<pre>"; |
|
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 />"; |
|
449 |
} |
|
450 |
echo str_repeat("-",40); |
|
451 |
echo "</pre>"; |
|
452 |
} |
|
453 |
return $nodes; |
|
454 |
} |
|
455 |
function _drop() { |
|
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"]."` " . |
|
465 |
") " . |
|
466 |
"VALUES (" . |
|
467 |
"1, " . |
|
468 |
"0, " . |
|
469 |
"0, " . |
|
470 |
"1, " . |
|
471 |
"2, " . |
|
472 |
"0 ". |
|
473 |
")"); |
|
474 |
} |
|
475 |
} |
|
476 |
|
|
477 |
class json_tree extends _tree_struct { |
|
478 |
function __construct($table = "tree", $fields = array(), $add_fields = array("title" => "title", "type" => "type")) { |
|
479 |
parent::__construct($table, $fields); |
|
480 |
$this->fields = array_merge($this->fields, $add_fields); |
|
481 |
$this->add_fields = $add_fields; |
|
482 |
} |
|
483 |
|
|
484 |
function create_node($data) { |
|
485 |
$id = parent::_create((int)$data[$this->fields["id"]], (int)$data[$this->fields["position"]]); |
|
486 |
if($id) { |
|
487 |
$data["id"] = $id; |
|
488 |
$this->set_data($data); |
|
489 |
return "{ \"status\" : 1, \"id\" : ".(int)$id." }"; |
|
490 |
} |
|
491 |
return "{ \"status\" : 0 }"; |
|
492 |
} |
|
493 |
function set_data($data) { |
|
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]."` "; |
|
499 |
} |
|
500 |
$s .= "WHERE `".$this->fields["id"]."` = ".(int)$data["id"]; |
|
501 |
$this->db->query($s); |
|
502 |
return "{ \"status\" : 1 }"; |
|
503 |
} |
|
504 |
function rename_node($data) { return $this->set_data($data); } |
|
505 |
|
|
506 |
function move_node($data) { |
|
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)) { |
|
510 |
$ids = array_keys($this->_get_children($id, true)); |
|
511 |
$data = $this->_get_children((int)$data["id"], true); |
|
512 |
|
|
513 |
$i = 0; |
|
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]."` "; |
|
519 |
} |
|
520 |
$s .= "WHERE `".$this->fields["id"]."` = ".$ids[$i]; |
|
521 |
$this->db->query($s); |
|
522 |
$i++; |
|
523 |
} |
|
524 |
} |
|
525 |
return "{ \"status\" : 1, \"id\" : ".$id." }"; |
|
526 |
} |
|
527 |
function remove_node($data) { |
|
528 |
$id = parent::_remove((int)$data["id"]); |
|
529 |
return "{ \"status\" : 1 }"; |
|
530 |
} |
|
531 |
function get_children($data) { |
|
532 |
$tmp = $this->_get_children((int)$data["id"]); |
|
533 |
if((int)$data["id"] === 1 && count($tmp) === 0) { |
|
534 |
$this->_create_default(); |
|
535 |
$tmp = $this->_get_children((int)$data["id"]); |
|
536 |
} |
|
537 |
$result = array(); |
|
538 |
if((int)$data["id"] === 0) return json_encode($result); |
|
539 |
foreach($tmp as $k => $v) { |
|
540 |
$result[] = array( |
|
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" : "" |
|
544 |
); |
|
545 |
} |
|
546 |
return json_encode($result); |
|
547 |
} |
|
548 |
function search($data) { |
|
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).") "; |
|
554 |
} |
|
555 |
$result = array(); |
|
556 |
$this->db->query($q); |
|
557 |
while($this->db->nextr()) { $result[] = "#node_".$this->db->f(0); } |
|
558 |
return json_encode($result); |
|
559 |
} |
|
560 |
|
|
561 |
function _create_default() { |
|
562 |
$this->_drop(); |
|
563 |
$this->create_node(array( |
|
564 |
"id" => 1, |
|
565 |
"position" => 0, |
|
566 |
"title" => "C:", |
|
567 |
"type" => "drive" |
|
568 |
)); |
|
569 |
$this->create_node(array( |
|
570 |
"id" => 1, |
|
571 |
"position" => 1, |
|
572 |
"title" => "D:", |
|
573 |
"type" => "drive" |
|
574 |
)); |
|
575 |
$this->create_node(array( |
|
576 |
"id" => 2, |
|
577 |
"position" => 0, |
|
578 |
"title" => "_demo", |
|
579 |
"type" => "folder" |
|
580 |
)); |
|
581 |
$this->create_node(array( |
|
582 |
"id" => 2, |
|
583 |
"position" => 1, |
|
584 |
"title" => "_docs", |
|
585 |
"type" => "folder" |
|
586 |
)); |
|
587 |
$this->create_node(array( |
|
588 |
"id" => 4, |
|
589 |
"position" => 0, |
|
590 |
"title" => "index.html", |
|
591 |
"type" => "default" |
|
592 |
)); |
|
593 |
$this->create_node(array( |
|
594 |
"id" => 5, |
|
595 |
"position" => 1, |
|
596 |
"title" => "doc.html", |
|
597 |
"type" => "default" |
|
598 |
)); |
|
599 |
} |
|
600 |
} |
|
601 |
|
|
602 |
?> |
|
0 | 603 |
lib/style/skins/semtools/jsTree/_demo/_inc/class._database.php | ||
---|---|---|
1 |
<?php |
|
2 |
class _database { |
|
3 |
private $link = false; |
|
4 |
private $result = false; |
|
5 |
private $row = false; |
|
6 |
|
|
7 |
public $settings = array( |
|
8 |
"servername"=> "localhost", |
|
9 |
"serverport"=> "3306", |
|
10 |
"username" => false, |
|
11 |
"password" => false, |
|
12 |
"database" => false, |
|
13 |
"persist" => false, |
|
14 |
"dieonerror"=> false, |
|
15 |
"showerror" => false, |
|
16 |
"error_file"=> true |
|
17 |
); |
|
18 |
|
|
19 |
function __construct() { |
|
20 |
global $db_config; |
|
21 |
$this->settings = array_merge($this->settings, $db_config); |
|
22 |
if($this->settings["error_file"] === true) $this->settings["error_file"] = dirname(__FILE__)."/__mysql_errors.log"; |
|
23 |
} |
|
24 |
|
|
25 |
function connect() { |
|
26 |
if (!$this->link) { |
|
27 |
$this->link = ($this->settings["persist"]) ? |
|
28 |
mysql_pconnect( |
|
29 |
$this->settings["servername"].":".$this->settings["serverport"], |
|
30 |
$this->settings["username"], |
|
31 |
$this->settings["password"] |
|
32 |
) : |
|
33 |
mysql_connect( |
|
34 |
$this->settings["servername"].":".$this->settings["serverport"], |
|
35 |
$this->settings["username"], |
|
36 |
$this->settings["password"] |
|
37 |
) or $this->error(); |
|
38 |
} |
|
39 |
if (!mysql_select_db($this->settings["database"], $this->link)) $this->error(); |
|
40 |
if($this->link) mysql_query("SET NAMES 'utf8'"); |
|
41 |
return ($this->link) ? true : false; |
|
42 |
} |
|
43 |
|
|
44 |
function query($sql) { |
|
45 |
if (!$this->link && !$this->connect()) $this->error(); |
|
46 |
if (!($this->result = mysql_query($sql, $this->link))) $this->error($sql); |
|
47 |
return ($this->result) ? true : false; |
|
48 |
} |
|
49 |
|
|
50 |
function nextr() { |
|
51 |
if(!$this->result) { |
|
52 |
$this->error("No query pending"); |
|
53 |
return false; |
|
54 |
} |
|
55 |
unset($this->row); |
|
56 |
$this->row = mysql_fetch_array($this->result, MYSQL_BOTH); |
|
57 |
return ($this->row) ? true : false ; |
|
58 |
} |
|
59 |
|
|
60 |
function get_row($mode = "both") { |
|
61 |
if(!$this->row) return false; |
|
62 |
|
|
63 |
$return = array(); |
|
64 |
switch($mode) { |
|
65 |
case "assoc": |
|
66 |
foreach($this->row as $k => $v) { |
|
67 |
if(!is_int($k)) $return[$k] = $v; |
|
68 |
} |
|
69 |
break; |
|
70 |
case "num": |
|
71 |
foreach($this->row as $k => $v) { |
|
72 |
if(is_int($k)) $return[$k] = $v; |
|
73 |
} |
|
74 |
break; |
|
75 |
default: |
|
76 |
$return = $this->row; |
|
77 |
break; |
|
78 |
} |
|
79 |
return array_map("stripslashes",$return); |
|
80 |
} |
|
81 |
|
|
82 |
function get_all($mode = "both", $key = false) { |
|
83 |
if(!$this->result) { |
|
84 |
$this->error("No query pending"); |
|
85 |
return false; |
|
86 |
} |
|
87 |
$return = array(); |
|
88 |
while($this->nextr()) { |
|
89 |
if($key !== false) $return[$this->f($key)] = $this->get_row($mode); |
|
90 |
else $return[] = $this->get_row($mode); |
|
91 |
} |
|
92 |
return $return; |
|
93 |
} |
|
94 |
|
|
95 |
function f($index) { |
|
96 |
return stripslashes($this->row[$index]); |
|
97 |
} |
|
98 |
|
|
99 |
function go_to($row) { |
|
100 |
if(!$this->result) { |
|
101 |
$this->error("No query pending"); |
|
102 |
return false; |
|
103 |
} |
|
104 |
if(!mysql_data_seek($this->result, $row)) $this->error(); |
|
105 |
} |
|
106 |
|
|
107 |
function nf() { |
|
108 |
if ($numb = mysql_num_rows($this->result) === false) $this->error(); |
|
109 |
return mysql_num_rows($this->result); |
|
110 |
} |
|
111 |
function af() { |
|
112 |
return mysql_affected_rows(); |
|
113 |
} |
|
114 |
function error($string="") { |
|
115 |
$error = mysql_error(); |
|
116 |
if($this->settings["show_error"]) echo $error; |
|
117 |
if($this->settings["error_file"] !== false) { |
|
118 |
$handle = @fopen($this->settings["error_file"], "a+"); |
|
119 |
if($handle) { |
|
120 |
@fwrite($handle, "[".date("Y-m-d H:i:s")."] ".$string." <".$error.">\n"); |
|
121 |
@fclose($handle); |
|
122 |
} |
|
123 |
} |
|
124 |
if($this->settings["dieonerror"]) { |
|
125 |
if(isset($this->result)) mysql_free_result($this->result); |
|
126 |
mysql_close($this->link); |
|
127 |
die(); |
|
128 |
} |
|
129 |
} |
|
130 |
function insert_id() { |
|
131 |
if(!$this->link) return false; |
|
132 |
return mysql_insert_id(); |
|
133 |
} |
|
134 |
function escape($string){ |
|
135 |
if(!$this->link) return addslashes($string); |
|
136 |
return mysql_real_escape_string($string); |
|
137 |
} |
|
138 |
|
|
139 |
function destroy(){ |
|
140 |
if (isset($this->result)) mysql_free_result($this->result); |
|
141 |
if (isset($this->link)) mysql_close($this->link); |
|
142 |
} |
|
143 |
|
|
144 |
|
|
145 |
} |
|
146 |
?> |
|
0 | 147 |
lib/style/skins/semtools/jsTree/_demo/index.html | ||
---|---|---|
1 |
<!DOCTYPE html |
|
2 |
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
|
3 |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
|
4 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
|
5 |
<head> |
|
6 |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
|
7 |
<title>jsTree v.1.0 - full featured demo</title> |
|
8 |
<script type="text/javascript" src="../_lib/jquery.js"></script> |
|
9 |
<script type="text/javascript" src="../_lib/jquery.cookie.js"></script> |
|
10 |
<script type="text/javascript" src="../_lib/jquery.hotkeys.js"></script> |
|
11 |
<script type="text/javascript" src="../jquery.jstree.js"></script> |
|
12 |
|
|
13 |
<style type="text/css"> |
|
14 |
html, body { margin:0; padding:0; } |
|
15 |
body, td, th, pre, code, select, option, input, textarea { font-family:verdana,arial,sans-serif; font-size:10px; } |
|
16 |
.demo, .demo input, .jstree-dnd-helper, #vakata-contextmenu { font-size:10px; font-family:Verdana; } |
|
17 |
#container { width:780px; margin:10px auto; overflow:hidden; position:relative; } |
|
18 |
#demo { width:auto; height:400px; overflow:auto; border:1px solid gray; } |
|
19 |
|
|
20 |
#text { margin-top:1px; } |
|
21 |
|
|
22 |
#alog { font-size:9px !important; margin:5px; border:1px solid silver; } |
|
23 |
</style> |
|
24 |
</head> |
|
25 |
<body> |
|
26 |
<div id="container"> |
|
27 |
|
|
28 |
<div id="mmenu" style="height:30px; overflow:auto;"> |
|
29 |
<input type="button" id="add_folder" value="add folder" style="display:block; float:left;"/> |
|
30 |
<input type="button" id="add_default" value="add file" style="display:block; float:left;"/> |
|
31 |
<input type="button" id="rename" value="rename" style="display:block; float:left;"/> |
|
32 |
<input type="button" id="remove" value="remove" style="display:block; float:left;"/> |
|
33 |
<input type="button" id="cut" value="cut" style="display:block; float:left;"/> |
|
34 |
<input type="button" id="copy" value="copy" style="display:block; float:left;"/> |
|
35 |
<input type="button" id="paste" value="paste" style="display:block; float:left;"/> |
|
36 |
<input type="button" id="clear_search" value="clear" style="display:block; float:right;"/> |
|
37 |
<input type="button" id="search" value="search" style="display:block; float:right;"/> |
|
38 |
<input type="text" id="text" value="" style="display:block; float:right;" /> |
|
39 |
</div> |
|
40 |
|
Also available in: Unified diff
include jsTree for navigating the ontology hierarchy when making class selections for the search