ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilObjCourseAccess.php
Go to the documentation of this file.
1<?php
2
3/* Copyright (c) 1998-2011 ILIAS open source, Extended GPL, see docs/LICENSE */
4
5include_once("./Services/Object/classes/class.ilObjectAccess.php");
6include_once './Modules/Course/classes/class.ilCourseConstants.php';
7include_once 'Modules/Course/classes/class.ilCourseParticipants.php';
8include_once 'Modules/Course/classes/class.ilCourseParticipant.php';
9include_once './Services/Conditions/interfaces/interface.ilConditionHandling.php';
10
20{
21 protected static $using_code = false;
22
26 public static function getConditionOperators()
27 {
28 include_once './Services/Conditions/classes/class.ilConditionHandler.php';
29 return array(
31 );
32 }
33
43 public static function checkCondition($a_obj_id, $a_operator, $a_value, $a_usr_id)
44 {
45 include_once "./Modules/Course/classes/class.ilCourseParticipants.php";
46 include_once './Services/Conditions/classes/class.ilConditionHandler.php';
47
48 switch ($a_operator) {
50 return ilCourseParticipants::_hasPassed($a_obj_id, $a_usr_id);
51 }
52 return false;
53 }
54
67 public function _checkAccess($a_cmd, $a_permission, $a_ref_id, $a_obj_id, $a_user_id = "")
68 {
69 global $DIC;
70
71 $ilUser = $DIC['ilUser'];
72 $lng = $DIC['lng'];
73 $rbacsystem = $DIC['rbacsystem'];
74 $ilAccess = $DIC['ilAccess'];
75 $ilias = $DIC['ilias'];
76
77 if ($a_user_id == "") {
78 $a_user_id = $ilUser->getId();
79 }
80
81 if ($ilUser->getId() == $a_user_id) {
82 $participants = ilCourseParticipant::_getInstanceByObjId($a_obj_id, $a_user_id);
83 } else {
84 $participants = ilCourseParticipants::_getInstanceByObjId($a_obj_id);
85 }
86
87
88 switch ($a_cmd) {
89 case "view":
90 if ($participants->isBlocked($a_user_id) and $participants->isAssigned($a_user_id)) {
91 $ilAccess->addInfoItem(IL_NO_OBJECT_ACCESS, $lng->txt("crs_status_blocked"));
92 return false;
93 }
94 break;
95
96 case 'leave':
97
98 // Regular member
99 if ($a_permission == 'leave') {
100 include_once './Modules/Course/classes/class.ilObjCourse.php';
101 $limit = null;
102 if (!ilObjCourse::mayLeave($a_obj_id, $a_user_id, $limit)) {
103 $ilAccess->addInfoItem(
105 sprintf($lng->txt("crs_cancellation_end_rbac_info"), ilDatePresentation::formatDate($limit))
106 );
107 return false;
108 }
109
110 include_once './Modules/Course/classes/class.ilCourseParticipants.php';
111 if (!$participants->isAssigned($a_user_id)) {
112 return false;
113 }
114 }
115 // Waiting list
116 if ($a_permission == 'join') {
117 include_once './Modules/Course/classes/class.ilCourseWaitingList.php';
118 if (!ilCourseWaitingList::_isOnList($a_user_id, $a_obj_id)) {
119 return false;
120 }
121 return true;
122 }
123 break;
124
125 case 'join':
126
127 include_once './Modules/Course/classes/class.ilCourseWaitingList.php';
128 if (ilCourseWaitingList::_isOnList($a_user_id, $a_obj_id)) {
129 return false;
130 }
131 break;
132 }
133
134 switch ($a_permission) {
135 case 'visible':
136 $visible = null;
137 $active = self::_isActivated($a_obj_id, $visible);
138 $tutor = $rbacsystem->checkAccessOfUser($a_user_id, 'write', $a_ref_id);
139 if (!$active) {
140 $ilAccess->addInfoItem(IL_NO_OBJECT_ACCESS, $lng->txt("offline"));
141 }
142 if (!$tutor && !$active && !$visible) {
143 return false;
144 }
145 break;
146
147 case 'read':
148 $tutor = $rbacsystem->checkAccessOfUser($a_user_id, 'write', $a_ref_id);
149 if ($tutor) {
150 return true;
151 }
152 $active = self::_isActivated($a_obj_id);
153 if (!$active) {
154 $ilAccess->addInfoItem(IL_NO_OBJECT_ACCESS, $lng->txt("offline"));
155 return false;
156 }
157 if ($participants->isBlocked($a_user_id) and $participants->isAssigned($a_user_id)) {
158 $ilAccess->addInfoItem(IL_NO_OBJECT_ACCESS, $lng->txt("crs_status_blocked"));
159 return false;
160 }
161 break;
162
163 case 'join':
164 if (!self::_registrationEnabled($a_obj_id)) {
165 return false;
166 }
167
168 if ($participants->isAssigned($a_user_id)) {
169 return false;
170 }
171 break;
172
173 case 'leave':
174 include_once './Modules/Course/classes/class.ilObjCourse.php';
175 return ilObjCourse::mayLeave($a_obj_id, $a_user_id);
176 }
177 return true;
178 }
179
192 public static function _getCommands()
193 {
194 $commands = array();
195 $commands[] = array("permission" => "crs_linked", "cmd" => "", "lang_var" => "view", "default" => true);
196
197 include_once './Services/WebServices/FileManager/classes/class.ilFMSettings.php';
198 if (ilFMSettings::getInstance()->isEnabled()) {
199 $commands[] = array(
200 'permission' => 'read',
201 'cmd' => 'fileManagerLaunch',
202 'lang_var' => 'fm_start',
203 'enable_anonymous' => false
204 );
205 }
206
207 $commands[] = array("permission" => "join", "cmd" => "join", "lang_var" => "join");
208
209 // on waiting list
210 $commands[] = array('permission' => "join", "cmd" => "leave", "lang_var" => "leave_waiting_list");
211
212 // regualar users
213 $commands[] = array('permission' => "leave", "cmd" => "leave", "lang_var" => "crs_unsubscribe");
214
215 include_once('Services/WebDAV/classes/class.ilDAVActivationChecker.php');
217 include_once './Services/WebDAV/classes/class.ilWebDAVUtil.php';
218 if (ilWebDAVUtil::getInstance()->isLocalPasswordInstructionRequired()) {
219 $commands[] = array('permission' => 'read', 'cmd' => 'showPasswordInstruction', 'lang_var' => 'mount_webfolder', 'enable_anonymous' => 'false');
220 } else {
221 $commands[] = array("permission" => "read", "cmd" => "mount_webfolder", "lang_var" => "mount_webfolder", "enable_anonymous" => "false");
222 }
223 }
224
225 $commands[] = array("permission" => "write", "cmd" => "enableAdministrationPanel", "lang_var" => "edit_content");
226 $commands[] = array("permission" => "write", "cmd" => "edit", "lang_var" => "settings");
227 return $commands;
228 }
229
233 public static function _checkGoto($a_target)
234 {
235 global $DIC;
236
237 $ilAccess = $DIC['ilAccess'];
238 $ilUser = $DIC['ilUser'];
239
240 $t_arr = explode("_", $a_target);
241
242 // registration codes
243 if (substr($t_arr[2], 0, 5) == 'rcode' and $ilUser->getId() != ANONYMOUS_USER_ID) {
244 self::$using_code = true;
245 return true;
246 }
247
248
249 if ($t_arr[0] != "crs" || ((int) $t_arr[1]) <= 0) {
250 return false;
251 }
252
253 // checking for read results in endless loop, if read is given
254 // but visible is not given (-> see bug 5323)
255 if ($ilAccess->checkAccess("read", "", $t_arr[1]) ||
256 $ilAccess->checkAccess("visible", "", $t_arr[1])) {
257 //if ($ilAccess->checkAccess("visible", "", $t_arr[1]))
258 return true;
259 }
260 return false;
261 }
262
269 public static function _lookupViewMode($a_id)
270 {
271 global $DIC;
272
273 $ilDB = $DIC['ilDB'];
274
275 $query = "SELECT view_mode FROM crs_settings WHERE obj_id = " . $ilDB->quote($a_id, 'integer') . " ";
276 $res = $ilDB->query($query);
277 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
278 return $row->view_mode;
279 }
280 return false;
281 }
282
292 public static function _isActivated($a_obj_id, &$a_visible_flag = null, $a_mind_member_view = true)
293 {
294 // #7669
295 if ($a_mind_member_view) {
296 include_once './Services/Container/classes/class.ilMemberViewSettings.php';
297 if (ilMemberViewSettings::getInstance()->isActive()) {
298 $a_visible_flag = true;
299 return true;
300 }
301 }
302
303 $ref_id = ilObject::_getAllReferences($a_obj_id);
304 $ref_id = array_pop($ref_id);
305
306 $a_visible_flag = true;
307
308 include_once './Services/Object/classes/class.ilObjectActivation.php';
309 $item = ilObjectActivation::getItem($ref_id);
310 switch ($item['timing_type']) {
312 if (time() < $item['timing_start'] or
313 time() > $item['timing_end']) {
314 $a_visible_flag = $item['visible'];
315 return false;
316 }
317 // fallthrough
318
319 // no break
320 default:
321 return true;
322 }
323 }
324
330 public static function _registrationEnabled($a_obj_id)
331 {
332 global $DIC;
333
334 $ilDB = $DIC['ilDB'];
335
336 $query = "SELECT * FROM crs_settings " .
337 "WHERE obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " ";
338
339 $res = $ilDB->query($query);
340 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
341 $type = $row->sub_limitation_type;
342 $reg_start = $row->sub_start;
343 $reg_end = $row->sub_end;
344 }
345
346 switch ($type) {
348 return true;
349
351 return false;
352
354 if (time() > $reg_start and
355 time() < $reg_end) {
356 return true;
357 }
358 // no break
359 default:
360 return false;
361 }
362 return false;
363 }
364
373 public static function lookupRegistrationInfo($a_obj_id)
374 {
375 global $DIC;
376
377 $ilDB = $DIC['ilDB'];
378 $ilUser = $DIC['ilUser'];
379 $lng = $DIC['lng'];
380
381 $query = 'SELECT sub_limitation_type, sub_start, sub_end, sub_mem_limit, sub_max_members FROM crs_settings ' .
382 'WHERE obj_id = ' . $ilDB->quote($a_obj_id);
383 $res = $ilDB->query($query);
384
385 $info = array();
386 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
387 $info['reg_info_start'] = new ilDateTime($row->sub_start, IL_CAL_UNIX);
388 $info['reg_info_end'] = new ilDateTime($row->sub_end, IL_CAL_UNIX);
389 $info['reg_info_type'] = $row->sub_limitation_type;
390 $info['reg_info_max_members'] = $row->sub_max_members;
391 $info['reg_info_mem_limit'] = $row->sub_mem_limit;
392 }
393
394 $registration_possible = true;
395
396 // Limited registration
397 if ($info['reg_info_type'] == ilCourseConstants::SUBSCRIPTION_LIMITED) {
398 $dt = new ilDateTime(time(), IL_CAL_UNIX);
399 if (ilDateTime::_before($dt, $info['reg_info_start'])) {
400 $info['reg_info_list_prop']['property'] = $lng->txt('crs_list_reg_start');
401 $info['reg_info_list_prop']['value'] = ilDatePresentation::formatDate($info['reg_info_start']);
402 } elseif (ilDateTime::_before($dt, $info['reg_info_end'])) {
403 $info['reg_info_list_prop']['property'] = $lng->txt('crs_list_reg_end');
404 $info['reg_info_list_prop']['value'] = ilDatePresentation::formatDate($info['reg_info_end']);
405 } else {
406 $registration_possible = false;
407 $info['reg_info_list_prop']['property'] = $lng->txt('crs_list_reg_period');
408 $info['reg_info_list_prop']['value'] = $lng->txt('crs_list_reg_noreg');
409 }
410 } elseif ($info['reg_info_type'] == ilCourseConstants::SUBSCRIPTION_UNLIMITED) {
411 $registration_possible = true;
412 } else {
413 $registration_possible = false;
414 $info['reg_info_list_prop']['property'] = $lng->txt('crs_list_reg');
415 $info['reg_info_list_prop']['value'] = $lng->txt('crs_list_reg_noreg');
416 }
417
418 if ($info['reg_info_mem_limit'] && $info['reg_info_max_members'] && $registration_possible) {
419 // Check for free places
420 include_once './Modules/Course/classes/class.ilCourseParticipant.php';
421 $part = ilCourseParticipant::_getInstanceByObjId($a_obj_id, $ilUser->getId());
422
423 include_once './Modules/Course/classes/class.ilCourseWaitingList.php';
424 $info['reg_info_list_size'] = ilCourseWaitingList::lookupListSize($a_obj_id);
425 if ($info['reg_info_list_size']) {
426 $info['reg_info_free_places'] = 0;
427 } else {
428 $info['reg_info_free_places'] = max(0, $info['reg_info_max_members'] - $part->getNumberOfMembers());
429 }
430
431 if ($info['reg_info_free_places']) {
432 $info['reg_info_list_prop_limit']['property'] = $lng->txt('crs_list_reg_limit_places');
433 $info['reg_info_list_prop_limit']['value'] = $info['reg_info_free_places'];
434 } else {
435 $info['reg_info_list_prop_limit']['property'] = '';
436 $info['reg_info_list_prop_limit']['value'] = $lng->txt('crs_list_reg_limit_full');
437 }
438 }
439
440 return $info;
441 }
442
451 public static function _isOffline($a_obj_id)
452 {
453 $dummy = null;
454 return !self::_isActivated($a_obj_id, $dummy, false);
455 }
456
462 public static function _preloadData($a_obj_ids, $a_ref_ids)
463 {
464 global $DIC;
465
466 $ilUser = $DIC['ilUser'];
467 $lng = $DIC['lng'];
468
469 $lng->loadLanguageModule("crs");
470
472
473 $repository = new ilUserCertificateRepository();
474 $coursePreload = new ilCertificateObjectsForUserPreloader($repository);
475 $coursePreload->preLoad($ilUser->getId(), $a_obj_ids);
476 }
477
483 public static function _usingRegistrationCode()
484 {
485 return self::$using_code;
486 }
487
494 public static function lookupPeriodInfo($a_obj_id)
495 {
496 global $DIC;
497
498 $ilDB = $DIC['ilDB'];
499 $lng = $DIC['lng'];
500
501 $start = $end = null;
502
503 $query = 'SELECT crs_start, crs_end FROM crs_settings' .
504 ' WHERE obj_id = ' . $ilDB->quote($a_obj_id);
505 $set = $ilDB->query($query);
506 while ($row = $ilDB->fetchAssoc($set)) {
507 $start = $row['crs_start']
508 ? new ilDate($row['crs_start'], IL_CAL_UNIX)
509 : null;
510 $end = $row['crs_end']
511 ? new ilDate($row['crs_end'], IL_CAL_UNIX)
512 : null;
513 }
514
515 if ($start && $end) {
516 $lng->loadLanguageModule('crs');
517
518 return array(
519 'property' => $lng->txt('crs_period'),
521 );
522 }
523 }
524}
An exception for terminatinating execution or to throw for unit testing.
const IL_NO_OBJECT_ACCESS
const IL_CRS_SUBSCRIPTION_LIMITED
const IL_CRS_SUBSCRIPTION_UNLIMITED
const IL_CRS_SUBSCRIPTION_DEACTIVATED
const IL_CAL_UNIX
static _getInstanceByObjId($a_obj_id, $a_usr_id)
Get singleton instance.
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date @access public.
static formatPeriod(ilDateTime $start, ilDateTime $end, $a_skip_starting_day=false)
Format a period of two date Shows: 14.
@classDescription Date and time handling
static _before(ilDateTime $start, ilDateTime $end, $a_compare_field='', $a_tz='')
compare two dates and check start is before end This method does not consider tz offsets.
Class for single dates.
static getInstance()
Get singleton instance.
static getInstance()
Get instance.
Class ilObjCourseAccess.
static lookupPeriodInfo($a_obj_id)
Lookup course period info.
static getConditionOperators()
Get operators.
static checkCondition($a_obj_id, $a_operator, $a_value, $a_usr_id)
@global ilObjUser $ilUser
static _registrationEnabled($a_obj_id)
static _checkGoto($a_target)
check whether goto script will succeed
static _usingRegistrationCode()
Using Registration code.
static _lookupViewMode($a_id)
Lookup view mode.
_checkAccess($a_cmd, $a_permission, $a_ref_id, $a_obj_id, $a_user_id="")
checks wether a user may invoke a command or not (this method is called by ilAccessHandler::checkAcce...
static _preloadData($a_obj_ids, $a_ref_ids)
Preload data.
static _isActivated($a_obj_id, &$a_visible_flag=null, $a_mind_member_view=true)
Is activated?
static _getCommands()
get commands
static lookupRegistrationInfo($a_obj_id)
Lookup registration info @global ilDB $ilDB @global ilObjUser $ilUser @global ilLanguage $lng.
static _isOffline($a_obj_id)
Type-specific implementation of general status.
static mayLeave($a_course_id, $a_user_id=null, &$a_date=null)
Class ilObjectAccess.
static getItem($a_ref_id)
Get item data.
static _getAllReferences($a_id)
get all reference ids of object
static _hasPassed($a_obj_id, $a_usr_id)
Check if user has passed course.
static _isOnList($a_usr_id, $a_obj_id)
Check if a user on the waiting list.
static _preloadOnListInfo($a_usr_ids, $a_obj_ids)
Preload on list info.
static lookupListSize($a_obj_id)
Lookup waiting lit size.
static getInstance()
Get singleton instance.
Interface for condition handling.
$info
Definition: index.php:5
$row
$query
$type
global $DIC
Definition: saml.php:7
$lng
foreach($_POST as $key=> $value) $res
global $ilDB
$ilUser
Definition: imgupload.php:18
$start
Definition: bench.php:8