309 $arOrder =
array (
'EDGE_SORT' =>
'asc'),
311 $publishProhibitionMode =
true
352 public static function RelationGet ($parentLessonId, $childLessonId);
394 $breakBeforeLessonId =
false, $arIgnoreEdges =
array());
442 $parentLessonId =
true,
444 $isCheckPermissions =
true,
445 $checkPermissionsForUserId = -1
450 $isAccessGranted =
false;
452 if ($isCheckPermissions)
455 array(
'user_id' => $checkPermissionsForUserId)
459 if ($parentLessonId ===
true)
463 $isAccessGranted =
true;
470 'parent_lesson_id' => $parentLessonId,
471 'user_id' => $checkPermissionsForUserId
476 $isAccessGranted =
true;
482 $isAccessGranted =
true;
484 if ( ! $isAccessGranted )
502 foreach(
GetModuleEvents(
'learning',
'OnBeforeLessonAdd',
true) as $arEvent)
515 $GLOBALS[
"APPLICATION"]->ThrowException($e);
532 if ($parentLessonId !==
true)
540 foreach(
GetModuleEvents(
'learning',
'OnAfterLessonAdd',
true) as $arEvent)
554 $arCourseFields =
array();
557 && ( ! array_key_exists(
'COURSE_SORT',
$arFields))
570 $additionalParams =
array (
'COURSE_SORT',
'ACTIVE_FROM',
571 'ACTIVE_TO',
'RATING',
'RATING_TYPE',
'SCORM');
573 foreach ($additionalParams as $paramName)
575 if (array_key_exists($paramName,
$arFields))
577 $arCourseFields[$paramName] =
$arFields[$paramName];
582 return ($arCourseFields);
596 $arAllowedFields =
array (
'COURSE_SORT',
'ACTIVE_FROM',
'ACTIVE_TO',
'RATING',
'RATING_TYPE',
'SCORM');
600 $defaultsValues =
array (
601 'COURSE_SORT' => 500,
602 'ACTIVE_FROM' => NULL,
605 'RATING_TYPE' => NULL,
612 if ( ! array_key_exists($fieldName,
$arFields) )
620 if ( ( ! $forUpdate) || array_key_exists(
'COURSE_SORT',
$arFields) )
624 if ( ( ! $forUpdate) || isset(
$arFields[
'ACTIVE_FROM']) )
627 && ( ! is_string(
$arFields[
'ACTIVE_FROM']) )
635 if ( ( ! $forUpdate) || isset(
$arFields[
'ACTIVE_TO']) )
638 && ( ! is_string(
$arFields[
'ACTIVE_TO']) )
646 if ( ( ! $forUpdate) || array_key_exists(
'RATING',
$arFields) )
651 if ( ! in_array (
$arFields[
'RATING'],
array (
'Y',
'N', NULL),
true) )
656 if ( ( ! $forUpdate) || array_key_exists(
'RATING_TYPE',
$arFields) )
662 array (
'like',
'standart_text',
'like_graphic',
'standart'),
672 if ( ( ! $forUpdate) || array_key_exists(
'SCORM',
$arFields) )
681 foreach ($arAllowedFields as $fieldName)
683 if (array_key_exists($fieldName,
$arFields))
711 if ($courseId !==
false)
717 foreach(
GetModuleEvents(
'learning',
'OnBeforeLessonUpdate',
true) as $arEvent)
730 $GLOBALS[
"APPLICATION"]->ThrowException($e);
741 if ($courseId !==
false)
746 $arFieldsToDb =
array();
748 if (array_key_exists(
'COURSE_SORT', $arCourseFields))
749 $arFieldsToDb[
'SORT'] =
"'" . (int) ($arCourseFields[
'COURSE_SORT'] + 0) .
"'";
751 if (array_key_exists(
'ACTIVE_FROM', $arCourseFields))
753 if (($arCourseFields[
'ACTIVE_FROM'] === NULL) || ($arCourseFields[
'ACTIVE_FROM'] ===
''))
754 $arFieldsToDb[
'ACTIVE_FROM'] =
'NULL';
756 $arFieldsToDb[
'ACTIVE_FROM'] =
$DB->CharToDateFunction($arCourseFields[
'ACTIVE_FROM']);
759 if (array_key_exists(
'ACTIVE_TO', $arCourseFields))
761 if (($arCourseFields[
'ACTIVE_TO'] === NULL) || ($arCourseFields[
'ACTIVE_TO'] ===
''))
762 $arFieldsToDb[
'ACTIVE_TO'] =
'NULL';
764 $arFieldsToDb[
'ACTIVE_TO'] =
$DB->CharToDateFunction($arCourseFields[
'ACTIVE_TO']);
767 if (array_key_exists(
'RATING', $arCourseFields))
768 $arFieldsToDb[
'RATING'] =
"'" .
$DB->ForSql($arCourseFields[
'RATING']) .
"'";
770 if (array_key_exists(
'RATING_TYPE', $arCourseFields))
772 if ($arCourseFields[
'RATING_TYPE'] === NULL)
773 $arFieldsToDb[
'RATING_TYPE'] =
'NULL';
775 $arFieldsToDb[
'RATING_TYPE'] =
"'" .
$DB->ForSql($arCourseFields[
'RATING_TYPE']) .
"'";
778 if (array_key_exists(
'SCORM', $arCourseFields))
779 $arFieldsToDb[
'SCORM'] =
"'" .
$DB->ForSql($arCourseFields[
'SCORM']) .
"'";
782 if (
count($arFieldsToDb) > 0)
784 $rc =
$DB->Update (
'b_learn_course', $arFieldsToDb,
785 "WHERE ID='" . (
int) ($courseId + 0) .
"'", __LINE__,
false,
803 foreach(
GetModuleEvents(
'learning',
'OnAfterLessonUpdate',
true) as $arEvent)
815 $check_permissions =
true;
818 if (is_array($lesson_id))
824 'lesson_id' =>
array(
825 'type' =>
'strictly_castable_to_integer',
830 'mandatory' =>
false,
831 'default_value' => $simulate
833 'check_permissions' =>
array(
835 'mandatory' =>
false,
836 'default_value' => $check_permissions
839 'type' =>
'strictly_castable_to_integer',
840 'mandatory' =>
false,
841 'default_value' => $user_id
848 $check_permissions =
$options[
'check_permissions'];
852 $lesson_id = (int) $lesson_id;
854 if ($check_permissions)
860 if ( ! (is_object(
$USER) && method_exists(
$USER,
'GetID')) )
863 'EA_OTHER: $USER isn\'t available.',
868 $user_id = (int)
$USER->GetID();
872 return (
array($lesson_id, $simulate, $check_permissions, $user_id));
878 list ($root_lesson_id, $simulate, $check_permissions, $user_id) =
882 $arCandidatesToRemove =
array();
886 $arDescendantsList = $oTree->GetLessonsIdListInTree();
889 foreach ($arDescendantsList as $lesson_id)
891 $arParents =
array();
894 foreach ($arEdges as $arEdgeData)
895 $arParents[] = (int) $arEdgeData[
'PARENT_LESSON'];
897 $arCandidatesToRemove[(int) $lesson_id] = $arParents;
901 $arCandidatesToRemove[$root_lesson_id] =
array();
906 $lessonsWithdrawn = 0;
908 foreach ($arCandidatesToRemove as $lesson_id => $arParents)
912 foreach ($arParents as $parent_lesson_id)
914 if ( ! array_key_exists((
int) $parent_lesson_id, $arCandidatesToRemove) )
916 unset($arCandidatesToRemove[(
int) $lesson_id]);
923 while ($lessonsWithdrawn > 0);
927 foreach ($arCandidatesToRemove as $lesson_id => $arParents)
933 'lesson_id' => $lesson_id,
934 'simulate' => $simulate,
935 'check_permissions' => $check_permissions,
936 'user_id' => $user_id
949 array(
'LESSON_ID' => $lesson_id,
'CHECK_PERMISSIONS' =>
'N'),
954 if ( ! $rsLesson->fetch() )
974 final public static function Delete ($lesson_id)
978 list ($lesson_id, $simulate, $check_permissions, $user_id) =
981 if ($check_permissions)
996 if ($check_permissions)
998 $IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS =
1000 $IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS =
1004 foreach(
GetModuleEvents(
'learning',
'OnBeforeLessonDelete',
true) as $arEvent)
1007 foreach ($arNeighboursEdges as $arEdge)
1009 $child_lesson_id = (int) $arEdge[
'CHILD_LESSON'];
1010 $parent_lesson_id = (int) $arEdge[
'PARENT_LESSON'];
1011 if ($check_permissions)
1013 $IsLessonAccessible =
false;
1015 if ($child_lesson_id === $lesson_id)
1018 $IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS
1021 elseif ($parent_lesson_id === $lesson_id)
1024 $IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS
1030 'EA_FATAL: $lesson_id (' . $lesson_id
1031 .
') not equal to one of: $child_lesson_id ('
1032 . $child_lesson_id .
'), $parent_lesson_id ('
1033 . $parent_lesson_id .
')',
1038 if ( ! $IsLessonAccessible )
1045 if ($simulate ===
false)
1053 if ($linkedCourseId !==
false)
1057 if ($simulate ===
false)
1059 if ( !
$DB->Query(
"DELETE FROM b_learn_course_site WHERE COURSE_ID = " . (
int) $linkedCourseId,
true) )
1068 'EA_OTHER: lesson is unremovable because linked course is in use.',
1078 if ($simulate ===
false)
1083 "SELECT PREVIEW_PICTURE, DETAIL_PICTURE
1085 WHERE ID = " . (
int) $lesson_id,
1103 CFile::Delete(
$arRes[
'PREVIEW_PICTURE']);
1104 CFile::Delete(
$arRes[
'DETAIL_PICTURE']);
1109 array(
'LESSON_ID' => $lesson_id)
1111 while($arQ = $q->Fetch())
1116 'EA_QUESTION_NOT_REMOVED',
1127 CEventLog::add(
array(
1128 'AUDIT_TYPE_ID' =>
'LEARNING_REMOVE_ITEM',
1129 'MODULE_ID' =>
'learning',
1130 'ITEM_ID' =>
'L #' . $lesson_id,
1131 'DESCRIPTION' =>
'lesson removed'
1134 if (CModule::IncludeModule(
'search'))
1136 CSearch::deleteIndex(
"learning",
"U\\_%",
"L".$lesson_id,
null);
1140 if ($simulate ===
false)
1142 foreach(
GetModuleEvents(
'learning',
'OnAfterLessonDelete',
true) as $arEvent)
1150 return (self::GetList(
array(),
array(
'LESSON_ID' => $id)));
1162 if ($courseId !==
false)
1165 "SELECT SORT, ACTIVE_FROM, ACTIVE_TO, RATING, RATING_TYPE, SCORM
1167 WHERE ID = '" . (
int) ($courseId + 0) .
"'",
1174 $arCourseData = $rc->Fetch();
1175 if ( ($arCourseData ===
false) || ( ! isset($arCourseData[
'SORT']) ) )
1178 $arData = array_merge($arData, $arCourseData);
1182 if ( isset($arData[
'ACTIVE'])
1183 && is_bool($arData[
'ACTIVE'])
1186 if ($arData[
'ACTIVE'])
1187 $arData[
'ACTIVE'] =
'Y';
1189 $arData[
'ACTIVE'] =
'N';
1192 $arData[
'LESSON_ID'] = $arData[
'ID'];
1202 if ( ! isset($arMap[
'L' . $lessonId]) )
1206 return ($arMap[
'L' . $lessonId]);
1217 static $arMap =
array();
1220 static $cacheId =
'fixed_cache_id';
1221 static $cachePath =
'/learning/coursetolessonmap/';
1223 $oCache =
new CPHPCache();
1226 if ( ! $bRefreshCache )
1228 if ($oCache->InitCache($ttl, $cacheId, $cachePath))
1230 $arCached = $oCache->GetVars();
1231 if (isset($arCached[
'arMap']) && is_array($arCached[
'arMap']))
1233 $arMap = $arCached[
'arMap'];
1240 if (( ! $bCacheHit ) || $bRefreshCache)
1242 $oCache->CleanDir($cachePath);
1245 $oCache->InitCache($ttl, $cacheId, $cachePath);
1246 $oCache->StartDataCache($ttl, $cacheId, $cachePath);
1247 $oCache->EndDataCache(
array(
'arMap' => $arMap));
1256 $bRefreshCache =
true;
1267 "SELECT ID, LINKED_LESSON_ID
1280 while ($arData = $rc->Fetch())
1283 if ( ($arData[
'ID'] <= 0) || ($arData[
'LINKED_LESSON_ID'] <= 0) )
1286 $arMap[
'C' . $arData[
'ID']] = (int) $arData[
'LINKED_LESSON_ID'];
1287 $arMap[
'L' . $arData[
'LINKED_LESSON_ID']] = (int) $arData[
'ID'];
1330 $ACTIVE_FROM = $ACTIVE_TO =
'NULL';
1332 if (($arCourseFields[
'ACTIVE_FROM'] !== NULL) && ($arCourseFields[
'ACTIVE_FROM'] !==
''))
1333 $ACTIVE_FROM =
$DB->CharToDateFunction($arCourseFields[
'ACTIVE_FROM']);
1335 if (($arCourseFields[
'ACTIVE_TO'] !== NULL) && ($arCourseFields[
'ACTIVE_TO'] !==
''))
1336 $ACTIVE_TO =
$DB->CharToDateFunction($arCourseFields[
'ACTIVE_TO']);
1338 $arFieldsToDb =
array(
1339 'LINKED_LESSON_ID' =>
"'" . (
int) ($lessonId + 0) .
"'",
1340 'SORT' =>
"'" . (
int) ($arCourseFields[
'COURSE_SORT'] + 0) .
"'",
1341 'ACTIVE_FROM' => $ACTIVE_FROM,
1342 'ACTIVE_TO' => $ACTIVE_TO,
1343 'RATING' =>
"'" .
$DB->ForSql($arCourseFields[
'RATING']) .
"'",
1344 'RATING_TYPE' => ( ($arCourseFields[
'RATING_TYPE'] === NULL) ?
'NULL' : (
"'" .
$DB->ForSql($arCourseFields[
'RATING_TYPE']) .
"'") ),
1345 'SCORM' =>
"'" .
$DB->ForSql($arCourseFields[
'SCORM']) .
"'"
1348 $rc =
$DB->Insert (
'b_learn_course',
1369 return ( (
int) $rc);
1397 if ($linkedLessonId ===
false)
1404 if ( ($certificate ===
false) || ($certificate->GetNext()) )
1408 $tests =
CTest::GetList(Array(), Array(
"COURSE_ID" => $courseId));
1409 if ($tests ===
false)
1412 while ($arTest = $tests->Fetch())
1422 self::PUBLISH_PROHIBITION_PURGE_ALL_LESSONS_IN_COURSE_CONTEXT
1423 | self::PUBLISH_PROHIBITION_PURGE_LESSON_IN_ALL_COURSE_CONTEXT
1427 "DELETE FROM b_learn_course
1428 WHERE ID=" . (
string) ((
int) $courseId),
1458 $args = func_get_args();
1459 foreach ($args as $arg)
1462 ( ! is_numeric($arg) )
1463 || ( ! is_int($arg + 0) )
1495 final public static function RelationGet ($parentLessonId, $childLessonId)
1537 $obUserFieldsSql->SetEntity(
'LEARNING_LESSONS',
'TL.ID');
1538 $obUserFieldsSql->SetSelect($arSelectFields);
1540 $obUserFieldsSql->SetOrder($arOrder);
1542 $bReplaceCourseId =
false;
1543 if (isset(
$arFilter[
'#REPLACE_COURSE_ID_TO_ID']))
1545 $bReplaceCourseId =
true;
1546 unset(
$arFilter[
'#REPLACE_COURSE_ID_TO_ID']);
1553 'lesson_id' =>
'TL.ID',
1554 'site_id' =>
'TL.ID',
1555 'name' =>
'TL.NAME',
1556 'code' =>
'TL.CODE',
1557 'active' =>
'TL.ACTIVE',
1558 'created' =>
'TL.DATE_CREATE',
1559 'date_create' =>
'TL.DATE_CREATE',
1560 'created_by' =>
'TL.CREATED_BY',
1561 'timestamp_x' =>
'TL.TIMESTAMP_X',
1562 'course_id' =>
'TC.ID',
1563 'course_sort' =>
'TC.SORT',
1564 'active_from' =>
'TC.ACTIVE_FROM',
1567 'sort' =>
'TC.SORT',
1568 'linked_lesson_id' =>
'TC.LINKED_LESSON_ID'
1574 $allowedModes =
array(
1576 self::GET_LIST_IMMEDIATE_CHILDS_OF,
1577 self::GET_LIST_IMMEDIATE_PARENTS_OF,
1578 self::GET_LIST_IMMEDIATE_CHILDS_OF | self::GET_LIST_IMMEDIATE_PARENTS_OF
1581 $argsCheck = is_array($arOrder)
1582 && is_array($arSelectFields)
1583 && in_array($mode, $allowedModes,
true)
1589 $arFieldsMap =
array(
1590 'LESSON_ID' =>
'TL.ID',
1591 'SITE_ID' =>
'CASE WHEN (1 > 0) THEN \'no site\' ELSE \'0\' END',
1592 'WAS_CHAPTER_ID' =>
'TL.WAS_CHAPTER_ID',
1593 'KEYWORDS' =>
'TL.KEYWORDS',
1594 'CHILDS_CNT' =>
'(SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID)',
1595 'IS_CHILDS' =>
'CASE WHEN (SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID) > 0 THEN \'1\' ELSE \'0\' END',
1596 'SORT' =>
'TC.SORT',
1597 'TIMESTAMP_X' =>
$DB->DateToCharFunction(
'TL.TIMESTAMP_X'),
1598 'DATE_CREATE' =>
$DB->DateToCharFunction(
'TL.DATE_CREATE'),
1599 'CREATED_USER_NAME' =>
$DB->Concat(
"'('",
'TU.LOGIN',
"') '",
'TU.NAME',
"' '",
'TU.LAST_NAME'),
1600 'CREATED_BY' =>
'TL.CREATED_BY',
1601 'ACTIVE' =>
'TL.ACTIVE',
1602 'NAME' =>
'TL.NAME',
1603 'PREVIEW_PICTURE' =>
'TL.PREVIEW_PICTURE',
1604 'PREVIEW_TEXT' =>
'TL.PREVIEW_TEXT',
1605 'PREVIEW_TEXT_TYPE' =>
'TL.PREVIEW_TEXT_TYPE',
1606 'DETAIL_TEXT' =>
'TL.DETAIL_TEXT',
1607 'DETAIL_PICTURE' =>
'TL.DETAIL_PICTURE',
1608 'DETAIL_TEXT_TYPE' =>
'TL.DETAIL_TEXT_TYPE',
1609 'LAUNCH' =>
'TL.LAUNCH',
1610 'CODE' =>
'TL.CODE',
1611 'ACTIVE_FROM' =>
$DB->DateToCharFunction(
'TC.ACTIVE_FROM'),
1612 'ACTIVE_TO' =>
$DB->DateToCharFunction(
'TC.ACTIVE_TO'),
1613 'RATING' =>
'TC.RATING',
1614 'RATING_TYPE' =>
'TC.RATING_TYPE',
1615 'SCORM' =>
'TC.SCORM',
1616 'LINKED_LESSON_ID' =>
'TC.LINKED_LESSON_ID',
1617 'COURSE_ID' =>
'TC.ID',
1618 'COURSE_SORT' =>
'TC.SORT'
1622 if (
count($arOrder) == 0)
1623 $arOrder[
'TIMESTAMP_X'] =
'DESC';
1627 $SqlSearchLang =
'';
1640 $SqlSearchLang =
"''";
1641 foreach ($arLID as $v)
1642 $SqlSearchLang .=
", '" .
$DB->ForSql($v) .
"'";
1645 $r = $obUserFieldsSql->GetFilter();
1647 $arSqlSearch[] =
"(".$r.
")";
1650 foreach ($arSqlSearch as $value)
1653 $sqlSearch .=
' AND ' . $value;
1656 $modeSQL_join = $modeSQL_where =
'';
1657 $modeSQL_defaultSortField =
"TC.SORT";
1660 if ($mode & self::GET_LIST_IMMEDIATE_PARENTS_OF)
1663 "\nINNER JOIN b_learn_lesson_edges TLE
1664 ON TLE.SOURCE_NODE = TL.ID\n";
1666 $modeSQL_where .=
"\nAND TLE.TARGET_NODE = " . ($lessonId + 0) .
"\n";
1668 $arFieldsMap[
'EDGE_SORT'] =
'TLE.SORT';
1669 $arFieldsMap[
'SORT'] =
'TLE.SORT';
1672 if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF)
1683 "\nINNER JOIN b_learn_lesson_edges TLE
1684 ON TLE.TARGET_NODE = TL.ID\n";
1686 $modeSQL_where .=
"\nAND TLE.SOURCE_NODE = " . ($lessonId + 0) .
"\n";
1688 $arMap[
'childs_cnt'] =
'CHILDS_CNT';
1689 $arMap[
'is_childs'] =
'IS_CHILDS';
1690 $arMap[
'edge_sort'] =
'TLE.SORT';
1693 $arMap[
'sort'] = $arMap[
'edge_sort'];
1694 $modeSQL_defaultSortField =
"TLE.SORT";
1696 $arFieldsMap[
'EDGE_SORT'] =
'TLE.SORT';
1697 $arFieldsMap[
'SORT'] =
'TLE.SORT';
1700 if ($bReplaceCourseId)
1701 $arFieldsMap[
'ID'] = $arFieldsMap[
'COURSE_ID'];
1704 if (
count($arSelectFields) == 0)
1705 $arSelectFields = array_keys($arFieldsMap);
1708 foreach ($arOrder as $by =>
$order)
1710 $fieldName = mb_strtoupper($by);
1711 if ( ! in_array($fieldName, $arSelectFields) )
1712 $arSelectFields[] = $fieldName;
1718 $bDefaultSortFieldSelected =
false;
1719 foreach ($arSelectFields as $selectFieldName)
1721 if (mb_substr($selectFieldName, 0, 3) ===
'UF_')
1725 $strSqlSelect .=
', ';
1727 $bFirstPass =
false;
1729 if (!isset($arFieldsMap[$selectFieldName]))
1732 'EA_OTHER: UNKNOWN FIELD: ' . $selectFieldName,
1736 $strSqlSelect .= $arFieldsMap[$selectFieldName] .
' AS ' . $selectFieldName;
1739 ($selectFieldName ===
'SORT')
1740 && ($arFieldsMap[$selectFieldName] === $modeSQL_defaultSortField)
1743 $bDefaultSortFieldSelected =
true;
1747 if ( ! $bDefaultSortFieldSelected )
1749 if ($strSqlSelect !==
'')
1750 $strSqlSelect .=
', ';
1752 $strSqlSelect .= $modeSQL_defaultSortField .
' AS SORT';
1755 $strSqlSelect .= $obUserFieldsSql->GetSelect();
1757 $sqlLangConstraint =
'';
1759 if (mb_strlen($SqlSearchLang) > 2)
1761 $sqlLangConstraint =
"
1765 SELECT 'x' FROM b_learn_course_site TCS
1766 WHERE TC.ID = TCS.COURSE_ID AND TCS.SITE_ID IN (" . $SqlSearchLang .
")
1771 $strSqlFrom =
"FROM b_learn_lesson TL
1772 LEFT JOIN b_learn_course TC
1773 ON TC.LINKED_LESSON_ID = TL.ID
1775 ON TU.ID = TL.CREATED_BY "
1777 . $obUserFieldsSql->GetJoin(
"TL.ID")
1779 . $sqlLangConstraint
1782 if ($oPermParser->IsNeedCheckPerm())
1783 $strSqlFrom .=
" AND TL.ID IN (" . $oPermParser->SQLForAccessibleLessons() .
") ";
1785 $strSqlFrom .= $sqlSearch;
1787 $sql =
"SELECT " . $strSqlSelect .
" " . $strSqlFrom;
1789 $arSqlOrder =
array();
1790 foreach($arOrder as $by =>
$order)
1792 $by = mb_strtolower($by);
1798 if ($s = $obUserFieldsSql->getOrder(mb_strtolower($by)))
1799 $arSqlOrder[] =
' ' . $s .
' ' .
$order .
' ';
1801 if (mb_substr($by, 0, 3) !==
'uf_')
1803 if ( ! isset($arMap[$by]) )
1806 'EA_PARAMS: unknown order by field: "' . $by .
'"',
1812 $arSqlOrder[] =
' ' . $arMap[$by] .
' ' .
$order .
' ';
1818 $sql .=
' ORDER BY ' . implode(
', ', $arSqlOrder);
1820 if (is_array($arNavParams) && ( ! empty($arNavParams) ) )
1822 if (isset($arNavParams[
'nTopCount']) && ((
int) $arNavParams[
'nTopCount'] > 0))
1824 $sql =
$DB->TopSql($sql, (
int) $arNavParams[
'nTopCount']);
1825 $res =
$DB->Query($sql,
true);
1829 $res_cnt =
$DB->Query(
"SELECT COUNT(TL.ID) as C " . $strSqlFrom);
1830 $res_cnt = $res_cnt->fetch();
1831 $res =
new CDBResult();
1832 $rc =
$res->NavQuery($sql, $res_cnt[
'C'], $arNavParams,
true);
1838 $res =
$DB->Query($sql,
true);
1851 return (self::GetListUni($arOrder,
$arFilter, $arSelectFields, self::GET_LIST_ALL, -1, $arNavParams));
1857 return (self::GetListUni($arOrder,
$arFilter, $arSelectFields, self::GET_LIST_IMMEDIATE_CHILDS_OF, $lessonId, $arNavParams));
1863 return (self::GetListUni($arOrder,
$arFilter, $arSelectFields, self::GET_LIST_IMMEDIATE_PARENTS_OF, $lessonId, $arNavParams));
1869 $arOrder =
array (
'EDGE_SORT' =>
'asc'),
1871 $publishProhibitionMode =
true,
1872 $arSelectFields =
array()
1890 $arSqlSearch =
array();
1896 $cOperationType =
$res[
"OPERATION"];
1913 if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF)
1920 if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF)
1932 case 'LINKED_LESSON_ID':
1937 $arSqlSearch[] =
CLearnHelper::FilterCreate(
'(SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID)',
$val,
'number', $bFullJoin, $cOperationType);
1944 $arSqlSearch[] =
"(TC." .
$key .
" " . ($cOperationType ==
"N" ?
"<" :
">=")
1945 .
$DB->CharToDateFunction(
$DB->ForSql(
$val),
"FULL")
1946 . ($cOperationType ==
"N" ?
"" :
" OR TC.ACTIVE_FROM IS NULL")
1954 $arSqlSearch[] = ($cOperationType ==
"N" ?
" NOT" :
"")
1955 .
"((TC.ACTIVE_TO >= " .
$DB->GetNowFunction()
1956 .
" OR TC.ACTIVE_TO IS NULL) AND (TC.ACTIVE_FROM <= " .
$DB->GetNowFunction()
1957 .
" OR TC.ACTIVE_FROM IS NULL))";
1961 case "DATE_ACTIVE_TO":
1962 case "DATE_ACTIVE_FROM":
1976 case 'WAS_CHAPTER_ID':
1992 case 'DETAIL_TEXT_TYPE':
1993 case 'PREVIEW_TEXT':
1994 case 'PREVIEW_TEXT_TYPE':
1998 case 'CREATED_USER_NAME':
2000 $val,
'string', $bFullJoin, $cOperationType);
2019 case 'CHECK_PERMISSIONS':
2020 case 'CHECK_PERMISSIONS_FOR_USER_ID':
2021 case 'ACCESS_OPERATIONS':
2026 if (mb_substr(
$key, 0, 3) !==
'UF_')
2032 return $arSqlSearch;
2038 if ( ! self::_EnsureArgsStrictlyCastableToIntegers ($lessonId) )
2044 "SELECT COUNT(TARGET_NODE) AS CHILDS_COUNT
2045 FROM b_learn_lesson_edges
2046 WHERE SOURCE_NODE = '" . (
int) ($lessonId + 0) .
"'",
2053 $arData = $rc->Fetch();
2054 if ( ($arData ===
false) || ( ! isset($arData[
'CHILDS_COUNT']) ) )
2057 return ( (
int) ($arData[
'CHILDS_COUNT'] + 0) );
2078 'WAS_CHAPTER_ID' => $chapterId,
2079 'CHECK_PERMISSIONS' =>
'N'
2088 $row = $rc->Fetch();
2089 if ( ! isset($row[
'LESSON_ID']) )
2092 return ( (
int) $row[
'LESSON_ID'] );
2099 final public static function GetListOfAncestors ($lessonId, $stopAtLessonId =
false, $stopBeforeLessonId =
false, $arIgnoreEdges =
array())
2101 $arAncestors =
array();
2104 foreach ($arOPathes as $oPath)
2105 $arAncestors = array_merge($arAncestors, array_map(
'intval', $oPath->GetPathAsArray()));
2107 array_unique($arAncestors);
2109 return ($arAncestors);
2121 $arAlreadyProcessedLessons =
array($lessonId);
2122 if ($breakOnLessonId !==
false)
2129 foreach ($arEdges as $arEdge)
2130 $arAlreadyProcessedLessons[] = (int) $arEdge[
'PARENT_LESSON'];
2133 if ($breakBeforeLesson !==
false)
2134 $arAlreadyProcessedLessons[] = (int) $breakBeforeLesson;
2138 $arObjPathes =
array();
2139 foreach ($arAllPathes as $arPathBackward)
2141 $arPath = array_reverse($arPathBackward);
2146 if ($o->Count() > 0)
2147 $arObjPathes[] = $o;
2150 return ($arObjPathes);
2157 $must_be_stopped = 0x1;
2163 $arParents =
array();
2164 foreach ($arEdges as $arEdge)
2166 $parentLessonId = (int) $arEdge[
'PARENT_LESSON'];
2167 if ( ! in_array($parentLessonId, $arAlreadyProcessedLessons,
true) )
2169 $isEdgeIgnored =
false;
2170 foreach ($arIgnoreEdges as $arIgnoreEdge)
2173 ($arIgnoreEdge[
'PARENT_LESSON'] == $arEdge[
'PARENT_LESSON'])
2174 && ($arIgnoreEdge[
'CHILD_LESSON'] == $arEdge[
'CHILD_LESSON'])
2177 $isEdgeIgnored =
true;
2182 if ( ! $isEdgeIgnored )
2184 $arParents[] = $parentLessonId;
2187 $arAlreadyProcessedLessons[] = $parentLessonId;
2192 $must_be_stopped &= (int) (
count($arParents) === 0);
2195 foreach ($arParents as $parentLessonId)
2197 $parentLessonId = (int) $parentLessonId;
2201 $arPathTmp[] = $parentLessonId;
2202 $arPathesNew[] = $arPathTmp;
2206 $arPathesNew[
$key][] = $parentLessonId;
2211 if ($must_be_stopped)
2212 return ($arPathesNew);
2214 return (self::GetListOfParentPathesRecursive($arPathesNew, $arAlreadyProcessedLessons, $arIgnoreEdges));
2223 $lessonId = (int) $in_lessonId;
2224 $contextCourseLessonId = (int) $in_contextCourseLessonId;
2227 "SELECT COURSE_LESSON_ID
2228 FROM b_learn_publish_prohibition
2229 WHERE COURSE_LESSON_ID = $contextCourseLessonId
2230 AND PROHIBITED_LESSON_ID = $lessonId
2238 $arData = $rc->Fetch();
2239 if ($arData ===
false)
2251 if ( ! is_bool($in_isProhibited) )
2257 $lessonId = (int) $in_lessonId;
2258 $contextCourseLessonId = (int) $in_contextCourseLessonId;
2263 if ($isProhibitedNow !== $in_isProhibited)
2265 if ($in_isProhibited)
2267 $sql =
"INSERT INTO b_learn_publish_prohibition
2268 (COURSE_LESSON_ID, PROHIBITED_LESSON_ID)
2269 VALUES ($contextCourseLessonId, $lessonId)";
2273 $sql =
"DELETE FROM b_learn_publish_prohibition
2274 WHERE COURSE_LESSON_ID = $contextCourseLessonId
2275 AND PROHIBITED_LESSON_ID = $lessonId";
2278 $rc =
$DB->Query($sql,
true);
2307 $lessonId = (int) $in_lessonId;
2308 $purgeMode = (int) $in_purgeMode;
2313 self::PUBLISH_PROHIBITION_PURGE_ALL_LESSONS_IN_COURSE_CONTEXT,
2314 self::PUBLISH_PROHIBITION_PURGE_LESSON_IN_ALL_COURSE_CONTEXT,
2315 self::PUBLISH_PROHIBITION_PURGE_BOTH
2325 $arSqlCondition =
array();
2327 if ($purgeMode & self::PUBLISH_PROHIBITION_PURGE_ALL_LESSONS_IN_COURSE_CONTEXT)
2328 $arSqlCondition[] =
'COURSE_LESSON_ID = ' . $lessonId;
2330 if ($purgeMode & self::PUBLISH_PROHIBITION_PURGE_LESSON_IN_ALL_COURSE_CONTEXT)
2331 $arSqlCondition[] =
'PROHIBITED_LESSON_ID = ' . $lessonId;
2333 if (
count($arSqlCondition) > 0)
2335 $sqlCondition = implode(
' OR ', $arSqlCondition);
2338 "DELETE FROM b_learn_publish_prohibition
2339 WHERE " . $sqlCondition,
2428 $arAncestors[] = (int) $in_parentLessonId;
2431 $arAncestorsInt =
array();
2432 foreach ($arAncestors as $ancestroId)
2433 $arAncestorsInt[] = (int) $ancestroId;
2437 "SELECT COURSE_LESSON_ID, PROHIBITED_LESSON_ID
2438 FROM b_learn_publish_prohibition
2439 WHERE COURSE_LESSON_ID IN (" . implode (
',', $arAncestorsInt) .
")"
2448 $arIgnoreEdges =
array(
2450 'PARENT_LESSON' => (
int) $in_parentLessonId,
2451 'CHILD_LESSON' => (
int) $in_childLessonId
2455 $arCache_ancestorsOfLesson =
array();
2456 while ($arData = $rc->Fetch())
2458 $prohibitedLessonId = (int) $arData[
'PROHIBITED_LESSON_ID'];
2459 $contextLessonId = (int) $arData[
'COURSE_LESSON_ID'];
2463 if ( ! isset($arCache_ancestorsOfLesson[$prohibitedLessonId]) )
2465 $arCache_ancestorsOfLesson[$prohibitedLessonId] =
2467 $prohibitedLessonId,
2475 if ( ! in_array($contextLessonId, $arCache_ancestorsOfLesson[$prohibitedLessonId],
true) )
if($_SERVER $defaultValue['REQUEST_METHOD']==="GET" &&!empty($RestoreDefaults) && $bizprocPerms==="W" &&check_bitrix_sessid())
static indexLesson($lessonId)
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
static GetList($arOrder=array(), $arFilter=array(), $arNavParams=array())
static CourseGetLinkedLesson($courseId)
static GetList($arOrder=array(), $arFilter=array(), $bHz=false, $arNavParams=array(), $arSelect=array())
static GetInstance($in_userId)
const OP_LESSON_UNLINK_FROM_PARENTS
const OP_LESSON_UNLINK_DESCENDANTS
static CanUserAddLessonToParentLesson($arParams)
static CanUserAddLessonWithoutParentLesson($arParams=array())
static Update($id, $arInFields)
static Create($arInFields)
static GetProperty($parentNodeId, $childNodeId, $propertyName)
static SetProperty($parentNodeId, $childNodeId, $propertyName, $value)
static Link($parentNodeId, $childNodeId, $arProperties)
static ListImmediateNeighbours($nodeId)
static Unlink($parentNodeId, $childNodeId)
static ListImmediateChilds($nodeId)
static ListImmediateParents($nodeId)
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
static MkOperationFilter($key)
const PUBLISH_PROHIBITION_PURGE_BOTH
static _ExtractAdditionalCourseFields(&$arFields)
static PublishProhibitionPurge_OnBeforeRelationRemove($in_parentLessonId, $in_childLessonId)
static GetLinkedCourse($lessonId)
static _EnsureArgsStrictlyCastableToIntegers()
const GET_LIST_IMMEDIATE_PARENTS_OF
static _CanonizeAndCheckAdditionalParamsForAddCourse($arFields, $forUpdate=false)
static ListImmediateParents($lessonId)
static Delete($lesson_id)
static RelationGet($parentLessonId, $childLessonId)
static GetCourseToLessonMap($bRefreshCache=false)
static GetCourseToLessonMap_ReloadCache()
static GetListUni($arOrder=array(), $arFilter=array(), $arSelectFields=array(), $mode=self::GET_LIST_ALL, $lessonId=-1, $arNavParams=array())
static _funcDelete_ParseOptions($lesson_id)
static DeleteRecursiveLikeHardlinks($in_data)
static GetListOfParentPathes($lessonId, $breakOnLessonId=false, $breakBeforeLesson=false, $arIgnoreEdges=array())
static GetFilter($arFilter=array(), $mode)
static Add($arFields, $isCourse=false, $parentLessonId=true, $arProperties=array('SORT'=> 500), $isCheckPermissions=true, $checkPermissionsForUserId=-1)
static RelationAdd($parentLessonId, $childLessonId, $arProperties)
static IsPublishProhibited($in_lessonId, $in_contextCourseLessonId)
static ListImmediateChilds($lessonId)
static GetListOfAncestors($lessonId, $stopAtLessonId=false, $stopBeforeLessonId=false, $arIgnoreEdges=array())
static GetCourseToLessonMap_LoadFromDB()
static PublishProhibitionPurge($in_lessonId, $in_purgeMode)
const GET_LIST_IMMEDIATE_CHILDS_OF
static CourseBecomeLesson($courseId)
static RelationUpdate($parentLessonId, $childLessonId, $arProperties)
static PublishProhibitionSetTo($in_lessonId, $in_contextCourseLessonId, $in_isProhibited)
static CountImmediateChilds($lessonId)
static ListImmediateNeighbours($lessonId)
static BecomeCourse($lessonId, $arFields)
static GetListOfParentPathesRecursive($arPathes, &$arAlreadyProcessedLessons, $arIgnoreEdges=array())
static GetListOfImmediateChilds($lessonId, $arOrder=array(), $arFilter=array(), $arSelectFields=array(), $arNavParams=array())
static LessonIdByChapterId($chapterId)
static GetListOfImmediateParents($lessonId, $arOrder=array(), $arFilter=array(), $arSelectFields=array(), $arNavParams=array())
const PUBLISH_PROHIBITION_PURGE_ALL_LESSONS_IN_COURSE_CONTEXT
static Update($id, $arFields)
static GetTree( $lessonId, $arOrder=array('EDGE_SORT'=> 'asc'), $arFilter=array(), $publishProhibitionMode=true, $arSelectFields=array())
static GetList($arOrder=array(), $arFilter=array(), $arSelectFields=array(), $arNavParams=array())
static RelationRemove($parentLessonId, $childLessonId)
const PUBLISH_PROHIBITION_PURGE_LESSON_IN_ALL_COURSE_CONTEXT
static StaticParser($arOptions, $arParseParams)
const EXC_ERR_ALL_ACCESS_DENIED
const EXC_ERR_LL_UNREMOVABLE_CL
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
static GetLinkedCourse($lessonId)
static GetListOfImmediateChilds($lessonId, $arOrder=array(), $arFilter=array(), $arSelectFields=array())
static ListImmediateParents($lessonId)
static IsPublishProhibited($lessonId, $contextCourseLessonId)
static RelationGet($parentLessonId, $childLessonId)
static Add($arFields, $isCourse=false, $parentLessonId=true, $arProperties=array('SORT'=> 500))
static PublishProhibitionSetTo($lessonId, $contextCourseLessonId, $isProhibited)
static GetTree( $lessonId, $arOrder=array('EDGE_SORT'=> 'asc'), $arFilter=array(), $publishProhibitionMode=true)
static RelationAdd($parentLessonId, $childLessonId, $arProperties)
static DeleteRecursiveLikeHardlinks($id)
static ListImmediateChilds($lessonId)
static RelationUpdate($parentLessonId, $childLessonId, $arProperties)
static GetListOfParentPathes($lessonId, $breakOnLessonId=false, $breakBeforeLessonId=false, $arIgnoreEdges=array())
static CountImmediateChilds($lessonId)
static ListImmediateNeighbours($lessonId)
static GetListOfImmediateParents($lessonId, $arOrder=array(), $arFilter=array(), $arSelectFields=array())
static Update($id, $arFields)
static GetList($arOrder=array(), $arFilter=array())
static RelationRemove($parentLessonId, $childLessonId)
ExecuteModuleEventEx($arEvent, $arParams=[])
DelDuplicateSort(&$arSort)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</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."%"
$GLOBALS['_____370096793']
if( $site[ 'SERVER_NAME']==='') if($site['SERVER_NAME']==='') $arProperties