ILIAS  release_5-2 Revision v5.2.25-18-g3f80b828510
class.ilObjectRolePermissionTableGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once ('./Services/Table/classes/class.ilTable2GUI.php');
5include_once './Services/AccessControl/classes/class.ilPermissionGUI.php';
6require_once('./Services/Repository/classes/class.ilObjectPlugin.php');
7
18{
19 const ROLE_FILTER_ALL = 1;
24
25 private $ref_id = null;
26 private $roles = array();
27
28 private $tree_path_ids = array();
29
30 private $activeOperations = array();
31 private $visible_roles = array();
32
37 public function __construct($a_parent_obj,$a_parent_cmd, $a_ref_id)
38 {
39 global $ilCtrl,$rbacreview,$tpl,$tree;
40
41 parent::__construct($a_parent_obj,$a_parent_cmd);
42
43 $this->lng->loadLanguageModule('rbac');
44
45 $this->ref_id = $a_ref_id;
46 $this->tree_path_ids = $tree->getPathId($this->ref_id);
47
48 $this->setId('objroleperm_'.$this->ref_id);
49
50 $tpl->addJavaScript('./Services/AccessControl/js/ilPermSelect.js');
51
52 $this->setTitle($this->lng->txt('permission_settings'));
53 $this->setEnableHeader(true);
54 $this->disable('sort');
55 $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, $a_parent_cmd));
56 $this->disable('numinfo');
57 $this->setRowTemplate("tpl.obj_role_perm_row.html", "Services/AccessControl");
58 $this->setLimit(100);
59 $this->setShowRowsSelector(false);
60 $this->setDisableFilterHiding(true);
61 $this->setNoEntriesText($this->lng->txt('msg_no_roles_of_type'));
62
63 $this->addCommandButton('savePermissions', $this->lng->txt('save'));
64
65 $this->initFilter();
66 }
67
68
73 public function getPathIds()
74 {
75 return (array) $this->tree_path_ids;
76 }
77
82 public function getRefId()
83 {
84 return $this->ref_id;
85 }
86
91 public function getObjId()
92 {
93 return ilObject::_lookupObjId($this->getRefId());
94 }
95
100 public function getObjType()
101 {
102 return ilObject::_lookupType($this->getObjId());
103 }
104
110 public function addActiveOperation($a_ops_id)
111 {
112 $this->activeOperations[] = $a_ops_id;
113 }
114
119 public function getActiveOperations()
120 {
121 return (array) $this->activeOperations;
122 }
123
129 public function setVisibleRoles($a_ar)
130 {
131 $this->visible_roles = $a_ar;
132 }
133
138 public function getVisibleRoles()
139 {
141 }
142
147 public function initFilter()
148 {
149 global $tree;
150
152 'role',
154 );
155
156 // Limit filter to local roles only for objects with group or course in path
157 if(!$roles->getValue())
158 {
159 if ($tree->checkForParentType($this->getRefId(), 'crs') or
160 $tree->checkForParentType($this->getRefId(), 'grp'))
161 {
162 $roles->setValue(self::ROLE_FILTER_LOCAL);
163 }
164 else
165 {
166 $roles->setValue(self::ROLE_FILTER_ALL);
167 }
168 }
169
170
171 $roles->setOptions(
172 array(
173 self::ROLE_FILTER_ALL => $this->lng->txt('filter_all_roles'),
174 self::ROLE_FILTER_GLOBAL => $this->lng->txt('filter_global_roles'),
175 self::ROLE_FILTER_LOCAL => $this->lng->txt('filter_local_roles'),
176 self::ROLE_FILTER_LOCAL_POLICY => $this->lng->txt('filter_roles_local_policy'),
177 self::ROLE_FILTER_LOCAL_OBJECT => $this->lng->txt('filter_local_roles_object')
178 )
179 );
180
181 }
182
188 public function fillRow($row)
189 {
190 global $objDefinition;
191
192
193 // local policy
194 if(isset($row['show_local_policy_row']))
195 {
196 foreach($row['roles'] as $role_id => $role_info)
197 {
198 $this->tpl->setCurrentBlock('role_option');
199 $this->tpl->setVariable('INHERIT_ROLE_ID',$role_id);
200 $this->tpl->setVariable('INHERIT_CHECKED',$role_info['local_policy'] ? 'checked=checked' : '');
201 $this->tpl->setVariable('INHERIT_DISABLED',($role_info['protected'] or $role_info['isLocal'] or $role_info['blocked']) ? 'disabled="disabled"' : '');
202 $this->tpl->setVariable('TXT_INHERIT',$this->lng->txt('rbac_local_policy'));
203 $this->tpl->setVariable('INHERIT_LONG',$this->lng->txt('perm_use_local_policy_desc'));
204 $this->tpl->parseCurrentBlock();
205 }
206 return true;
207 }
208 // protected
209 if(isset($row['show_protected_row']))
210 {
211 foreach($row['roles'] as $role_id => $role_info)
212 {
213 $this->tpl->setCurrentBlock('role_protect');
214 $this->tpl->setVariable('PROTECT_ROLE_ID',$role_id);
215 $this->tpl->setVariable('PROTECT_CHECKED',$role_info['protected_status'] ? 'checked=checked' : '');
216 $this->tpl->setVariable('PROTECT_DISABLED',$role_info['protected_allowed'] ? '' : 'disabled="disabled"');
217 $this->tpl->setVariable('TXT_PROTECT',$this->lng->txt('role_protect_permissions'));
218 $this->tpl->setVariable('PROTECT_LONG',$this->lng->txt('role_protect_permissions_desc'));
219 $this->tpl->parseCurrentBlock();
220 }
221 return true;
222 }
223
224 // block role
225 if(isset($row['show_block_row']))
226 {
227 foreach($this->getVisibleRoles() as $counter => $role_info)
228 {
229 $this->tpl->setCurrentBlock('role_block');
230 $this->tpl->setVariable('BLOCK_ROLE_ID',$role_info['obj_id']);
231 $this->tpl->setVariable('TXT_BLOCK',$this->lng->txt('role_block_role'));
232 $this->tpl->setVariable('BLOCK_LONG',$this->lng->txt('role_block_role_desc'));
233 if($role_info['blocked'])
234 {
235 $this->tpl->setVariable('BLOCK_CHECKED','checked="checked"');
236 }
237 if(
238 ($role_info['protected'] == 'y') ||
239 ($role_info['assign'] == 'y' and ($role_info['parent'] == $this->getRefId()))
240 )
241 {
242 $this->tpl->setVariable('BLOCK_DISABLED','disabled="disabled');
243 }
244
245 $this->tpl->parseCurrentBlock();
246 }
247 return true;
248 }
249
250 // Select all
251 if(isset($row['show_select_all']))
252 {
253 foreach($this->getVisibleRoles() as $role)
254 {
255 $this->tpl->setCurrentBlock('role_select_all');
256 $this->tpl->setVariable('JS_ROLE_ID',$role['obj_id']);
257 $this->tpl->setVariable('JS_SUBID',$row['subtype']);
258 $this->tpl->setVariable('JS_ALL_PERMS',"['".implode("','",$row['ops'])."']");
259 $this->tpl->setVariable('JS_FORM_NAME',$this->getFormName());
260 $this->tpl->setVariable('TXT_SEL_ALL',$this->lng->txt('select_all'));
261 $this->tpl->parseCurrentBlock();
262 }
263 return true;
264 }
265
266 // Object permissions
267 if(isset($row['show_start_info']))
268 {
269 $this->tpl->setCurrentBlock('section_info');
270 $this->tpl->setVariable('SECTION_TITLE',$this->lng->txt('perm_class_object'));
271 $this->tpl->setVariable('SECTION_DESC',$this->lng->txt('perm_class_object_desc'));
272 $this->tpl->parseCurrentBlock();
273
274 return true;
275 }
276
277 if(isset($row['show_create_info']))
278 {
279 $this->tpl->setCurrentBlock('section_info');
280 $this->tpl->setVariable('SECTION_TITLE',$this->lng->txt('perm_class_create'));
281 $this->tpl->setVariable('SECTION_DESC',$this->lng->txt('perm_class_create_desc'));
282 $this->tpl->parseCurrentBlock();
283
284 return true;
285 }
286
287 foreach((array) $row['roles'] as $role_id => $role_info)
288 {
289 $this->tpl->setCurrentBlock('role_td');
290 $this->tpl->setVariable('PERM_ROLE_ID',$role_id);
291 $this->tpl->setVariable('PERM_PERM_ID',$row['perm']['ops_id']);
292
293
294 if(substr($row['perm']['operation'],0,6) == 'create')
295 {
296 if ($objDefinition->isPlugin(substr($row['perm']['operation'],7)))
297 {
298 $perm = ilObjectPlugin::lookupTxtById(substr($row['perm']['operation'],7),
299 "obj_".substr($row['perm']['operation'],7));
300 }
301 else
302 {
303 $perm = $this->lng->txt('obj_'.substr($row['perm']['operation'],7));
304 }
305 }
306 else
307 {
308 if($this->lng->exists($this->getObjType().'_'.$row['perm']['operation'].'_short'))
309 {
310 $perm = $this->lng->txt($this->getObjType().'_'.$row['perm']['operation'].'_short');
311 }
312 else
313 {
314 $perm = $this->lng->txt($row['perm']['operation']);
315 }
316 }
317
318 $this->tpl->setVariable('TXT_PERM',$perm);
319
320 if ($objDefinition->isPlugin($this->getObjType()))
321 {
322 $this->tpl->setVariable('PERM_LONG',ilObjectPlugin::lookupTxtById($this->getObjType(),
323 $this->getObjType()."_".$row['perm']['operation']));
324 }
325 elseif(substr($row['perm']['operation'],0,6) == 'create')
326 {
327 $this->tpl->setVariable('PERM_LONG',$this->lng->txt('rbac_'.$row['perm']['operation']));
328 }
329 else
330 {
331 $this->tpl->setVariable('PERM_LONG',$this->lng->txt($this->getObjType().'_'.$row['perm']['operation']));
332 }
333
334 if($role_info['protected'] || $role_info['blocked'])
335 {
336 $this->tpl->setVariable('PERM_DISABLED','disabled="disabled"');
337 }
338 if($role_info['permission_set'])
339 {
340 $this->tpl->setVariable('PERM_CHECKED','checked="checked"');
341 }
342
343 $this->tpl->parseCurrentBlock();
344 }
345 }
346
347
352 public function parse()
353 {
354 global $rbacreview,$objDefinition;
355
356 $this->initColumns();
357
358 $perms = array();
359 $roles = array();
360
361 if(!count($this->getVisibleRoles()))
362 {
363 return $this->setData(array());
364 }
365
366 // Read operations of role
367 $operations = array();
368 foreach($this->getVisibleRoles() as $role_data)
369 {
370 $operations[$role_data['obj_id']] = $rbacreview->getActiveOperationsOfRole($this->getRefId(), $role_data['obj_id']);
371 }
372
373 $counter = 0;
374
375 // Local policy
377 {
378 $roles = array();
379 $local_roles = $rbacreview->getRolesOfObject($this->getRefId());
380 foreach($this->getVisibleRoles() as $role_id => $role_data)
381 {
382 $roles[$role_data['obj_id']] = array(
383 'blocked' => $role_data['blocked'],
384 'protected' => $role_data['protected'],
385 'local_policy' => in_array($role_data['obj_id'],$local_roles),
386 'isLocal' => ($this->getRefId() == $role_data['parent']) && $role_data['assign'] == 'y'
387 );
388 }
389 $perms[$counter]['roles'] = $roles;
390 $perms[$counter]['show_local_policy_row'] = 1;
391
392 $counter++;
393 }
394
395 // Protect permissions
397 {
398 $roles = array();
399 foreach($this->getVisibleRoles() as $role_id => $role_data)
400 {
401 $roles[$role_data['obj_id']] = array(
402 'blocked' => $role_data['blocked'],
403 'protected_allowed' => $rbacreview->isAssignable($role_data['obj_id'],$this->getRefId()),
404 'protected_status' => $rbacreview->isProtected($role_data['parent'], $role_data['obj_id']),
405 'isLocal' => ($this->getRefId() == $role_data['parent']) && $role_data['assign'] == 'y'
406 );
407 }
408 $perms[$counter]['roles'] = $roles;
409 $perms[$counter]['show_protected_row'] = 1;
410
411 $counter++;
412 }
413 // Block role
415 {
416 $perms[$counter++]['show_block_row'] = 1;
417 }
418
419
421 {
422 $perms[$counter++]['show_start_info'] = true;
423 }
424
425 // no creation permissions
426 $no_creation_operations = array();
427 foreach($rbacreview->getOperationsByTypeAndClass($this->getObjType(),'object') as $operation)
428 {
429 $this->addActiveOperation($operation);
430 $no_creation_operations[] = $operation;
431
432 $roles = array();
433 foreach($this->getVisibleRoles() as $role_data)
434 {
435 $roles[$role_data['obj_id']] =
436 array(
437 'blocked' => $role_data['blocked'],
438 'protected' => $role_data['protected'],
439 'permission_set' => in_array($operation,(array) $operations[$role_data['obj_id']]),
440 'isLocal' => ($this->getRefId() == $role_data['parent']) && $role_data['assign'] == 'y'
441 );
442 }
443
444 $op = $rbacreview->getOperation($operation);
445
446 $perms[$counter]['roles'] = $roles;
447 $perms[$counter]['perm'] = $op;
448 $counter++;
449
450 }
451
452 /*
453 * Select all
454 */
455 if($no_creation_operations)
456 {
457 $perms[$counter]['show_select_all'] = 1;
458 $perms[$counter]['ops'] = $no_creation_operations;
459 $perms[$counter]['subtype'] = 'nocreation';
460 $counter++;
461 }
462
463
464 if($objDefinition->isContainer($this->getObjType()))
465 {
466 $perms[$counter++]['show_create_info'] = true;
467 }
468
469 // Get creatable objects
470 $objects = $objDefinition->getCreatableSubObjects($this->getObjType());
471 $ops_ids = ilRbacReview::lookupCreateOperationIds(array_keys($objects));
472 $creation_operations = array();
473 foreach($objects as $type => $info)
474 {
475 $ops_id = $ops_ids[$type];
476
477 if(!$ops_id)
478 {
479 continue;
480 }
481
482 $this->addActiveOperation($ops_id);
483 $creation_operations[] = $ops_id;
484
485 $roles = array();
486 foreach($this->getVisibleRoles() as $role_data)
487 {
488 $roles[$role_data['obj_id']] =
489 array(
490 'blocked' => $role_data['blocked'],
491 'protected' => $role_data['protected'],
492 'permission_set' => in_array($ops_id,(array) $operations[$role_data['obj_id']]),
493 'isLocal' => ($this->getRefId() == $role_data['parent']) && $role_data['assign'] == 'y'
494
495 );
496 }
497
498 $op = $rbacreview->getOperation($ops_id);
499
500 $perms[$counter]['roles'] = $roles;
501 $perms[$counter]['perm'] = $op;
502 $counter++;
503
504 }
505
506
507
508 // Select all
509 if(count($creation_operations))
510 {
511 $perms[$counter]['show_select_all'] = 1;
512 $perms[$counter]['ops'] = $creation_operations;
513 $perms[$counter]['subtype'] = 'creation';
514 $counter++;
515 }
516
517 $this->setData($perms);
518 }
519
524 protected function initColumns()
525 {
526 global $rbacreview,$ilCtrl;
527
528 $roles = $rbacreview->getParentRoleIds($this->getRefId());
529 $roles = $this->getParentObject()->applyRoleFilter(
530 $roles,
531 $this->getFilterItemByPostVar('role')->getValue()
532 );
533
534 $possible_roles = array();
535 foreach($roles as $role)
536 {
537 if($rbacreview->isBlockedInUpperContext($role['obj_id'],$this->getRefId()))
538 {
539 ilLoggerFactory::getLogger('ac')->debug('Ignoring blocked role: ' . $role['obj_id']);
540 continue;
541 }
542 $possible_roles[] = $role;
543 }
544
545
546 if(count($possible_roles))
547 {
548 $column_width = 100/count($possible_roles);
549 $column_width .= '%';
550 }
551 else
552 {
553 $column_widht = "0%";
554 }
555
556 $all_roles = array();
557 foreach($possible_roles as $role)
558 {
559 if($role['obj_id'] == SYSTEM_ROLE_ID)
560 {
561 continue;
562 }
563
564 $role['blocked'] = (bool) $rbacreview->isBlockedAtPosition($role['obj_id'],$this->getRefId());
565 $role['role_type'] = $rbacreview->isGlobalRole($role['obj_id']) ? 'global' : 'local';
566
567 // TODO check filter
568 $this->addColumn(
569 $this->createTitle($role),
570 $role['obj_id'],
571 '',
572 '',
573 false,
574 $this->createTooltip($role)
575 );
576 $all_roles[] = $role;
577 }
578
579 $this->setVisibleRoles($all_roles);
580 return true;
581 }
582
588 protected function createTooltip($role)
589 {
590 global $rbacreview,$tree;
591
592 #vd($role);
593 $protected_status = $rbacreview->isProtected($role['parent'], $role['obj_id']) ? 'protected_' : '';
594 if($role['role_type'] == 'global')
595 {
596 $tp = $this->lng->txt('perm_'.$protected_status.'global_role');
597 }
598 else
599 {
600 $tp = $this->lng->txt('perm_'.$protected_status.'local_role');
601 }
602
603 $inheritance_seperator = ': ';
604
605 // Show create at info
606 if(
607 ($role['assign'] == 'y' and $role['role_type'] != 'global') or
608 ($role['assign'] == 'n' and $role['role_type'] != 'global')
609 )
610 {
611 $tp .= ': ';
612
613 $obj = $rbacreview->getObjectOfRole($role['obj_id']);
614 if($obj)
615 {
616 $tp .= sprintf(
617 $this->lng->txt('perm_role_path_info_created'),
618 $this->lng->txt('obj_'.ilObject::_lookupType($obj)),ilObject::_lookupTitle($obj)
619 );
620 $inheritance_seperator = ', ';
621 }
622 }
623
624 $path_hierarchy = $rbacreview->getObjectsWithStopedInheritance(
625 $role['obj_id'],
626 $tree->getPathId($this->getRefId())
627 );
628
629 $reduced_path_hierarchy = (array) array_diff(
630 $path_hierarchy,
631 array(
632 $this->getRefId(),
633 $rbacreview->getObjectReferenceOfRole($role['obj_id'])
634 )
635 );
636
637
638 // Inheritance
639 if($role['assign'] == 'n' and count($reduced_path_hierarchy))
640 {
641 $tp .= $inheritance_seperator;
642
643 $parent = end($reduced_path_hierarchy);
646 $tp .= sprintf($this->lng->txt('perm_role_path_info_inheritance'),$this->lng->txt('obj_'.$p_type),$p_title);
647 }
648
649 return $tp;
650 }
651
657 protected function createTitle($role)
658 {
659 global $ilCtrl;
660
661 include_once './Services/AccessControl/classes/class.ilObjRole.php';
662 $role['title'] = ilObjRole::_getTranslation($role['title']);
663
664 // No local policies
665 if($role['parent'] != $this->getRefId())
666 {
667 return $role['title'];
668 }
669 if($role['blocked'])
670 {
671 return $role['title'];
672 }
673 $ilCtrl->setParameterByClass('ilobjrolegui', 'obj_id', $role['obj_id']);
674
675 return '<a class="tblheader" href="'.$ilCtrl->getLinkTargetByClass('ilobjrolegui','').'" >'.$role['title'].'</a>';
676 }
677}
678?>
sprintf('%.4f', $callTime)
global $tpl
Definition: ilias.php:8
An exception for terminatinating execution or to throw for unit testing.
static getLogger($a_component_id)
Get component logger.
static _getTranslation($a_role_title)
static lookupTxtById($plugin_id, $lang_var)
__construct($a_parent_obj, $a_parent_cmd, $a_ref_id)
Constructor.
addActiveOperation($a_ops_id)
Add active operation.
createTooltip($role)
Create a linked title for roles with local policy.
static _lookupObjId($a_id)
static _lookupTitle($a_id)
lookup object title
static _lookupType($a_id, $a_reference=false)
lookup object type
static hasContainerCommands($a_type)
Check if container commands are possible for the current object type.
static lookupCreateOperationIds($a_type_arr)
Lookup operation ids.
Class ilTable2GUI.
getFormName()
Get Form name.
setEnableHeader($a_enableheader)
Set Enable Header.
setDisableFilterHiding($a_val=true)
Set disable filter hiding.
addColumn($a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="", $a_tooltip_with_html=false)
Add a column to the header.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
getParentObject()
Get parent object.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
setNoEntriesText($a_text)
Set text for an empty table.
setData($a_data)
set table data @access public
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setLimit($a_limit=0, $a_default_limit=0)
set max.
getFilterItemByPostVar($a_post_var)
setId($a_val)
Set id.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
addFilterItemByMetaType($id, $type=self::FILTER_TEXT, $a_optional=false, $caption=NULL)
Add filter by standard type.
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
disable($a_module_name)
diesables particular modules of table
$counter
$info
Definition: example_052.php:80
global $ilCtrl
Definition: ilias.php:18