C:\$Recycle.Bin\S-1-5-21-3967099092-2644009230-141905953-500\$RU7MSUA\html\class\tree.php


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>';
    }


}
?>