1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: |
|
18: |
|
19: | defined('XOOPS_ROOT_PATH') || exit('Restricted access');
|
20: |
|
21: | |
22: | |
23: | |
24: | |
25: | |
26: | |
27: |
|
28: | class XoopsObjectTree
|
29: | {
|
30: | |
31: | |
32: |
|
33: | protected $parentId;
|
34: | protected $myId;
|
35: | protected $rootId;
|
36: | protected $tree = array();
|
37: | protected $objects;
|
38: |
|
39: | |
40: | |
41: | |
42: | |
43: | |
44: | |
45: | |
46: |
|
47: | public function __construct(&$objectArr, $myId, $parentId, $rootId = null)
|
48: | {
|
49: | $this->objects = $objectArr;
|
50: | $this->myId = $myId;
|
51: | $this->parentId = $parentId;
|
52: | if (isset($rootId)) {
|
53: | $this->rootId = $rootId;
|
54: | }
|
55: | $this->initialize();
|
56: | }
|
57: |
|
58: | |
59: | |
60: | |
61: | |
62: |
|
63: | protected function initialize()
|
64: | {
|
65: | foreach (array_keys($this->objects) as $i) {
|
66: | $key1 = $this->objects[$i]->getVar($this->myId);
|
67: | $this->tree[$key1]['obj'] = $this->objects[$i];
|
68: | $key2 = $this->objects[$i]->getVar($this->parentId);
|
69: | $this->tree[$key1]['parent'] = $key2;
|
70: | $this->tree[$key2]['child'][] = $key1;
|
71: | if (isset($this->rootId)) {
|
72: | $this->tree[$key1]['root'] = $this->objects[$i]->getVar($this->rootId);
|
73: | }
|
74: | }
|
75: | }
|
76: |
|
77: | |
78: | |
79: | |
80: | |
81: |
|
82: | public function &getTree()
|
83: | {
|
84: | return $this->tree;
|
85: | }
|
86: |
|
87: | |
88: | |
89: | |
90: | |
91: | |
92: |
|
93: | public function &getByKey($key)
|
94: | {
|
95: | return $this->tree[$key]['obj'];
|
96: | }
|
97: |
|
98: | |
99: | |
100: | |
101: | |
102: | |
103: |
|
104: | public function getFirstChild($key)
|
105: | {
|
106: | $ret = array();
|
107: | if (isset($this->tree[$key]['child'])) {
|
108: | foreach ($this->tree[$key]['child'] as $childKey) {
|
109: | $ret[$childKey] = $this->tree[$childKey]['obj'];
|
110: | }
|
111: | }
|
112: |
|
113: | return $ret;
|
114: | }
|
115: |
|
116: | |
117: | |
118: | |
119: | |
120: | |
121: | |
122: |
|
123: | public function getAllChild($key, $ret = array())
|
124: | {
|
125: | if (isset($this->tree[$key]['child'])) {
|
126: | foreach ($this->tree[$key]['child'] as $childKey) {
|
127: | $ret[$childKey] = $this->tree[$childKey]['obj'];
|
128: | $children = $this->getAllChild($childKey, $ret);
|
129: | foreach (array_keys($children) as $newKey) {
|
130: | $ret[$newKey] = $children[$newKey];
|
131: | }
|
132: | }
|
133: | }
|
134: |
|
135: | return $ret;
|
136: | }
|
137: |
|
138: | |
139: | |
140: | |
141: | |
142: | |
143: | |
144: | |
145: | |
146: |
|
147: | public function getAllParent($key, $ret = array(), $upLevel = 1)
|
148: | {
|
149: | if (isset($this->tree[$key]['parent']) && isset($this->tree[$this->tree[$key]['parent']]['obj'])) {
|
150: | $ret[$upLevel] = $this->tree[$this->tree[$key]['parent']]['obj'];
|
151: | $parents = $this->getAllParent($this->tree[$key]['parent'], $ret, $upLevel + 1);
|
152: | foreach (array_keys($parents) as $newKey) {
|
153: | $ret[$newKey] = $parents[$newKey];
|
154: | }
|
155: | }
|
156: |
|
157: | return $ret;
|
158: | }
|
159: |
|
160: | |
161: | |
162: | |
163: | |
164: | |
165: | |
166: | |
167: | |
168: | |
169: | |
170: | |
171: | |
172: | |
173: |
|
174: | protected function makeSelBoxOptions($fieldName, $selected, $key, &$ret, $prefix_orig, $prefix_curr = '')
|
175: | {
|
176: | if ($key > 0) {
|
177: | $value = $this->tree[$key]['obj']->getVar($this->myId);
|
178: | $ret .= '<option value="' . $value . '"';
|
179: | if ($value == $selected) {
|
180: | $ret .= ' selected';
|
181: | }
|
182: | $ret .= '>' . $prefix_curr . $this->tree[$key]['obj']->getVar($fieldName) . '</option>';
|
183: | $prefix_curr .= $prefix_orig;
|
184: | }
|
185: | if (isset($this->tree[$key]['child']) && !empty($this->tree[$key]['child'])) {
|
186: | foreach ($this->tree[$key]['child'] as $childKey) {
|
187: | $this->makeSelBoxOptions($fieldName, $selected, $childKey, $ret, $prefix_orig, $prefix_curr);
|
188: | }
|
189: | }
|
190: | }
|
191: |
|
192: | |
193: | |
194: | |
195: | |
196: | |
197: | |
198: | |
199: | |
200: | |
201: | |
202: | |
203: | |
204: | |
205: | |
206: |
|
207: | public function makeSelBox(
|
208: | $name,
|
209: | $fieldName,
|
210: | $prefix = '-',
|
211: | $selected = '',
|
212: | $addEmptyOption = false,
|
213: | $key = 0,
|
214: | $extra = ''
|
215: | ) {
|
216: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
217: | $GLOBALS['xoopsLogger']->addDeprecated(__METHOD__ . " is deprecated since 2.5.9, please use makeSelectElement(), called from {$trace[0]['file']} line {$trace[0]['line']}");
|
218: |
|
219: | $ret = '<select name="' . $name . '" id="' . $name . '" ' . $extra . '>';
|
220: | if (false !== (bool)$addEmptyOption) {
|
221: | $ret .= '<option value="0"></option>';
|
222: | }
|
223: | $this->makeSelBoxOptions($fieldName, $selected, $key, $ret, $prefix);
|
224: |
|
225: | return $ret . '</select>';
|
226: | }
|
227: |
|
228: | |
229: | |
230: | |
231: | |
232: | |
233: | |
234: | |
235: | |
236: | |
237: | |
238: | |
239: | |
240: | |
241: | |
242: |
|
243: | public function makeSelectElement(
|
244: | $name,
|
245: | $fieldName,
|
246: | $prefix = '-',
|
247: | $selected = '',
|
248: | $addEmptyOption = false,
|
249: | $key = 0,
|
250: | $extra = '',
|
251: | $caption = ''
|
252: | ) {
|
253: | xoops_load('xoopsformselect');
|
254: | $element = new XoopsFormSelect($caption, $name, $selected);
|
255: | $element->setExtra($extra);
|
256: |
|
257: | if (false !== (bool)$addEmptyOption) {
|
258: | $element->addOption('0', ' ');
|
259: | }
|
260: | $this->addSelectOptions($element, $fieldName, $key, $prefix);
|
261: |
|
262: | return $element;
|
263: | }
|
264: |
|
265: | |
266: | |
267: | |
268: | |
269: | |
270: | |
271: | |
272: | |
273: | |
274: | |
275: | |
276: | |
277: |
|
278: | protected function addSelectOptions($element, $fieldName, $key, $prefix_orig, $prefix_curr = '')
|
279: | {
|
280: | if ($key > 0) {
|
281: | $value = $this->tree[$key]['obj']->getVar($this->myId);
|
282: | $name = $prefix_curr . $this->tree[$key]['obj']->getVar($fieldName);
|
283: | $element->addOption($value, $name);
|
284: | $prefix_curr .= $prefix_orig;
|
285: | }
|
286: | if (isset($this->tree[$key]['child']) && !empty($this->tree[$key]['child'])) {
|
287: | foreach ($this->tree[$key]['child'] as $childKey) {
|
288: | $this->addSelectOptions($element, $fieldName, $childKey, $prefix_orig, $prefix_curr);
|
289: | }
|
290: | }
|
291: | }
|
292: |
|
293: | |
294: | |
295: | |
296: | |
297: | |
298: | |
299: | |
300: | |
301: | |
302: | |
303: |
|
304: | public function __get($name)
|
305: | {
|
306: | $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
|
307: | if ($name === '_tree') {
|
308: | $GLOBALS['xoopsLogger']->addDeprecated("XoopsObjectTree::\$_tree is deprecated, accessed from {$trace[0]['file']} line {$trace[0]['line']}");
|
309: | return $this->tree;
|
310: | }
|
311: | $message = 'Undefined property: XoopsObjectTree::$' . $name . " in {$trace[0]['file']} line {$trace[0]['line']}";
|
312: | $GLOBALS['xoopsLogger']->addExtra(get_called_class(), $message);
|
313: |
|
314: | return null;
|
315: | }
|
316: | }
|
317: | |