1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
<?php // $Id: tree.php,v 1.12.22.1 2005/04/12 10:28:33 mithyt2 Exp $ // ------------------------------------------------------------------------ // // XOOPS - PHP Content Management System // // Copyright (c) 2000 XOOPS.org // // <http://www.xoops.org/> // // ------------------------------------------------------------------------ // // This program is free software; you can redistribute it and/or modify // // it under the terms of the GNU General Public License as published by // // the Free Software Foundation; either version 2 of the License, or // // (at your option) any later version. // // // // You may not change or alter any portion of this comment or credits // // of supporting developers from this source code or any supporting // // source code which is considered copyrighted (c) material of the // // original comment or credit authors. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU General Public License for more details. // // // // You should have received a copy of the GNU General Public License // // along with this program; if not, write to the Free Software // // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // ------------------------------------------------------------------------ // // Author: Kazumi Ono (AKA onokazu) // // URL: http://www.xoops.org/ http://jp.xoops.org/ http://www.myweb.ne.jp/ // // Project: The XOOPS Project (http://www.xoops.org/) // // ------------------------------------------------------------------------- //
/** * A tree structures with {@link XoopsObject}s as nodes * * @package kernel * @subpackage core * * @author Kazumi Ono <onokazu@xoops.org> * @copyright (c) 2000-2003 The Xoops Project - www.xoops.org */ class XoopsObjectTree {
/**#@+ * @access private */ var $_parentId; var $_myId; var $_rootId = null; var $_tree = array(); var $_objects; /**#@-*/
/** * Constructor * * @param array $objectArr Array of {@link XoopsObject}s * @param string $myId field name of object ID * @param string $parentId field name of parent object ID * @param string $rootId field name of root object ID **/ function XoopsObjectTree(&$objectArr, $myId, $parentId, $rootId = null) { $this->_objects =& $objectArr; $this->_myId = $myId; $this->_parentId = $parentId; if (isset($rootId)) { $this->_rootId = $rootId; } $this->_initialize(); }
/** * Initialize the object * * @access private **/ function _initialize() { foreach (array_keys($this->_objects) as $i) { $key1 = $this->_objects[$i]->getVar($this->_myId); $this->_tree[$key1]['obj'] =& $this->_objects[$i]; $key2 = $this->_objects[$i]->getVar($this->_parentId); $this->_tree[$key1]['parent'] = $key2; $this->_tree[$key2]['child'][] = $key1; if (isset($this->_rootId)) { $this->_tree[$key1]['root'] = $this->_objects[$i]->getVar($this->_rootId); } } }
/** * Get the tree * * @return array Associative array comprising the tree **/ function &getTree() { return $this->_tree; }
/** * returns an object from the tree specified by its id * * @param string $key ID of the object to retrieve * @return object Object within the tree **/ function &getByKey($key) { return $this->_tree[$key]['obj']; }
/** * returns an array of all the first child object of an object specified by its id * * @param string $key ID of the parent object * @return array Array of children of the parent **/ function &getFirstChild($key) { $ret = array(); if (isset($this->_tree[$key]['child'])) { foreach ($this->_tree[$key]['child'] as $childkey) { $ret[$childkey] =& $this->_tree[$childkey]['obj']; } } return $ret; }
/** * returns an array of all child objects of an object specified by its id * * @param string $key ID of the parent * @param array $ret (Empty when called from client) Array of children from previous recursions. * @return array Array of child nodes. **/ function &getAllChild($key, $ret = array()) { if (isset($this->_tree[$key]['child'])) { foreach ($this->_tree[$key]['child'] as $childkey) { $ret[$childkey] =& $this->_tree[$childkey]['obj']; $children =& $this->getAllChild($childkey, $ret); foreach (array_keys($children) as $newkey) { $ret[$newkey] =& $children[$newkey]; } } } return $ret; }
/** * returns an array of all parent objects. * the key of returned array represents how many levels up from the specified object * * @param string $key ID of the child object * @param array $ret (empty when called from outside) Result from previous recursions * @param int $uplevel (empty when called from outside) level of recursion * @return array Array of parent nodes. **/ function &getAllParent($key, $ret = array(), $uplevel = 1) { if (isset($this->_tree[$key]['parent']) && isset($this->_tree[$this->_tree[$key]['parent']]['obj'])) { $ret[$uplevel] =& $this->_tree[$this->_tree[$key]['parent']]['obj']; $parents =& $this->getAllParent($this->_tree[$key]['parent'], $ret, $uplevel+1); foreach (array_keys($parents) as $newkey) { $ret[$newkey] =& $parents[$newkey]; } } return $ret; }
/** * Make options for a select box from * * @param string $fieldName Name of the member variable from the * node objects that should be used as the title for the options. * @param string $selected Value to display as selected * @param int $key ID of the object to display as the root of select options * @param string $ret (reference to a string when called from outside) Result from previous recursions * @param string $prefix_orig String to indent items at deeper levels * @param string $prefix_curr String to indent the current item * @return * * @access private **/ function _makeSelBoxOptions($fieldName, $selected, $key, &$ret, $prefix_orig, $prefix_curr = '') { if ($key > 0) { $value = $this->_tree[$key]['obj']->getVar($this->_myId); $ret .= '<option value="'.$value.'"'; if ($value == $selected) { $ret .= ' selected="selected"'; } $ret .= '>'.$prefix_curr.$this->_tree[$key]['obj']->getVar($fieldName).'</option>'; $prefix_curr .= $prefix_orig; } if (isset($this->_tree[$key]['child']) && !empty($this->_tree[$key]['child'])) { foreach ($this->_tree[$key]['child'] as $childkey) { $this->_makeSelBoxOptions($fieldName, $selected, $childkey, $ret, $prefix_orig, $prefix_curr); } } }
/** * Make a select box with options from the tree * * @param string $name Name of the select box * @param string $fieldName Name of the member variable from the * node objects that should be used as the title for the options. * @param string $prefix String to indent deeper levels * @param string $selected Value to display as selected * @param bool $addEmptyOption Set TRUE to add an empty option with value "0" at the top of the hierarchy * @param integer $key ID of the object to display as the root of select options * @return string HTML select box **/ function &makeSelBox($name, $fieldName, $prefix='-', $selected='', $addEmptyOption = false, $key=0) { $ret = '<select name="'.$name.'" id="'.$name.'">'; if (false != $addEmptyOption) { $ret .= '<option value="0"></option>'; } $this->_makeSelBoxOptions($fieldName, $selected, $key, $ret, $prefix); return $ret.'</select>'; }
} ?>
|