Complex classes like admin_plugin_acl often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use admin_plugin_acl, and based on these observations, apply Extract Interface, too.
| 1 | <?php |
||
| 17 | class admin_plugin_acl extends DokuWiki_Admin_Plugin { |
||
| 18 | var $acl = null; |
||
| 19 | var $ns = null; |
||
| 20 | /** |
||
| 21 | * The currently selected item, associative array with id and type. |
||
| 22 | * Populated from (in this order): |
||
| 23 | * $_REQUEST['current_ns'] |
||
| 24 | * $_REQUEST['current_id'] |
||
| 25 | * $ns |
||
| 26 | * $ID |
||
| 27 | */ |
||
| 28 | var $current_item = null; |
||
| 29 | var $who = ''; |
||
| 30 | var $usersgroups = array(); |
||
| 31 | var $specials = array(); |
||
| 32 | |||
| 33 | /** |
||
| 34 | * return prompt for admin menu |
||
| 35 | */ |
||
| 36 | function getMenuText($language) { |
||
| 39 | |||
| 40 | /** |
||
| 41 | * return sort order for position in admin menu |
||
| 42 | */ |
||
| 43 | function getMenuSort() { |
||
| 46 | |||
| 47 | /** |
||
| 48 | * handle user request |
||
| 49 | * |
||
| 50 | * Initializes internal vars and handles modifications |
||
| 51 | * |
||
| 52 | * @author Andreas Gohr <[email protected]> |
||
| 53 | */ |
||
| 54 | function handle() { |
||
| 55 | global $AUTH_ACL; |
||
| 56 | global $ID; |
||
| 57 | global $auth; |
||
| 58 | global $config_cascade; |
||
| 59 | global $INPUT; |
||
| 60 | |||
| 61 | // fresh 1:1 copy without replacements |
||
| 62 | $AUTH_ACL = file($config_cascade['acl']['default']); |
||
| 63 | |||
| 64 | // namespace given? |
||
| 65 | if($INPUT->str('ns') == '*'){ |
||
| 66 | $this->ns = '*'; |
||
| 67 | }else{ |
||
| 68 | $this->ns = cleanID($INPUT->str('ns')); |
||
| 69 | } |
||
| 70 | |||
| 71 | if ($INPUT->str('current_ns')) { |
||
| 72 | $this->current_item = array('id' => cleanID($INPUT->str('current_ns')), 'type' => 'd'); |
||
| 73 | } elseif ($INPUT->str('current_id')) { |
||
| 74 | $this->current_item = array('id' => cleanID($INPUT->str('current_id')), 'type' => 'f'); |
||
| 75 | } elseif ($this->ns) { |
||
| 76 | $this->current_item = array('id' => $this->ns, 'type' => 'd'); |
||
| 77 | } else { |
||
| 78 | $this->current_item = array('id' => $ID, 'type' => 'f'); |
||
| 79 | } |
||
| 80 | |||
| 81 | // user or group choosen? |
||
| 82 | $who = trim($INPUT->str('acl_w')); |
||
| 83 | if($INPUT->str('acl_t') == '__g__' && $who){ |
||
| 84 | $this->who = '@'.ltrim($auth->cleanGroup($who),'@'); |
||
| 85 | }elseif($INPUT->str('acl_t') == '__u__' && $who){ |
||
| 86 | $this->who = ltrim($who,'@'); |
||
| 87 | if($this->who != '%USER%' && $this->who != '%GROUP%'){ #keep wildcard as is |
||
| 88 | $this->who = $auth->cleanUser($this->who); |
||
| 89 | } |
||
| 90 | }elseif($INPUT->str('acl_t') && |
||
| 91 | $INPUT->str('acl_t') != '__u__' && |
||
| 92 | $INPUT->str('acl_t') != '__g__'){ |
||
| 93 | $this->who = $INPUT->str('acl_t'); |
||
| 94 | }elseif($who){ |
||
| 95 | $this->who = $who; |
||
| 96 | } |
||
| 97 | |||
| 98 | // handle modifications |
||
| 99 | if($INPUT->has('cmd') && checkSecurityToken()){ |
||
| 100 | $cmd = $INPUT->extract('cmd')->str('cmd'); |
||
| 101 | |||
| 102 | // scope for modifications |
||
| 103 | if($this->ns){ |
||
| 104 | if($this->ns == '*'){ |
||
| 105 | $scope = '*'; |
||
| 106 | }else{ |
||
| 107 | $scope = $this->ns.':*'; |
||
| 108 | } |
||
| 109 | }else{ |
||
| 110 | $scope = $ID; |
||
| 111 | } |
||
| 112 | |||
| 113 | if($cmd == 'save' && $scope && $this->who && $INPUT->has('acl')){ |
||
| 114 | // handle additions or single modifications |
||
| 115 | $this->_acl_del($scope, $this->who); |
||
| 116 | $this->_acl_add($scope, $this->who, $INPUT->int('acl')); |
||
| 117 | }elseif($cmd == 'del' && $scope && $this->who){ |
||
| 118 | // handle single deletions |
||
| 119 | $this->_acl_del($scope, $this->who); |
||
| 120 | }elseif($cmd == 'update'){ |
||
| 121 | $acl = $INPUT->arr('acl'); |
||
| 122 | |||
| 123 | // handle update of the whole file |
||
| 124 | foreach($INPUT->arr('del') as $where => $names){ |
||
| 125 | // remove all rules marked for deletion |
||
| 126 | foreach($names as $who) |
||
| 127 | unset($acl[$where][$who]); |
||
| 128 | } |
||
| 129 | // prepare lines |
||
| 130 | $lines = array(); |
||
| 131 | // keep header |
||
| 132 | foreach($AUTH_ACL as $line){ |
||
| 133 | if($line{0} == '#'){ |
||
| 134 | $lines[] = $line; |
||
| 135 | }else{ |
||
| 136 | break; |
||
| 137 | } |
||
| 138 | } |
||
| 139 | // re-add all rules |
||
| 140 | foreach($acl as $where => $opt){ |
||
| 141 | foreach($opt as $who => $perm){ |
||
| 142 | if ($who[0]=='@') { |
||
| 143 | if ($who!='@ALL') { |
||
| 144 | $who = '@'.ltrim($auth->cleanGroup($who),'@'); |
||
| 145 | } |
||
| 146 | } elseif ($who != '%USER%' && $who != '%GROUP%'){ #keep wildcard as is |
||
| 147 | $who = $auth->cleanUser($who); |
||
| 148 | } |
||
| 149 | $who = auth_nameencode($who,true); |
||
| 150 | $lines[] = "$where\t$who\t$perm\n"; |
||
| 151 | } |
||
| 152 | } |
||
| 153 | // save it |
||
| 154 | io_saveFile($config_cascade['acl']['default'], join('',$lines)); |
||
| 155 | } |
||
| 156 | |||
| 157 | // reload ACL config |
||
| 158 | $AUTH_ACL = file($config_cascade['acl']['default']); |
||
| 159 | } |
||
| 160 | |||
| 161 | // initialize ACL array |
||
| 162 | $this->_init_acl_config(); |
||
| 163 | } |
||
| 164 | |||
| 165 | /** |
||
| 166 | * ACL Output function |
||
| 167 | * |
||
| 168 | * print a table with all significant permissions for the |
||
| 169 | * current id |
||
| 170 | * |
||
| 171 | * @author Frank Schubert <[email protected]> |
||
| 172 | * @author Andreas Gohr <[email protected]> |
||
| 173 | */ |
||
| 174 | function html() { |
||
| 175 | echo '<div id="acl_manager">'.NL; |
||
| 176 | echo '<h1>'.$this->getLang('admin_acl').'</h1>'.NL; |
||
| 177 | echo '<div class="level1">'.NL; |
||
| 178 | |||
| 179 | echo '<div id="acl__tree">'.NL; |
||
| 180 | $this->_html_explorer(); |
||
| 181 | echo '</div>'.NL; |
||
| 182 | |||
| 183 | echo '<div id="acl__detail">'.NL; |
||
| 184 | $this->_html_detail(); |
||
| 185 | echo '</div>'.NL; |
||
| 186 | echo '</div>'.NL; |
||
| 187 | |||
| 188 | echo '<div class="clearer"></div>'; |
||
| 189 | echo '<h2>'.$this->getLang('current').'</h2>'.NL; |
||
| 190 | echo '<div class="level2">'.NL; |
||
| 191 | $this->_html_table(); |
||
| 192 | echo '</div>'.NL; |
||
| 193 | |||
| 194 | echo '<div class="footnotes"><div class="fn">'.NL; |
||
| 195 | echo '<sup><a id="fn__1" class="fn_bot" href="#fnt__1">1)</a></sup>'.NL; |
||
| 196 | echo $this->getLang('p_include'); |
||
| 197 | echo '</div></div>'; |
||
| 198 | |||
| 199 | echo '</div>'.NL; |
||
| 200 | } |
||
| 201 | |||
| 202 | /** |
||
| 203 | * returns array with set options for building links |
||
| 204 | * |
||
| 205 | * @author Andreas Gohr <[email protected]> |
||
| 206 | */ |
||
| 207 | function _get_opts($addopts=null){ |
||
| 218 | |||
| 219 | /** |
||
| 220 | * Display a tree menu to select a page or namespace |
||
| 221 | * |
||
| 222 | * @author Andreas Gohr <[email protected]> |
||
| 223 | */ |
||
| 224 | function _html_explorer(){ |
||
| 225 | global $conf; |
||
| 226 | global $ID; |
||
| 227 | global $lang; |
||
| 228 | |||
| 229 | $ns = $this->ns; |
||
| 230 | if(empty($ns)){ |
||
| 231 | $ns = dirname(str_replace(':','/',$ID)); |
||
| 232 | if($ns == '.') $ns =''; |
||
| 233 | }elseif($ns == '*'){ |
||
| 234 | $ns =''; |
||
| 235 | } |
||
| 236 | $ns = utf8_encodeFN(str_replace(':','/',$ns)); |
||
| 237 | |||
| 238 | $data = $this->_get_tree($ns); |
||
| 239 | |||
| 240 | // wrap a list with the root level around the other namespaces |
||
| 241 | array_unshift($data, array( 'level' => 0, 'id' => '*', 'type' => 'd', |
||
| 242 | 'open' =>'true', 'label' => '['.$lang['mediaroot'].']')); |
||
| 243 | |||
| 244 | echo html_buildlist($data,'acl', |
||
| 245 | array($this,'_html_list_acl'), |
||
| 246 | array($this,'_html_li_acl')); |
||
| 247 | |||
| 248 | } |
||
| 249 | |||
| 250 | /** |
||
| 251 | * get a combined list of media and page files |
||
| 252 | * |
||
| 253 | * @param string $folder an already converted filesystem folder of the current namespace |
||
| 254 | * @param string $limit limit the search to this folder |
||
| 255 | */ |
||
| 256 | function _get_tree($folder,$limit=''){ |
||
| 257 | global $conf; |
||
| 258 | |||
| 259 | // read tree structure from pages and media |
||
| 260 | $data = array(); |
||
| 261 | search($data,$conf['datadir'],'search_index',array('ns' => $folder),$limit); |
||
| 262 | $media = array(); |
||
| 263 | search($media,$conf['mediadir'],'search_index',array('ns' => $folder, 'nofiles' => true),$limit); |
||
| 264 | $data = array_merge($data,$media); |
||
| 265 | unset($media); |
||
| 266 | |||
| 267 | // combine by sorting and removing duplicates |
||
| 268 | usort($data,array($this,'_tree_sort')); |
||
| 269 | $count = count($data); |
||
| 270 | if($count>0) for($i=1; $i<$count; $i++){ |
||
| 271 | if($data[$i-1]['id'] == $data[$i]['id'] && $data[$i-1]['type'] == $data[$i]['type']) { |
||
| 272 | unset($data[$i]); |
||
| 273 | $i++; // duplicate found, next $i can't be a duplicate, so skip forward one |
||
| 274 | } |
||
| 275 | } |
||
| 276 | return $data; |
||
| 277 | } |
||
| 278 | |||
| 279 | /** |
||
| 280 | * usort callback |
||
| 281 | * |
||
| 282 | * Sorts the combined trees of media and page files |
||
| 283 | */ |
||
| 284 | function _tree_sort($a,$b){ |
||
| 285 | // handle the trivial cases first |
||
| 286 | if ($a['id'] == '') return -1; |
||
| 287 | if ($b['id'] == '') return 1; |
||
| 288 | // split up the id into parts |
||
| 289 | $a_ids = explode(':', $a['id']); |
||
| 290 | $b_ids = explode(':', $b['id']); |
||
| 291 | // now loop through the parts |
||
| 292 | while (count($a_ids) && count($b_ids)) { |
||
| 293 | // compare each level from upper to lower |
||
| 294 | // until a non-equal component is found |
||
| 295 | $cur_result = strcmp(array_shift($a_ids), array_shift($b_ids)); |
||
| 296 | if ($cur_result) { |
||
| 297 | // if one of the components is the last component and is a file |
||
| 298 | // and the other one is either of a deeper level or a directory, |
||
| 299 | // the file has to come after the deeper level or directory |
||
| 300 | if (empty($a_ids) && $a['type'] == 'f' && (count($b_ids) || $b['type'] == 'd')) return 1; |
||
| 301 | if (empty($b_ids) && $b['type'] == 'f' && (count($a_ids) || $a['type'] == 'd')) return -1; |
||
| 302 | return $cur_result; |
||
| 303 | } |
||
| 304 | } |
||
| 305 | // The two ids seem to be equal. One of them might however refer |
||
| 306 | // to a page, one to a namespace, the namespace needs to be first. |
||
| 307 | if (empty($a_ids) && empty($b_ids)) { |
||
| 308 | if ($a['type'] == $b['type']) return 0; |
||
| 309 | if ($a['type'] == 'f') return 1; |
||
| 310 | return -1; |
||
| 311 | } |
||
| 312 | // Now the empty part is either a page in the parent namespace |
||
| 313 | // that obviously needs to be after the namespace |
||
| 314 | // Or it is the namespace that contains the other part and should be |
||
| 315 | // before that other part. |
||
| 316 | if (empty($a_ids)) return ($a['type'] == 'd') ? -1 : 1; |
||
| 317 | if (empty($b_ids)) return ($b['type'] == 'd') ? 1 : -1; |
||
| 318 | } |
||
| 319 | |||
| 320 | /** |
||
| 321 | * Display the current ACL for selected where/who combination with |
||
| 322 | * selectors and modification form |
||
| 323 | * |
||
| 324 | * @author Andreas Gohr <[email protected]> |
||
| 325 | */ |
||
| 326 | function _html_detail(){ |
||
| 327 | global $ID; |
||
| 328 | |||
| 329 | echo '<form action="'.wl().'" method="post" accept-charset="utf-8"><div class="no">'.NL; |
||
| 330 | |||
| 331 | echo '<div id="acl__user">'; |
||
| 332 | echo $this->getLang('acl_perms').' '; |
||
| 333 | $inl = $this->_html_select(); |
||
| 334 | echo '<input type="text" name="acl_w" class="edit" value="'.(($inl)?'':hsc(ltrim($this->who,'@'))).'" />'.NL; |
||
| 335 | echo '<button type="submit">'.$this->getLang('btn_select').'</button>'.NL; |
||
| 336 | echo '</div>'.NL; |
||
| 337 | |||
| 338 | echo '<div id="acl__info">'; |
||
| 339 | $this->_html_info(); |
||
| 340 | echo '</div>'; |
||
| 341 | |||
| 342 | echo '<input type="hidden" name="ns" value="'.hsc($this->ns).'" />'.NL; |
||
| 343 | echo '<input type="hidden" name="id" value="'.hsc($ID).'" />'.NL; |
||
| 344 | echo '<input type="hidden" name="do" value="admin" />'.NL; |
||
| 345 | echo '<input type="hidden" name="page" value="acl" />'.NL; |
||
| 346 | echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />'.NL; |
||
| 347 | echo '</div></form>'.NL; |
||
| 348 | } |
||
| 349 | |||
| 350 | /** |
||
| 351 | * Print info and editor |
||
| 352 | */ |
||
| 353 | function _html_info(){ |
||
| 375 | |||
| 376 | /** |
||
| 377 | * Display the ACL editor |
||
| 378 | * |
||
| 379 | * @author Andreas Gohr <[email protected]> |
||
| 380 | */ |
||
| 381 | function _html_acleditor($current){ |
||
| 382 | global $lang; |
||
| 383 | |||
| 384 | echo '<fieldset>'; |
||
| 385 | if(is_null($current)){ |
||
| 386 | echo '<legend>'.$this->getLang('acl_new').'</legend>'; |
||
| 387 | }else{ |
||
| 388 | echo '<legend>'.$this->getLang('acl_mod').'</legend>'; |
||
| 389 | } |
||
| 390 | |||
| 391 | echo $this->_html_checkboxes($current,empty($this->ns),'acl'); |
||
| 392 | |||
| 393 | if(is_null($current)){ |
||
| 394 | echo '<button type="submit" name="cmd[save]">'.$lang['btn_save'].'</button>'.NL; |
||
| 395 | }else{ |
||
| 396 | echo '<button type="submit" name="cmd[save]">'.$lang['btn_update'].'</button>'.NL; |
||
| 397 | echo '<button type="submit" name="cmd[del]">'.$lang['btn_delete'].'</button>'.NL; |
||
| 398 | } |
||
| 399 | |||
| 400 | echo '</fieldset>'; |
||
| 401 | } |
||
| 402 | |||
| 403 | /** |
||
| 404 | * Explain the currently set permissions in plain english/$lang |
||
| 405 | * |
||
| 406 | * @author Andreas Gohr <[email protected]> |
||
| 407 | */ |
||
| 408 | function _html_explain($current){ |
||
| 409 | global $ID; |
||
| 410 | global $auth; |
||
| 411 | |||
| 412 | $who = $this->who; |
||
| 413 | $ns = $this->ns; |
||
| 414 | |||
| 415 | // prepare where to check |
||
| 416 | if($ns){ |
||
| 417 | if($ns == '*'){ |
||
| 418 | $check='*'; |
||
| 419 | }else{ |
||
| 420 | $check=$ns.':*'; |
||
| 421 | } |
||
| 422 | }else{ |
||
| 423 | $check = $ID; |
||
| 424 | } |
||
| 425 | |||
| 426 | // prepare who to check |
||
| 427 | if($who{0} == '@'){ |
||
| 428 | $user = ''; |
||
| 429 | $groups = array(ltrim($who,'@')); |
||
| 430 | }else{ |
||
| 431 | $user = $who; |
||
| 432 | $info = $auth->getUserData($user); |
||
| 433 | if($info === false){ |
||
| 434 | $groups = array(); |
||
| 435 | }else{ |
||
| 436 | $groups = $info['grps']; |
||
| 437 | } |
||
| 438 | } |
||
| 439 | |||
| 440 | // check the permissions |
||
| 441 | $perm = auth_aclcheck($check,$user,$groups); |
||
| 442 | |||
| 443 | // build array of named permissions |
||
| 444 | $names = array(); |
||
| 445 | if($perm){ |
||
| 446 | if($ns){ |
||
| 447 | if($perm >= AUTH_DELETE) $names[] = $this->getLang('acl_perm16'); |
||
| 448 | if($perm >= AUTH_UPLOAD) $names[] = $this->getLang('acl_perm8'); |
||
| 449 | if($perm >= AUTH_CREATE) $names[] = $this->getLang('acl_perm4'); |
||
| 450 | } |
||
| 451 | if($perm >= AUTH_EDIT) $names[] = $this->getLang('acl_perm2'); |
||
| 452 | if($perm >= AUTH_READ) $names[] = $this->getLang('acl_perm1'); |
||
| 453 | $names = array_reverse($names); |
||
| 454 | }else{ |
||
| 455 | $names[] = $this->getLang('acl_perm0'); |
||
| 456 | } |
||
| 457 | |||
| 458 | // print permission explanation |
||
| 459 | echo '<p>'; |
||
| 460 | if($user){ |
||
| 461 | if($ns){ |
||
| 462 | printf($this->getLang('p_user_ns'),hsc($who),hsc($ns),join(', ',$names)); |
||
| 463 | }else{ |
||
| 464 | printf($this->getLang('p_user_id'),hsc($who),hsc($ID),join(', ',$names)); |
||
| 465 | } |
||
| 466 | }else{ |
||
| 467 | if($ns){ |
||
| 468 | printf($this->getLang('p_group_ns'),hsc(ltrim($who,'@')),hsc($ns),join(', ',$names)); |
||
| 469 | }else{ |
||
| 470 | printf($this->getLang('p_group_id'),hsc(ltrim($who,'@')),hsc($ID),join(', ',$names)); |
||
| 471 | } |
||
| 472 | } |
||
| 473 | echo '</p>'; |
||
| 474 | |||
| 475 | // add note if admin |
||
| 476 | if($perm == AUTH_ADMIN){ |
||
| 477 | echo '<p>'.$this->getLang('p_isadmin').'</p>'; |
||
| 478 | }elseif(is_null($current)){ |
||
| 479 | echo '<p>'.$this->getLang('p_inherited').'</p>'; |
||
| 480 | } |
||
| 481 | } |
||
| 482 | |||
| 483 | |||
| 484 | /** |
||
| 485 | * Item formatter for the tree view |
||
| 486 | * |
||
| 487 | * User function for html_buildlist() |
||
| 488 | * |
||
| 489 | * @author Andreas Gohr <[email protected]> |
||
| 490 | */ |
||
| 491 | function _html_list_acl($item){ |
||
| 492 | $ret = ''; |
||
| 493 | // what to display |
||
| 494 | if(!empty($item['label'])){ |
||
| 495 | $base = $item['label']; |
||
| 496 | }else{ |
||
| 497 | $base = ':'.$item['id']; |
||
| 498 | $base = substr($base,strrpos($base,':')+1); |
||
| 499 | } |
||
| 500 | |||
| 501 | // highlight? |
||
| 502 | if( ($item['type']== $this->current_item['type'] && $item['id'] == $this->current_item['id'])) { |
||
| 503 | $cl = ' cur'; |
||
| 504 | } else { |
||
| 505 | $cl = ''; |
||
| 506 | } |
||
| 507 | |||
| 508 | // namespace or page? |
||
| 509 | if($item['type']=='d'){ |
||
| 510 | if($item['open']){ |
||
| 511 | $img = DOKU_BASE.'lib/images/minus.gif'; |
||
| 512 | $alt = '−'; |
||
| 513 | }else{ |
||
| 514 | $img = DOKU_BASE.'lib/images/plus.gif'; |
||
| 515 | $alt = '+'; |
||
| 516 | } |
||
| 517 | $ret .= '<img src="'.$img.'" alt="'.$alt.'" />'; |
||
| 518 | $ret .= '<a href="'.wl('',$this->_get_opts(array('ns'=>$item['id'],'sectok'=>getSecurityToken()))).'" class="idx_dir'.$cl.'">'; |
||
| 519 | $ret .= $base; |
||
| 520 | $ret .= '</a>'; |
||
| 521 | }else{ |
||
| 522 | $ret .= '<a href="'.wl('',$this->_get_opts(array('id'=>$item['id'],'ns'=>'','sectok'=>getSecurityToken()))).'" class="wikilink1'.$cl.'">'; |
||
| 523 | $ret .= noNS($item['id']); |
||
| 524 | $ret .= '</a>'; |
||
| 525 | } |
||
| 526 | return $ret; |
||
| 527 | } |
||
| 528 | |||
| 529 | |||
| 530 | function _html_li_acl($item){ |
||
| 534 | |||
| 535 | |||
| 536 | /** |
||
| 537 | * Get current ACL settings as multidim array |
||
| 538 | * |
||
| 539 | * @author Andreas Gohr <[email protected]> |
||
| 540 | */ |
||
| 541 | function _init_acl_config(){ |
||
| 542 | global $AUTH_ACL; |
||
| 543 | global $conf; |
||
| 582 | |||
| 583 | /** |
||
| 584 | * Display all currently set permissions in a table |
||
| 585 | * |
||
| 586 | * @author Andreas Gohr <[email protected]> |
||
| 587 | */ |
||
| 588 | function _html_table(){ |
||
| 651 | |||
| 652 | /** |
||
| 653 | * Returns the permission which were set for exactly the given user/group |
||
| 654 | * and page/namespace. Returns null if no exact match is available |
||
| 655 | * |
||
| 656 | * @author Andreas Gohr <[email protected]> |
||
| 657 | */ |
||
| 658 | function _get_exact_perm(){ |
||
| 676 | |||
| 677 | /** |
||
| 678 | * adds new acl-entry to conf/acl.auth.php |
||
| 679 | * |
||
| 680 | * @author Frank Schubert <[email protected]> |
||
| 681 | */ |
||
| 682 | function _acl_add($acl_scope, $acl_user, $acl_level){ |
||
| 695 | |||
| 696 | /** |
||
| 697 | * remove acl-entry from conf/acl.auth.php |
||
| 698 | * |
||
| 699 | * @author Frank Schubert <[email protected]> |
||
| 700 | */ |
||
| 701 | function _acl_del($acl_scope, $acl_user){ |
||
| 709 | |||
| 710 | /** |
||
| 711 | * print the permission radio boxes |
||
| 712 | * |
||
| 713 | * @author Frank Schubert <[email protected]> |
||
| 714 | * @author Andreas Gohr <[email protected]> |
||
| 715 | */ |
||
| 716 | function _html_checkboxes($setperm,$ispage,$name){ |
||
| 749 | |||
| 750 | /** |
||
| 751 | * Print a user/group selector (reusing already used users and groups) |
||
| 752 | * |
||
| 753 | * @author Andreas Gohr <[email protected]> |
||
| 754 | */ |
||
| 755 | function _html_select(){ |
||
| 815 | } |
||
| 816 |
Adding explicit visibility (
private,protected, orpublic) is generally recommend to communicate to other developers how, and from where this method is intended to be used.