Completed
Push — master ( 234b0e...1578b3 )
by Michael
14s
created

MyXoopsGroupFormCheckBox()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 9
rs 9.6666
cc 2
eloc 6
nc 2
nop 4
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 49 and the first side effect is on line 32.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
// $Id: mygrouppermform.php 8112 2011-11-06 13:41:14Z beckmi $
3
//  ------------------------------------------------------------------------ //
4
//                XOOPS - PHP Content Management System                      //
5
//                    Copyright (c) 2000-2003 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.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
29
// Project: The XOOPS Project                                                //
30
// ------------------------------------------------------------------------- //
31
32
if (!defined('XOOPS_ROOT_PATH')) exit;
33
34
require_once XOOPS_ROOT_PATH.'/class/xoopsform/formelement.php';
35
require_once XOOPS_ROOT_PATH.'/class/xoopsform/formhidden.php';
36
require_once XOOPS_ROOT_PATH.'/class/xoopsform/formbutton.php';
37
require_once XOOPS_ROOT_PATH.'/class/xoopsform/formelementtray.php';
38
require_once XOOPS_ROOT_PATH.'/class/xoopsform/form.php';
39
40
/**
41
 * Renders a form for setting module specific group permissions
42
 *
43
 * @author    Kazumi Ono    <[email protected]>
44
 * @copyright    copyright (c) 2000-2003 XOOPS.org
45
 *
46
 * @package     kernel
47
 * @subpackage  form
48
 */
49
class MyXoopsGroupPermForm extends XoopsForm
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
50
{
51
52
    /**
53
     * Module ID
54
     * @var int
55
     */
56
    var $_modid;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_modid.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
57
    /**
58
     * Tree structure of items
59
     * @var array
60
     */
61
    var $_itemTree = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_itemTree.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
62
    /**
63
     * Name of permission
64
     * @var string
65
     */
66
    var $_permName;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_permName.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
67
    /**
68
     * Description of permission
69
     * @var string
70
     */
71
    var $_permDesc;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_permDesc.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
72
    /**
73
     * Appendix
74
     * @var array ('permname'=>,'itemid'=>,'itemname'=>,'selected'=>)
75
     */
76
    var $_appendix = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_appendix.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
77
78
    /**
79
     * Constructor
80
     */
81
    public function __construct($title, $modid, $permname, $permdesc)
82
    {
83
//        $this->XoopsForm($title, 'groupperm_form', XOOPS_URL.'/modules/system/admin/groupperm.php', 'post'); GIJ
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
84
        $this->XoopsForm($title, 'groupperm_form', '', 'post');
85
        $this->_modid    = intval($modid);
86
        $this->_permName = $permname;
87
        $this->_permDesc = $permdesc;
88
        $this->addElement(new XoopsFormHidden('modid', $this->_modid));
89
    }
90
91
    /**
92
     * Adds an item to which permission will be assigned
93
     *
94
     * @param string $itemName
95
     * @param int    $itemId
96
     * @param int    $itemParent
97
     * @access public
98
     */
99
    function addItem($itemId, $itemName, $itemParent = 0)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
100
    {
101
        $this->_itemTree[$itemParent]['children'][] = $itemId;
102
        $this->_itemTree[$itemId]['parent']         = $itemParent;
103
        $this->_itemTree[$itemId]['name']           = $itemName;
104
        $this->_itemTree[$itemId]['id']             = $itemId;
105
    }
106
107
  /**
108
   * Add appendix
109
   *
110
   * @access public
111
    */
112
    function addAppendix($permName,$itemId,$itemName)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
113
    {
114
        $this->_appendix[] = array('permname'=>$permName,'itemid'=>$itemId,'itemname'=>$itemName,'selected'=>false);
115
    }
116
117
  /**
118
     * Loads all child ids for an item to be used in javascript
119
     *
120
     * @param int   $itemId
121
     * @param array $childIds
122
     * @access private
123
     */
124
    function _loadAllChildItemIds($itemId, &$childIds)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
125
    {
126
        if (!empty($this->_itemTree[$itemId]['children'])) {
127
            $first_child = $this->_itemTree[$itemId]['children'];
128
            foreach ($first_child as $fcid) {
129
                array_push($childIds, $fcid);
130
                if (!empty($this->_itemTree[$fcid]['children'])) {
131
                    foreach ($this->_itemTree[$fcid]['children'] as $_fcid) {
132
                        array_push($childIds, $_fcid);
133
                        $this->_loadAllChildItemIds($_fcid, $childIds);
134
                    }
135
                }
136
            }
137
        }
138
    }
139
140
  /**
141
     * Renders the form
142
     *
143
     * @return string
144
     * @access public
145
     */
146
    function render()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
147
    {
148
        global $xoopsGTicket;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
149
150
        // load all child ids for javascript codes
151
        foreach (array_keys($this->_itemTree) as $item_id) {
152
            $this->_itemTree[$item_id]['allchild'] = array();
153
            $this->_loadAllChildItemIds($item_id, $this->_itemTree[$item_id]['allchild']);
154
        }
155
        $gperm_handler =& xoops_getHandler('groupperm');
156
        $member_handler =& xoops_getHandler('member');
157
        $glist = $member_handler->getGroupList();
158
        foreach (array_keys($glist) as $i) {
159
            // get selected item id(s) for each group
160
            $selected = $gperm_handler->getItemIds($this->_permName, $i, $this->_modid);
161
            $ele = new MyXoopsGroupFormCheckBox($glist[$i], 'perms['.$this->_permName.']', $i, $selected);
162
            $ele->setOptionTree($this->_itemTree);
163
164
            foreach ($this->_appendix as $key => $append) {
165
                $this->_appendix[$key]['selected'] = $gperm_handler->checkRight($append['permname'], $append['itemid'], $i, $this->_modid );
166
            }
167
            $ele->setAppendix($this->_appendix);
168
            $this->addElement($ele);
169
            unset($ele);
170
        }
171
172
        // GIJ start
173
        $jstray = new XoopsFormElementTray(' &nbsp; ');
174
        $jsuncheckbutton = new XoopsFormButton('', 'none', _NONE, 'button');
175
        $jsuncheckbutton->setExtra( "onclick=\"with(document.groupperm_form){for(i=0;i<length;i++){if(elements[i].type=='checkbox'){elements[i].checked=false;}}}\"" );
176
        $jscheckbutton = new XoopsFormButton('', 'all', _ALL, 'button');
177
        $jscheckbutton->setExtra( "onclick=\"with(document.groupperm_form){for(i=0;i<length;i++){if(elements[i].type=='checkbox' && (elements[i].name.indexOf('module_admin')<0 || elements[i].name.indexOf('[groups][1]')>=0)){elements[i].checked=true;}}}\"" );
178
        $jstray->addElement( $jsuncheckbutton );
179
        $jstray->addElement( $jscheckbutton );
180
        $this->addElement($jstray);
181
        // GIJ end
182
183
        $tray = new XoopsFormElementTray('');
184
        $tray->addElement(new XoopsFormButton('', 'reset', _CANCEL, 'reset'));
185
        $tray->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
186
        $this->addElement($tray);
187
188
        $ret = '<h4>' . $this->getTitle() . '</h4>' . $this->_permDesc . '<br>';
189
        $ret .= "<form name='" . $this->getName() . "' id='" . $this->getName() . "' action='" . $this->getAction() . "' method='" . $this->getMethod() . "'" . $this->getExtra() . ">\n<table style='width: 100% margin: 1px;' class='outer'>\n";
0 ignored issues
show
Bug introduced by
Consider using $this->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
190
        $elements =& $this->getElements();
191
        foreach (array_keys($elements) as $i) {
192
            if (!is_object($elements[$i])) {
193
                $ret .= $elements[$i];
194
            } elseif (!$elements[$i]->isHidden()) {
195
                $ret .= "<tr style='vertical-align: top; text-align: left;'><td class='head'>".$elements[$i]->getCaption();
196
                if ($elements[$i]->getDescription() != '') {
197
                    $ret .= '<br><br><span style="font-weight: normal;">'.$elements[$i]->getDescription().'</span>';
198
                }
199
                $ret .= "</td>\n<td class='even'>\n".$elements[$i]->render()."\n</td></tr>\n";
200
            } else {
201
                $ret .= $elements[$i]->render();
202
            }
203
        }
204
        $ret .= '</table>' . $xoopsGTicket->getTicketHtml(__LINE__ , 1800, 'myblocksadmin' ) . '</form>';
205
206
        return $ret;
207
    }
208
}
209
210
/**
211
 * Renders checkbox options for a group permission form
212
 *
213
 * @author    Kazumi Ono    <[email protected]>
214
 * @copyright    copyright (c) 2000-2003 XOOPS.org
215
 *
216
 * @package     kernel
217
 * @subpackage  form
218
 */
219
class MyXoopsGroupFormCheckBox extends XoopsFormElement
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class should be in its own file to aid autoloaders.

Having each class in a dedicated file usually plays nice with PSR autoloaders and is therefore a well established practice. If you use other autoloaders, you might not want to follow this rule.

Loading history...
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
220
{
221
222
    /**
223
     * Pre-selected value(s)
224
     * @var array;
225
     */
226
    var $_value;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_value.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
227
    /**
228
     * Group ID
229
     * @var int
230
     */
231
    var $_groupId;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_groupId.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
232
    /**
233
     * Option tree
234
     * @var array
235
     */
236
    var $_optionTree;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_optionTree.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
237
    /**
238
     * Appendix
239
     * @var array ('permname'=>,'itemid'=>,'itemname'=>,'selected'=>)
240
     */
241
    var $_appendix = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $_appendix.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
242
243
    /**
244
     * Constructor
245
     */
246
    public function __construct($caption, $name, $groupId, $values = null)
247
    {
248
        $this->setCaption($caption);
249
        $this->setName($name);
250
        if (isset($values)) {
251
            $this->setValue($values);
252
        }
253
        $this->_groupId = $groupId;
254
    }
255
256
    /**
257
     * Sets pre-selected values
258
     *
259
     * @param mixed $value A group ID or an array of group IDs
260
     * @access public
261
     */
262
    function setValue($value)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
263
    {
264
        if (is_array($value)) {
265
            foreach ($value as $v) {
266
                $this->setValue($v);
267
            }
268
        } else {
269
            $this->_value[] = $value;
270
        }
271
    }
272
273
  /**
274
   * Sets the tree structure of items
275
   *
276
   * @param array $optionTree
277
   * @access public
278
   */
279
    function setOptionTree(&$optionTree)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
280
    {
281
        $this->_optionTree =& $optionTree;
282
    }
283
284
    /**
285
     * Sets appendix of checkboxes
286
     *
287
     * @access public
288
     */
289
    function setAppendix($appendix)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
290
    {
291
        $this->_appendix = $appendix;
292
    }
293
294
    /**
295
     * Renders checkbox options for this group
296
     *
297
     * @return string
298
     * @access public
299
     */
300
    function render()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
301
    {
302
        $ret = '';
303
304
    if (sizeof($this->_appendix) > 0) {
305
        $ret .= '<table class="outer"><tr>';
306
        $cols = 1;
307
        foreach ($this->_appendix as $append) {
308
            if ($cols > 4) {
309
                $ret .= '</tr><tr>';
310
                $cols = 1;
311
            }
312
            $checked = $append['selected'] ? 'checked="checked"' : '';
313
            $name = 'perms['.$append['permname'].']';
314
            $itemid = $append['itemid'];
0 ignored issues
show
Unused Code introduced by
$itemid is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
315
            $itemid = $append['itemid'];
316
            $ret .= "<td class=\"odd\"><input type=\"checkbox\" name=\"{$name}[groups][$this->_groupId][$itemid]\" id=\"{$name}[groups][$this->_groupId][$itemid]\" value=\"1\" $checked>{$append['itemname']}<input type=\"hidden\" name=\"{$name}[parents][$itemid]\" value=\"\"><input type=\"hidden\" name=\"{$name}[itemname][$itemid]\" value=\"{$append['itemname']}\"><br></td>";
317
            $cols++;
318
        }
319
        $ret .= '</tr></table>';
320
    }
321
322
    $ret .= '<table class="outer"><tr>';
323
    $cols = 1;
324
    if (!empty($this->_optionTree[0]['children'])) {
325
        foreach ($this->_optionTree[0]['children'] as $topitem) {
326
            if ($cols > 4) {
327
                $ret .= '</tr><tr>';
328
                $cols = 1;
329
            }
330
            $tree = '<td class="odd">';
331
            $prefix = '';
332
            $this->_renderOptionTree($tree, $this->_optionTree[$topitem], $prefix);
333
            $ret .= "{$tree}</td>";
334
            $cols++;
335
        }
336
    }
337
    $ret .= '</tr></table>';
338
339
    return $ret;
340
  }
341
342
    /**
343
     * Renders checkbox options for an item tree
344
     *
345
     * @param string $tree
346
     * @param array  $option
347
     * @param string $prefix
348
     * @param array  $parentIds
349
     * @access private
350
     */
351
    function _renderOptionTree(&$tree, $option, $prefix, $parentIds = array())
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
352
    {
353
        $tree .= $prefix ."<input type=\"checkbox\" name=\"" . $this->getName() . '[groups][' . $this->_groupId . '][' . $option['id'] . "]\" id=\"" . $this->getName() . '[groups][' . $this->_groupId . '][' . $option['id'] . "]\" onclick=\"";
0 ignored issues
show
Bug introduced by
Consider using $this->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
354
        // If there are parent elements, add javascript that will
355
        // make them selecteded when this element is checked to make
356
        // sure permissions to parent items are added as well.
357
        foreach ($parentIds as $pid) {
358
            $parent_ele = $this->getName() . '[groups][' . $this->_groupId . '][' . $pid . ']';
0 ignored issues
show
Bug introduced by
Consider using $this->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
359
            $tree      .= "var ele = xoopsGetElementById('" . $parent_ele . "'); if(ele.checked != true) {ele.checked = this.checked;}";
360
        }
361
        // If there are child elements, add javascript that will
362
        // make them unchecked when this element is unchecked to make
363
        // sure permissions to child items are not added when there
364
        // is no permission to this item.
365
        foreach ($option['allchild'] as $cid) {
366
            $child_ele = $this->getName().'[groups]['.$this->_groupId.']['.$cid.']';
0 ignored issues
show
Bug introduced by
Consider using $this->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
367
            $tree .= "var ele = xoopsGetElementById('".$child_ele."'); if(this.checked != true) {ele.checked = false;}";
368
        }
369
        $tree .= '" value="1"';
370
        if ( isset( $this->_value ) && in_array($option['id'], $this->_value)) {
371
            $tree .= " checked='checked'";
372
        }
373
        $tree .= '>' . $option['name'] . "<input type=\"hidden\" name=\"" . $this->getName() . '[parents][' . $option['id'] . "]\" value=\"" . implode(':', $parentIds) . "\"><input type=\"hidden\" name=\"" . $this->getName() . '[itemname][' . $option['id'] . "]\" value=\"" . htmlspecialchars($option['name']) . "\"><br>\n";
0 ignored issues
show
Bug introduced by
Consider using $this->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
374
        if (isset($option['children'])) {
375
            foreach ($option['children'] as $child) {
376
                array_push($parentIds, $option['id']);
377
                $this->_renderOptionTree($tree, $this->_optionTree[$child], $prefix.'&nbsp;-', $parentIds);
378
            }
379
        }
380
    }
381
}
382