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: 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: 30:
31: class XoopsGroupPermForm extends XoopsForm
32: {
33: 34: 35: 36: 37:
38: public $_modid;
39: 40: 41: 42: 43:
44: public $_itemTree = array();
45: 46: 47: 48: 49:
50: public $_permName;
51: 52: 53: 54: 55:
56: public $_permDesc;
57:
58: 59: 60: 61: 62:
63: public $_showAnonymous;
64:
65: 66: 67: 68: 69: 70: 71: 72: 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: 90: 91: 92: 93: 94: 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: 106: 107: 108: 109: 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: 129: 130: 131: 132:
133: public function render()
134: {
135:
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:
141: $gperm_handler = xoops_getHandler('groupperm');
142:
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:
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>' . '';
177: } else {
178: $hidden .= $elements[$i]->render();
179: }
180: }
181: $ret .= '</table>' . $hidden . '</form>';
182: $ret .= $this->renderValidationJS(true);
183:
184: return $ret;
185: }
186: }
187:
188: 189: 190:
191: class XoopsGroupFormCheckBox extends XoopsFormElement
192: {
193: 194: 195: 196: 197:
198: public $_value = array();
199: 200: 201: 202: 203:
204: public $_groupId;
205: 206: 207: 208: 209:
210: public $_optionTree = array();
211:
212: 213: 214: 215: 216: 217: 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: 231: 232: 233: 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: 248: 249: 250: 251:
252: public function setOptionTree(&$optionTree)
253: {
254: $this->_optionTree = &$optionTree;
255: }
256:
257: 258: 259: 260: 261: 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: 296: 297: 298: 299: 300: 301: 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:
308:
309:
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:
315:
316:
317:
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']) . "\" /><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 . ' -', $parentIds);
331: }
332: }
333: }
334: }
335: