source: temp/test-xoops.ec-cube.net/html/class/tree.php @ 405

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