XoopsGroupFormCheckBox::setValue()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
/**
3
 * XOOPS form element
4
 *
5
 * You may not change or alter any portion of this comment or credits
6
 * of supporting developers from this source code or any supporting source code
7
 * which is considered copyrighted (c) material of the original comment or credit authors.
8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * @copyright       (c) 2000-2016 XOOPS Project (www.xoops.org)
13
 * @license             GNU GPL 2 (https://www.gnu.org/licenses/gpl-2.0.html)
14
 * @package             kernel
15
 * @subpackage          form
16
 * @since               2.0.0
17
 */
18
19
defined('XOOPS_ROOT_PATH') || exit('Restricted access');
20
21
xoops_load('XoopsFormElement');
22
xoops_load('XoopsFormHidden');
23
xoops_load('XoopsFormHiddenToken');
24
xoops_load('XoopsForm');
25
xoops_load('XoopsFormElementTray');
26
xoops_load('XoopsFormButton');
27
28
/**
29
 * Renders a form for setting module specific group permissions
30
 */
31
class XoopsGroupPermForm extends XoopsForm
32
{
33
    /**
34
     * Module ID
35
     *
36
     * @var int
37
     */
38
    public $_modid;
39
    /**
40
     * Tree structure of items
41
     *
42
     * @var array
43
     */
44
    public $_itemTree = array();
45
    /**
46
     * Name of permission
47
     *
48
     * @var string
49
     */
50
    public $_permName;
51
    /**
52
     * Description of permission
53
     *
54
     * @var string
55
     */
56
    public $_permDesc;
57
58
    /**
59
     * Whether to include anonymous users
60
     *
61
     * @var bool
62
     */
63
    public $_showAnonymous;
64
65
    /**
66
     * Constructor
67
     * @param        $title
68
     * @param        $modid
69
     * @param        $permname
70
     * @param        $permdesc
71
     * @param string $url
72
     * @param bool   $anonymous
73
     */
74
    public function __construct($title, $modid, $permname, $permdesc, $url = '', $anonymous = true)
75
    {
76
        parent::__construct($title, 'groupperm_form', XOOPS_URL . '/modules/system/admin/groupperm.php', 'post');
77
        $this->_modid    = (int)$modid;
78
        $this->_permName = $permname;
79
        $this->_permDesc = $permdesc;
80
        $this->addElement(new XoopsFormHidden('modid', $this->_modid));
81
        $this->addElement(new XoopsFormHiddenToken($permname));
82
        if ($url != '') {
83
            $this->addElement(new XoopsFormHidden('redirect_url', $url));
84
        }
85
        $this->_showAnonymous = $anonymous;
86
    }
87
88
    /**
89
     * Adds an item to which permission will be assigned
90
     *
91
     * @param string $itemName
92
     * @param int    $itemId
93
     * @param int    $itemParent
94
     * @access public
95
     */
96
    public function addItem($itemId, $itemName, $itemParent = 0)
97
    {
98
        $this->_itemTree[$itemParent]['children'][] = $itemId;
99
        $this->_itemTree[$itemId]['parent']         = $itemParent;
100
        $this->_itemTree[$itemId]['name']           = $itemName;
101
        $this->_itemTree[$itemId]['id']             = $itemId;
102
    }
103
104
    /**
105
     * Loads all child ids for an item to be used in javascript
106
     *
107
     * @param int   $itemId
108
     * @param array $childIds
109
     * @access private
110
     */
111
    public function _loadAllChildItemIds($itemId, &$childIds)
112
    {
113
        if (!empty($this->_itemTree[$itemId]['children'])) {
114
            $first_child = $this->_itemTree[$itemId]['children'];
115
            foreach ($first_child as $fcid) {
116
                $childIds[] = $fcid;
117
                if (!empty($this->_itemTree[$fcid]['children'])) {
118
                    foreach ($this->_itemTree[$fcid]['children'] as $_fcid) {
119
                        $childIds[] = $_fcid;
120
                        $this->_loadAllChildItemIds($_fcid, $childIds);
121
                    }
122
                }
123
            }
124
        }
125
    }
126
127
    /**
128
     * Renders the form
129
     *
130
     * @return string
131
     * @access public
132
     */
133
    public function render()
134
    {
135
        // load all child ids for javascript codes
136
        foreach (array_keys($this->_itemTree) as $item_id) {
137
            $this->_itemTree[$item_id]['allchild'] = array();
138
            $this->_loadAllChildItemIds($item_id, $this->_itemTree[$item_id]['allchild']);
139
        }
140
        /** @var  XoopsGroupPermHandler $gperm_handler */
141
        $gperm_handler  = xoops_getHandler('groupperm');
142
        /** @var XoopsMemberHandler $member_handler */
143
        $member_handler = xoops_getHandler('member');
144
        $glist          = $member_handler->getGroupList();
145
        foreach (array_keys($glist) as $i) {
146
            if ($i == XOOPS_GROUP_ANONYMOUS && !$this->_showAnonymous) {
147
                continue;
148
            }
149
            // get selected item id(s) for each group
150
            $selected = $gperm_handler->getItemIds($this->_permName, $i, $this->_modid);
151
            $ele      = new XoopsGroupFormCheckBox($glist[$i], 'perms[' . $this->_permName . ']', $i, $selected);
152
            $ele->setOptionTree($this->_itemTree);
153
            $this->addElement($ele);
154
            unset($ele);
155
        }
156
        $tray = new XoopsFormElementTray('');
157
        $tray->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
158
        $tray->addElement(new XoopsFormButton('', 'reset', _CANCEL, 'reset'));
159
        $this->addElement($tray);
160
161
        $ret = '<h4>' . $this->getTitle() . '</h4>';
162
        if ($this->_permDesc) {
163
            $ret .= $this->_permDesc . '<br><br>';
164
        }
165
        $ret .= '<form title="' . str_replace('"', '', $this->getTitle()) . '" name="' . $this->getName() . '" id="' . $this->getName() . '" action="' . $this->getAction() . '" method="' . $this->getMethod() . '"' . $this->getExtra() . '>' . '<table width="100%" class="outer" cellspacing="1" valign="top">';
166
        $elements =& $this->getElements();
167
        $hidden   = '';
168
        foreach (array_keys($elements) as $i) {
169
            if (!is_object($elements[$i])) {
170
                $ret .= $elements[$i];
171
            } elseif (!$elements[$i]->isHidden()) {
172
                $ret .= '<tr valign="top" align="left"><td class="head">' . $elements[$i]->getCaption();
173
                if ($elements[$i]->getDescription() != '') {
174
                    $ret .= "<br><br><span style='font-weight: normal;'>" . $elements[$i]->getDescription() . '</span>';
175
                }
176
                $ret .= '</td>' . '<td class="even">' . $elements[$i]->render() . '</td></tr>' . '';
0 ignored issues
show
Bug introduced by
Are you sure the usage of $elements[$i]->render() targeting XoopsFormElement::render() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
177
            } else {
178
                $hidden .= $elements[$i]->render();
0 ignored issues
show
Bug introduced by
Are you sure the usage of $elements[$i]->render() targeting XoopsFormElement::render() seems to always return null.

This check looks for function or method calls that always return null and whose return value is used.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
if ($a->getObject()) {

The method getObject() can return nothing but null, so it makes no sense to use the return value.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
179
            }
180
        }
181
        $ret .= '</table>' . $hidden . '</form>';
182
        $ret .= $this->renderValidationJS(true);
183
184
        return $ret;
185
    }
186
}
187
188
/**
189
 * Renders checkbox options for a group permission form
190
 */
191
class XoopsGroupFormCheckBox extends XoopsFormElement
192
{
193
    /**
194
     * Pre-selected value(s)
195
     *
196
     * @var array ;
197
     */
198
    public $_value = array();
199
    /**
200
     * Group ID
201
     *
202
     * @var int
203
     */
204
    public $_groupId;
205
    /**
206
     * Option tree
207
     *
208
     * @var array
209
     */
210
    public $_optionTree = array();
211
212
    /**
213
     * Constructor
214
     * @param      $caption
215
     * @param      $name
216
     * @param      $groupId
217
     * @param null $values
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $values is correct as it would always require null to be passed?
Loading history...
218
     */
219
    public function __construct($caption, $name, $groupId, $values = null)
220
    {
221
        $this->setCaption($caption);
222
        $this->setName($name);
223
        if (isset($values)) {
224
            $this->setValue($values);
225
        }
226
        $this->_groupId = $groupId;
227
    }
228
229
    /**
230
     * Sets pre-selected values
231
     *
232
     * @param mixed $value A group ID or an array of group IDs
233
     * @access public
234
     */
235
    public function setValue($value)
236
    {
237
        if (is_array($value)) {
238
            foreach ($value as $v) {
239
                $this->setValue($v);
240
            }
241
        } else {
242
            $this->_value[] = $value;
243
        }
244
    }
245
246
    /**
247
     * Sets the tree structure of items
248
     *
249
     * @param array $optionTree
250
     * @access public
251
     */
252
    public function setOptionTree(&$optionTree)
253
    {
254
        $this->_optionTree = &$optionTree;
255
    }
256
257
    /**
258
     * Renders checkbox options for this group
259
     *
260
     * @return string
261
     * @access public
262
     */
263
    public function render()
264
    {
265
        $ele_name = $this->getName();
266
        $ret      = '<table class="outer"><tr><td class="odd"><table><tr>';
267
        $cols     = 1;
268
        foreach ($this->_optionTree[0]['children'] as $topitem) {
269
            if ($cols > 4) {
270
                $ret .= '</tr><tr>';
271
                $cols = 1;
272
            }
273
            $tree   = '<td valign="top">';
274
            $prefix = '';
275
            $this->_renderOptionTree($tree, $this->_optionTree[$topitem], $prefix);
276
            $ret .= $tree . '</td>';
277
            ++$cols;
278
        }
279
        $ret .= '</tr></table></td><td class="even" valign="top">';
280
        $option_ids = array();
281
        foreach (array_keys($this->_optionTree) as $id) {
282
            if (!empty($id)) {
283
                $option_ids[] = "'" . $ele_name . '[groups][' . $this->_groupId . '][' . $id . ']' . "'";
284
            }
285
        }
286
        $checkallbtn_id = $ele_name . '[checkallbtn][' . $this->_groupId . ']';
287
        $option_ids_str = implode(', ', $option_ids);
288
        $ret .= _ALL . " <input id=\"" . $checkallbtn_id . "\" type=\"checkbox\" value=\"\" onclick=\"var optionids = new Array(" . $option_ids_str . "); xoopsCheckAllElements(optionids, '" . $checkallbtn_id . "');\" />";
289
        $ret .= '</td></tr></table>';
290
291
        return $ret;
292
    }
293
294
    /**
295
     * Renders checkbox options for an item tree
296
     *
297
     * @param string $tree
298
     * @param array  $option
299
     * @param string $prefix
300
     * @param array  $parentIds
301
     * @access private
302
     */
303
    public function _renderOptionTree(&$tree, $option, $prefix, $parentIds = array())
304
    {
305
        $ele_name = $this->getName();
306
        $tree .= $prefix . "<input type=\"checkbox\" name=\"" . $ele_name . '[groups][' . $this->_groupId . '][' . $option['id'] . "]\" id=\"" . $ele_name . '[groups][' . $this->_groupId . '][' . $option['id'] . "]\" onclick=\"";
307
        // If there are parent elements, add javascript that will
308
        // make them selecteded when this element is checked to make
309
        // sure permissions to parent items are added as well.
310
        foreach ($parentIds as $pid) {
311
            $parent_ele = $ele_name . '[groups][' . $this->_groupId . '][' . $pid . ']';
312
            $tree .= "var ele = xoopsGetElementById('" . $parent_ele . "'); if(ele.checked != true) {ele.checked = this.checked;}";
313
        }
314
        // If there are child elements, add javascript that will
315
        // make them unchecked when this element is unchecked to make
316
        // sure permissions to child items are not added when there
317
        // is no permission to this item.
318
        foreach ($option['allchild'] as $cid) {
319
            $child_ele = $ele_name . '[groups][' . $this->_groupId . '][' . $cid . ']';
320
            $tree .= "var ele = xoopsGetElementById('" . $child_ele . "'); if(this.checked != true) {ele.checked = false;}";
321
        }
322
        $tree .= '" value="1"';
323
        if (in_array($option['id'], $this->_value)) {
324
            $tree .= ' checked';
325
        }
326
        $tree .= ' />' . $option['name'] . "<input type=\"hidden\" name=\"" . $ele_name . '[parents][' . $option['id'] . "]\" value=\"" . implode(':', $parentIds) . "\" /><input type=\"hidden\" name=\"" . $ele_name . '[itemname][' . $option['id'] . "]\" value=\"" . htmlspecialchars($option['name'], ENT_QUOTES | ENT_HTML5) . "\" /><br>\n";
327
        if (isset($option['children'])) {
328
            foreach ($option['children'] as $child) {
329
                $parentIds[] = $option['id'];
330
                $this->_renderOptionTree($tree, $this->_optionTree[$child], $prefix . '&nbsp;-', $parentIds);
331
            }
332
        }
333
    }
334
}
335