ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilDidacticTemplateLocalPolicyAction.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once './Services/DidacticTemplate/classes/class.ilDidacticTemplateAction.php';
5
13{
16 const TPL_ACTION_ADD = 3;
19
20
21 private $pattern = array();
24 private $role_template_id = 0;
25
26
31 public function __construct($action_id = 0)
32 {
33 parent::__construct($action_id);
34 }
35
41 {
42 $this->pattern[] = $pattern;
43 }
44
49 public function setFilterPatterns(Array $patterns)
50 {
51 $this->pattern = $patterns;
52 }
53
58 public function getFilterPattern()
59 {
60 return $this->pattern;
61 }
62
67 public function setFilterType($a_type)
68 {
69 $this->filter_type = $a_type;
70 }
71
76 public function getFilterType()
77 {
78 return $this->filter_type;
79 }
80
85 public function setRoleTemplateType($a_tpl_type)
86 {
87 $this->role_template_type = $a_tpl_type;
88 }
89
93 public function getRoleTemplateType()
94 {
96 }
97
102 public function setRoleTemplateId($a_id)
103 {
104 $this->role_template_id = $a_id;
105 }
106
111 public function getRoleTemplateId()
112 {
114 }
115
119 public function save()
120 {
121 global $ilDB;
122
123 parent::save();
124
125 $query = 'INSERT INTO didactic_tpl_alp (action_id,filter_type,template_type,template_id) '.
126 'VALUES( '.
127 $ilDB->quote($this->getActionId(),'integer').', '.
128 $ilDB->quote($this->getFilterType(),'integer').', '.
129 $ilDB->quote($this->getRoleTemplateType(),'integer').', '.
130 $ilDB->quote($this->getRoleTemplateId(),'integer').' '.
131 ')';
132 $ilDB->manipulate($query);
133
134 foreach($this->getFilterPattern() as $pattern)
135 {
136 /* @var ilDidacticTemplateFilterPattern $pattern */
137 $pattern->setParentId($this->getActionId());
138 $pattern->setParentType(self::PATTERN_PARENT_TYPE);
139 $pattern->save();
140 }
141 }
142
148 public function delete()
149 {
150 global $ilDB;
151
152 parent::delete();
153
154 $query = 'DELETE FROM didactic_tpl_alp '.
155 'WHERE action_id = '.$ilDB->quote($this->getActionId(),'integer');
156 $ilDB->manipulate($query);
157
158 foreach($this->getFilterPattern() as $pattern)
159 {
160 $pattern->delete();
161 }
162 return true;
163 }
164
165
166
167
171 public function apply()
172 {
173 global $rbacreview;
174
175 $source = $this->initSourceObject();
176 // Create a role folder for the new local policies
177
178 $roles = $this->filterRoles($source);
179
180 // Create local policy for filtered roles
181 foreach($roles as $role_id => $role)
182 {
183 // No local policies for protected roles of higher context
184 if($role['protected'] and $role['parent'] != $source->getRefId())
185 {
186 continue;
187 }
188 $this->createLocalPolicy($source,$role);
189 }
190 return true;
191 }
192
198 public function revert()
199 {
200 global $rbacreview,$rbacadmin,$tree;
201
202 $source = $this->initSourceObject();
203 $roles = $this->filterRoles($source);
204
205 // Delete local policy for filtered roles
206 foreach($roles as $role_id => $role)
207 {
208 // Do not delete local roles of auto genrated roles
209 if(!$rbacreview->isGlobalRole($role['obj_id']) and
210 $rbacreview->isAssignable($role['obj_id'],$source->getRefId()) and
211 $rbacreview->isSystemGeneratedRole($role['obj_id']))
212 {
213 $this->revertLocalPolicy($source, $role);
214 }
215 else
216 {
217 // delete local role and change exiting objects
218 $rbacadmin->deleteLocalRole($role_id,$source->getRefId());
219 // Change existing object
220 include_once './Services/AccessControl/classes/class.ilObjRole.php';
221 $role_obj = new ilObjRole($role_id);
222 $role_obj->changeExistingObjects(
223 $source->getRefId(),
224 $role['protected'] ?
227 array('all')
228 );
229 }
230
231 }
232 return true;
233 }
234
239 public function getType()
240 {
242 }
243
249 public function toXml(ilXmlWriter $writer)
250 {
251 $writer->xmlStartTag('localPolicyAction');
252
253 switch($this->getFilterType())
254 {
256 $writer->xmlStartTag('roleFilter',array('source' => 'title'));
257 break;
258
260 $writer->xmlStartTag('roleFilter',array('source' => 'objId'));
261 break;
262
263 }
264
265 foreach($this->getFilterPattern() as $pattern)
266 {
267 $pattern->toXml($writer);
268 }
269 $writer->xmlEndTag('roleFilter');
270
271 $il_role_id = 'il_'.IL_INST_ID.'_'.ilObject::_lookupType($this->getRoleTemplateId()).'_'.$this->getRoleTemplateId();
272
273 switch($this->getRoleTemplateType())
274 {
276 $writer->xmlStartTag(
277 'localPolicyTemplate',
278 array(
279 'type' => 'overwrite',
280 'id' => $il_role_id
281 )
282 );
283 break;
284
286 $writer->xmlStartTag(
287 'localPolicyTemplate',
288 array(
289 'type' => 'intersect',
290 'id' => $il_role_id
291 )
292 );
293 break;
294
296 $writer->xmlStartTag(
297 'localPolicyTemplate',
298 array(
299 'type' => 'union',
300 'id' => $il_role_id
301 )
302 );
303 break;
304 }
305
306 include_once './Services/AccessControl/classes/class.ilRoleXmlExport.php';
307 $exp = new ilRoleXmlExport();
308 $exp->setMode(ilRoleXmlExport::MODE_DTPL);
309 $exp->addRole($this->getRoleTemplateId(), ROLE_FOLDER_ID);
310 $exp->write();
311 $writer->appendXML($exp->xmlDumpMem(FALSE));
312 $writer->xmlEndTag('localPolicyTemplate');
313 $writer->xmlEndTag('localPolicyAction');
314 return void;
315 }
316
320 public function __clone()
321 {
322 parent::__clone();
323
324 // Clone patterns
325 $cloned = array();
326 foreach($this->getFilterPattern() as $pattern)
327 {
328 $clones[] = clone $pattern;
329 }
330 $this->setFilterPatterns($clones);
331 }
332
333 public function read()
334 {
335 global $ilDB;
336
337 if(!parent::read())
338 {
339 return false;
340 }
341
342 $query = 'SELECT * FROM didactic_tpl_alp '.
343 'WHERE action_id = '.$ilDB->quote($this->getActionId());
344 $res = $ilDB->query($query);
345 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
346 {
347 $this->setFilterType($row->filter_type);
348 $this->setRoleTemplateType($row->template_type);
349 $this->setRoleTemplateId($row->template_id);
350 }
351
352 // Read filter
353 include_once './Services/DidacticTemplate/classes/class.ilDidacticTemplateFilterPatternFactory.php';
355 {
356 $this->addFilterPattern($pattern);
357 }
358 }
359
360
367 protected function createLocalPolicy(ilObject $source, $role)
368 {
369 global $rbacreview, $rbacadmin;
370
371 // Add local policy
372 if(!$rbacreview->isRoleAssignedToObject($role['obj_id'],$source->getRefId()))
373 {
374 $rbacadmin->assignRoleToFolder($role['obj_id'],$source->getRefId(),'n');
375 }
376
377 switch($this->getRoleTemplateType())
378 {
380
381 ilLoggerFactory::getLogger('otpl')->info('Using ilRbacAdmin::copyRolePermissionUnion()');
382 $rbacadmin->copyRolePermissionUnion(
383 $role['obj_id'],
384 $role['parent'],
385 $this->getRoleTemplateId(),
386 ROLE_FOLDER_ID,
387 $role['obj_id'],
388 $source->getRefId()
389 );
390 break;
391
393
394 ilLoggerFactory::getLogger('otpl')->info('Using ilRbacAdmin::copyRoleTemplatePermission()');
395 $rbacadmin->copyRoleTemplatePermissions(
396 $this->getRoleTemplateId(),
397 ROLE_FOLDER_ID,
398 $source->getRefId(),
399 $role['obj_id'],
400 true
401 );
402 break;
403
405
406 ilLoggerFactory::getLogger('otpl')->info('Using ilRbacAdmin::copyRolePermissionIntersection()');
407 $rbacadmin->copyRolePermissionIntersection(
408 $role['obj_id'],
409 $role['parent'],
410 $this->getRoleTemplateId(),
411 ROLE_FOLDER_ID,
412 $source->getRefId(),
413 $role['obj_id']
414 );
415 break;
416
417 }
418
419 // Change existing object
420 include_once './Services/AccessControl/classes/class.ilObjRole.php';
421 $role_obj = new ilObjRole($role['obj_id']);
422 $role_obj->changeExistingObjects(
423 $source->getRefId(),
425 array('all')
426 );
427
428 return true;
429 }
430
431 protected function revertLocalPolicy(ilObject $source, $role)
432 {
433 global $rbacadmin, $rbacreview, $ilDB;
434
435 ilLoggerFactory::getLogger('otpl')->info('Reverting policy for role '. $role['title']);
436 // Local policies can only be reverted for auto generated roles. Otherwise the
437 // original role settings are unknown
438 if(substr($role['title'],0,3) != 'il_')
439 {
440 ilLoggerFactory::getLogger('otpl')->warning('Cannot revert local policy for role '. $role['title']);
441 return false;
442 }
443
444
445 // No local policies
446 if(!$rbacreview->getLocalPolicies($source->getRefId()))
447 {
448 return false;
449 }
450
451 $exploded_title = explode('_',$role['title']);
452 $rolt_title = $exploded_title[0].'_'.$exploded_title[1].'_'.$exploded_title[2];
453
454 // Lookup role template
455 $query = 'SELECT obj_id FROM object_data '.
456 'WHERE title = '.$ilDB->quote($rolt_title,'text').' '.
457 'AND type = '.$ilDB->quote('rolt','text');
458 $res = $ilDB->query($query);
459 while($row = $res->fetchRow(DB_FETCHMODE_OBJECT))
460 {
461 $rolt_id = $row->obj_id;
462 }
463
464 // No template found
465 if(!$rolt_id)
466 {
467 return false;
468 }
469
470 $rbacadmin->copyRoleTemplatePermissions(
471 $rolt_id,
472 ROLE_FOLDER_ID,
473 $source->getRefId(),
474 $role['obj_id'],
475 true
476 );
477
478 // Change existing object
479 include_once './Services/AccessControl/classes/class.ilObjRole.php';
480 $role_obj = new ilObjRole($role['obj_id']);
481 $role_obj->changeExistingObjects(
482 $source->getRefId(),
484 array('all')
485 );
486 }
487}
488?>
const DB_FETCHMODE_OBJECT
Definition: class.ilDB.php:11
Abstract class for template actions.
initSourceObject()
Init the source object.
filterRoles(ilObject $source)
Filter roles.
static lookupPatternsByParentId($a_parent_id, $a_parent_type)
Get patterns by template id.
Represents a filter pattern for didactic template actions.
createLocalPolicy(ilObject $source, $role)
Create local policy.
addFilterPattern(ilDidacticTemplateFilterPattern $pattern)
Add filter.
static getLogger($a_component_id)
Get component logger.
Class ilObjRole.
const MODE_PROTECTED_DELETE_LOCAL_POLICIES
const MODE_UNPROTECTED_DELETE_LOCAL_POLICIES
Class ilObject Basic functions for all objects.
getRefId()
get reference id @access public
static _lookupType($a_id, $a_reference=false)
lookup object type
Xml export of roles and role templates.
XML writer class.
xmlEndTag($tag)
Writes an endtag.
xmlStartTag($tag, $attrs=NULL, $empty=FALSE, $encode=TRUE, $escape=TRUE)
Writes a starttag.
appendXML($a_str)
append xml string to document
global $ilDB