54 public function IsBaseAccess ($in_bitmaskRequested, $isUseCache =
false, $checkForAuthor =
false);
149 'lesson_read' => self::OP_LESSON_READ,
150 'lesson_create' => self::OP_LESSON_CREATE,
151 'lesson_write' => self::OP_LESSON_WRITE,
152 'lesson_remove' => self::OP_LESSON_REMOVE,
153 'lesson_link_to_parents' => self::OP_LESSON_LINK_TO_PARENTS,
154 'lesson_unlink_from_parents' => self::OP_LESSON_UNLINK_FROM_PARENTS,
155 'lesson_link_descendants' => self::OP_LESSON_LINK_DESCENDANTS,
156 'lesson_unlink_descendants' => self::OP_LESSON_UNLINK_DESCENDANTS,
157 'lesson_manage_rights' => self::OP_LESSON_MANAGE_RIGHTS
162 private function __construct($in_userId)
175 if ( ! array_key_exists(
$userId, self::$instanceOfSelf) )
178 return (self::$instanceOfSelf[
$userId]);
213 if ( ! isset($row[
'NAME']) )
219 $nameUpperCase = mb_strtoupper($row[
'NAME']);
240 $arPossibleRights =
array();
241 while ($row = $rc->Fetch())
243 $nameUpperCase = mb_strtoupper($row[
'NAME']);
245 $arPossibleRights[$row[
'ID']] =
array(
246 'name' => $row[
'NAME'],
248 'sys' => $row[
'SYS'],
249 'description' => $row[
'DESCRIPTION'],
251 'binding' => $row[
'BINDING']
255 return ($arPossibleRights);
262 static $cacheSymbols =
array();
264 if ( ! (is_int($in_bitmaskOperations) && ($in_bitmaskOperations > 0)) )
271 $lessonId = (int) $in_lessonId;
273 $cacheKey =
'k' . $in_lessonId .
'|' . $in_bitmaskOperations;
275 if ( ! ($isUseCache && isset($cacheSymbols[$cacheKey])) )
277 $arSymbols =
array();
281 "SELECT TLR.SUBJECT_ID AS SYMBOLS
282 FROM b_learn_rights TLR
283 INNER JOIN b_task_operation TTO
284 ON TTO.TASK_ID = TLR.TASK_ID
285 INNER JOIN b_operation XTO
286 ON XTO.ID = TTO.OPERATION_ID
287 WHERE TLR.LESSON_ID = " . $lessonId .
"
288 AND XTO.MODULE_ID = 'learning'
289 AND XTO.NAME IN (" . $sqlOperationsNames .
")
293 SELECT TLRA.SUBJECT_ID AS SYMBOLS
294 FROM b_learn_rights_all TLRA
295 INNER JOIN b_task_operation TTO
296 ON TTO.TASK_ID = TLRA.TASK_ID
297 INNER JOIN b_operation XTO
298 ON XTO.ID = TTO.OPERATION_ID
299 WHERE XTO.MODULE_ID = 'learning'
300 AND XTO.NAME IN (" . $sqlOperationsNames .
")
310 while ($row = $rc->Fetch())
311 $arSymbols[] = $row[
'SYMBOLS'];
313 $cacheSymbols[$cacheKey] = $arSymbols;
316 return ($cacheSymbols[$cacheKey]);
329 return ($this->
IsBaseAccess ($in_bitmaskRequested, $isUseCache,
true));
340 public function IsBaseAccess ($in_bitmaskRequested, $isUseCache =
false, $checkForAuthor =
false)
345 && ( $this->userId === ((
int)
$USER->GetID()) )
352 elseif (defined(
'CRON_MODE'))
358 if ( ! (is_int($in_bitmaskRequested) && ($in_bitmaskRequested > 0)) )
365 $bitmaskRequested = $in_bitmaskRequested;
371 $arUserAccessSymbols[] =
'CR';
377 if ( ($bitmaskRequested & $bitmaskBaseAccess) === $bitmaskRequested )
393 if ( ! is_array($in_arPermPairs) )
401 $arPermPairs =
array();
402 foreach ($in_arPermPairs as $in_subject_id => $in_task_id)
404 $subject_id =
$DB->ForSQL($in_subject_id);
406 $arPermPairs[$subject_id] = $task_id;
410 if ( ! (self::IsLoggedUserCanAccessModuleSettings()
411 && ( ((
int)
$USER->GetID()) === $this->userId) )
419 $DB->StartTransaction();
422 "DELETE FROM b_learn_rights_all
433 foreach ($arPermPairs as $subject_id => $task_id)
437 "INSERT INTO b_learn_rights_all (SUBJECT_ID, TASK_ID)
438 VALUES ('" . $subject_id .
"', " . $task_id .
")",
true);
470 "SELECT SUBJECT_ID, TASK_ID
471 FROM b_learn_rights_all
481 $arPermPairs =
array();
482 while ($row = $rc->Fetch())
483 $arPermPairs[$row[
'SUBJECT_ID']] = (int) $row[
'TASK_ID'];
485 return ($arPermPairs);
506 "SELECT LESSON_ID, SUBJECT_ID, TASK_ID
508 WHERE LESSON_ID = " . $lessonId .
"
518 $arPermPairs =
array();
519 while ($row = $rc->Fetch())
520 $arPermPairs[$row[
'SUBJECT_ID']] = (int) $row[
'TASK_ID'];
522 return ($arPermPairs);
544 if ( ! is_array($in_arPermissions) )
552 $isUseCacheForRights =
false;
554 $arPermissions =
array();
555 foreach ($in_arPermissions as $in_lessonId => $arPermPairs)
557 if ( ! is_array($arPermPairs) )
567 if ( ! $this->
IsLessonAccessible($lesson_id, self::OP_LESSON_MANAGE_RIGHTS, $isUseCacheForRights) )
570 $isUseCacheForRights =
true;
573 $arPermissions[$lesson_id] =
array();
574 foreach ($arPermPairs as $in_subject_id => $in_task_id)
576 $subject_id =
$DB->ForSQL($in_subject_id);
578 $arPermissions[$lesson_id][$subject_id] = $task_id;
583 $DB->StartTransaction();
586 foreach ($arPermissions as $lesson_id => $arPermPairs)
588 $subject_id = $arPerm[0];
589 $task_id = $arPerm[1];
592 "DELETE FROM b_learn_rights
593 WHERE LESSON_ID = $lesson_id",
true);
603 foreach ($arPermPairs as $subject_id => $task_id)
607 "INSERT INTO b_learn_rights (LESSON_ID, SUBJECT_ID, TASK_ID)
608 VALUES (" . $lesson_id .
", '" . $subject_id .
"', " . $task_id .
")",
true);
628 static $cacheArIds =
array();
630 $lessonId = intval($in_lessonId);
631 $cacheKey = $in_bitmaskOperations.
"_".$lessonId;
633 if ($isUseCache && array_key_exists($cacheKey, $cacheArIds))
638 $cacheArIds = array_merge($cacheArIds, $this->
GetAccessibleLessonsList($in_bitmaskOperations, $isUseCache, $lessonId));
639 return array_key_exists($cacheKey, $cacheArIds);
649 $rc =
$DB->Query($sql,
true);
659 while ($row = $rc->Fetch())
660 $arIds[$in_bitmaskOperations.
"_".$row[
'LESSON_ID']] = (int) $row[
'LESSON_ID'];
682 if ( ! (is_int($in_bitmaskOperations) && ($in_bitmaskOperations > 0)) )
689 $prfx =
$DB->ForSQL ($in_prfx);
695 $userAccessSymbols =
'NULL';
697 if (
count($arUserAccessSymbols) > 0)
718 $bitmaskOperationsForAny = $in_bitmaskOperations & ( ~ $bitmaskAvailOperationsForAny );
719 $bitmaskOperationsForCR = $in_bitmaskOperations & ( ~ $bitmaskAvailOperationsForCR );
722 $sqlOperationsForAny =
false;
723 $sqlOperationsForCR =
false;
724 if ($bitmaskOperationsForAny !== 0)
726 if ($bitmaskOperationsForCR !== 0)
729 $arSqlWhere =
array();
732 if ($sqlOperationsForCR !==
false)
733 $arSqlWhere[] =
"(${prfx}TLR.SUBJECT_ID = 'CR' AND ${prfx}TLL.CREATED_BY = $userId AND ${prfx}XTO.NAME IN ($sqlOperationsForCR))";
735 $arSqlWhere[] =
"(${prfx}TLL.CREATED_BY = $userId)";
737 if ($sqlOperationsForAny !==
false)
738 $arSqlWhere[] =
"(${prfx}TLR.SUBJECT_ID IN ($userAccessSymbols) AND ${prfx}XTO.NAME IN ($sqlOperationsForAny))";
740 $arSqlWhere[] =
"(1=1)";
742 $sqlWhere = implode(
"\n OR \n", $arSqlWhere);
744 $lessonId = intval($lessonId);
747 $sqlWhere =
"${prfx}TLL.ID={$lessonId} AND (".$sqlWhere.
")";
750 $sql =
"SELECT ${prfx}TLL.ID AS LESSON_ID
751 FROM b_learn_lesson ${prfx}TLL
752 LEFT OUTER JOIN b_learn_rights ${prfx}TLR
753 ON ${prfx}TLL.ID = ${prfx}TLR.LESSON_ID
754 LEFT OUTER JOIN b_task_operation ${prfx}TTO
755 ON ${prfx}TLR.TASK_ID = ${prfx}TTO.TASK_ID
756 LEFT OUTER JOIN b_operation ${prfx}XTO
757 ON ${prfx}TTO.OPERATION_ID = ${prfx}XTO.ID
796 static $cache =
array();
798 if (!is_array($arUserAccessSymbols) ||
count($arUserAccessSymbols) < 1)
804 if (isset($cache[$userAccessSymbols]))
806 return $cache[$userAccessSymbols];
810 "SELECT XTO.NAME AS OPERATION_NAME
811 FROM b_learn_rights_all TLRA
812 INNER JOIN b_task_operation TTO
813 ON TTO.TASK_ID = TLRA.TASK_ID
814 INNER JOIN b_operation XTO
815 ON XTO.ID = TTO.OPERATION_ID
816 WHERE TLRA.SUBJECT_ID IN ($userAccessSymbols)",
825 $bitmaskOperations = 0;
826 while ($arData = $rc->Fetch())
828 if ( ! isset(self::$arOperations[$arData[
'OPERATION_NAME']]) )
830 throw new LearnException (
'Unknown operation: ' . $arData[
'OPERATION_NAME'],
836 $bitmaskOperations = $bitmaskOperations | self::$arOperations[$arData[
'OPERATION_NAME']];
839 $cache[$userAccessSymbols] = $bitmaskOperations;
840 return ($bitmaskOperations);
849 static $determinedCache =
array();
851 if ( ! (is_int($in_operations) && ($in_operations > 0)) )
854 $cacheKey =
'str' . $in_operations;
856 if ( ! isset ($determinedCache[$cacheKey]) )
859 foreach (self::$arOperations as $operationName => $operationBitFlag)
861 if ($in_operations & $operationBitFlag)
864 $in_operations -= $operationBitFlag;
870 if ($in_operations !== 0)
874 $determinedCache[$cacheKey] = $sql;
877 return ($determinedCache[$cacheKey]);
886 static $cache =
array();
888 if ($isUseCache && isset($cache[
'str' . $this->userId]))
889 return ($cache[
'str' . $this->userId]);
908 static $cache =
array();
909 $isNeedCAccessUpdate =
true;
914 if (isset($cache[
'str' . $this->userId]))
915 return ($cache[
'str' . $this->userId]);
919 if ( (static::$CAccessLastUpdated ===
false)
920 || ( (microtime(
true) - static::$CAccessLastUpdated) > 3 )
923 $isNeedCAccessUpdate =
true;
926 $isNeedCAccessUpdate =
false;
929 $isNeedCAccessUpdate =
true;
931 if ($isNeedCAccessUpdate)
933 $oAcc =
new CAccess();
934 $oAcc->UpdateCodes();
937 static::$CAccessLastUpdated = microtime(
true);
942 $rc = CAccess::GetUserCodes($this->userId);
951 while ($arItem = $rc->Fetch())
953 if ( ( (
int) $arItem[
'USER_ID'] ) !== $this->userId )
961 $arData[] = $arItem[
'ACCESS_CODE'];
964 if ( is_object(
$USER) && ( $this->userId === ((
int)
$USER->GetID()) ) )
977 $arData = array_map (
array(
'CLearnAccess',
'EscapeAndAddLateralQuotes'), $in_arData);
979 $sql = implode(
',', $arData);
988 return (
"'" .
$DB->ForSQL($txt) .
"'");
1005 if ( ! preg_match(
"/^[0-9]+$/", (
string)
$var) )
1008 'EA_PARAMS: can\'t b strictly casted to integer, but expected: ' .
$var,
1013 return ( (
int)
$var );
static GetLangTitle($name, $module="main")
static GetLangDescription($name, $desc, $module="main")
static GetList($arOrder=['MODULE_ID'=> 'asc', 'LETTER'=> 'asc'], $arFilter=[])
static GetInstance($in_userId)
GetLessonPermissions($in_lessonId)
static ListAllPossibleRights()
SQLClauseForAccessibleLessons($in_bitmaskOperations, $isUseCache=false, $lessonId=0, $in_prfx='DEFPRFX')
IsLessonAccessible($in_lessonId, $in_bitmaskOperations, $isUseCache=false)
static StrictlyCastToInteger($var)
IsBaseAccessForCR($in_bitmaskRequested, $isUseCache=false)
static IsLoggedUserCanAccessModuleSettings()
static GetAccessSymbolsHashForSiteUser()
static EscapeAndAddLateralQuotes($txt)
GetAccessCodes($isUseCache=false)
const OP_LESSON_UNLINK_FROM_PARENTS
const OP_LESSON_MANAGE_RIGHTS
GetAccessCodesForSQL($isUseCache=false)
static $CAccessLastUpdated
const OP_LESSON_LINK_DESCENDANTS
GetBitmaskOperationsForAllLessons($arUserAccessSymbols)
const OP_LESSON_UNLINK_DESCENDANTS
GetAccessibleLessonsList($in_bitmaskOperations, $isUseCache=false, $lessonId=0)
SetBasePermissions($in_arPermPairs)
IsBaseAccess($in_bitmaskRequested, $isUseCache=false, $checkForAuthor=false)
static GetNameForTask($taskId)
static Array2CommaSeparatedListForSQL($in_arData)
static GetSymbolsAccessibleToLesson($in_lessonId, $in_bitmaskOperations, $isUseCache=false)
static ParseOperationsForSQL($in_operations)
const OP_LESSON_LINK_TO_PARENTS
SetLessonsPermissions($in_arPermissions)
const EXC_ERR_ALL_ACCESS_DENIED
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
GetLessonPermissions($in_lessonId)
static ListAllPossibleRights()
SQLClauseForAccessibleLessons($in_bitmaskOperations, $isUseCache=false, $lessonId=0, $in_prfx='DEFPRFX')
IsLessonAccessible($in_lessonId, $in_bitmaskOperations, $isUseCache=false)
IsBaseAccessForCR($in_bitmaskRequested, $isUseCache=false)
SetBasePermissions($in_arPermPairs)
GetAccessibleLessonsList($in_bitmaskOperations, $isUseCache=false)
IsBaseAccess($in_bitmaskRequested, $isUseCache=false, $checkForAuthor=false)
static GetNameForTask($taskId)
static GetSymbolsAccessibleToLesson($in_lessonId, $in_bitmaskOperations, $isUseCache=false)
SetLessonsPermissions($in_arPermissions)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"