private static function getFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case 'LESSON_ID': case 'LEARNING_GROUP_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('LGL.' . $key, $val, 'number', $bFullJoin, $cOperationType); break; } } return array_filter($arSqlSearch); }
function GetFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "STUDENT_ID": case "COURSE_ID": case "SORT": case "SUMMARY": case "MAX_SUMMARY": $arSqlSearch[] = CLearnHelper::FilterCreate("CER." . $key, $val, "number", $bFullJoin, $cOperationType); break; case "ACTIVE": case "PUBLIC_PROFILE": case "FROM_ONLINE": $arSqlSearch[] = CLearnHelper::FilterCreate("CER." . $key, $val, "string_equal", $bFullJoin, $cOperationType); break; case "TIMESTAMP_X": case "DATE_CREATE": $arSqlSearch[] = CLearnHelper::FilterCreate("CER." . $key, $val, "date", $bFullJoin, $cOperationType); break; case "USER": $arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME", $val); break; } } return $arSqlSearch; }
public static function GetFilter($arFilter) { global $DBType; if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "SORT": case "LESSON_ID": case "POINT": $arSqlSearch[] = CLearnHelper::FilterCreate("CQ." . $key, $val, "number", $bFullJoin, $cOperationType); break; case "COURSE_ID": // was: $arSqlSearch[] = CLearnHelper::FilterCreate("C.".$key, $val, "number", $bFullJoin, $cOperationType); $courseLessonId = CCourse::CourseGetLinkedLesson($val); if ($courseLessonId === false) { break; } // it is not a course, so skipping if ($DBType === 'oracle') { // This subquery gets ids of all childs lesson for given $courseLessonId $subQuery = "\n\t\t\t\t\t\t\tSELECT TLE.TARGET_NODE\n\t\t\t\t\t\t\tFROM b_learn_lesson_edges TLE\n\t\t\t\t\t\t\tSTART WITH TLE.SOURCE_NODE=" . ($courseLessonId + 0) . "\n\t\t\t\t\t\t\tCONNECT BY NOCYCLE PRIOR TLE.TARGET_NODE = TLE.SOURCE_NODE"; // But we need also $courseLessonId itself, so final clause will be: $arSqlSearch[] = '(CQ.LESSON_ID IN (' . $subQuery . ') OR CQ.LESSON_ID = ' . ($courseLessonId + 0) . ')'; } elseif ($DBType === 'mysql' || $DBType === 'mssql') { // MySQL & MSSQL supports "WHERE IN(...)" clause for more than 10 000 elements // add to sql "WHERE" constraint: lessons id only from given array $sqlCourseLessonsIdsList = ''; $oTree = CLearnLesson::GetTree($courseLessonId); $arChildLessonForCourse = $oTree->GetLessonsIdListInTree(); // root lesson not in tree, so add it $arChildLessonForCourse[] = $courseLessonId; // We need escape data for SQL $arChildLessonForCourseEscaped = array_map('intval', $arChildLessonForCourse); $sqlCourseLessonsIdsList = implode(', ', $arChildLessonForCourseEscaped); if (strlen($sqlCourseLessonsIdsList) > 0) { $arSqlSearch[] = 'CQ.LESSON_ID IN (' . $sqlCourseLessonsIdsList . ')'; } } else { throw new LearnException('Unsupported DB engine: ' . $DBType, LearnException::EXC_ERR_ALL_GIVEUP); } break; case "NAME": $arSqlSearch[] = CLearnHelper::FilterCreate("CQ." . $key, $val, "string", $bFullJoin, $cOperationType); break; case "QUESTION_TYPE": case "ACTIVE": case "SELF": case "CORRECT_REQUIRED": $arSqlSearch[] = CLearnHelper::FilterCreate("CQ." . $key, $val, "string_equal", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }
public static function GetFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "USER_ID": case "TRANSCRIPT": $arSqlSearch[] = CLearnHelper::FilterCreate("S." . $key, $val, "number", $bFullJoin, $cOperationType); break; case "PUBLIC_PROFILE": $arSqlSearch[] = CLearnHelper::FilterCreate("S." . $key, $val, "string_equal", $bFullJoin, $cOperationType); break; case "RESUME": $arSqlSearch[] = CLearnHelper::FilterCreate("S." . $key, $val, "string", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }
/** * @access protected * @throws LearnException with error bit set EXC_ERR_ALL_PARAMS */ protected static function GetFilter($arFilter = array(), $mode) { global $DB; if (!is_array($arFilter)) { throw new LearnException('EA_PARAMS', LearnException::EXC_ERR_ALL_PARAMS); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { // for courses only case 'COURSE_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('TC.ID', $val, 'number', $bFullJoin, $cOperationType); break; case 'COURSE_SORT': $arSqlSearch[] = CLearnHelper::FilterCreate('TC.SORT', $val, 'number', $bFullJoin, $cOperationType); break; case 'EDGE_SORT': // edges table (TLE) available only if requested immediate childs of some parent lesson if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF) { $arSqlSearch[] = CLearnHelper::FilterCreate('TLE.SORT', $val, 'number', $bFullJoin, $cOperationType); } else { throw new LearnException('EA_PARAMS: unknown field ' . $key, LearnException::EXC_ERR_ALL_PARAMS); } break; case 'SORT': if ($mode & self::GET_LIST_IMMEDIATE_CHILDS_OF) { // edges table (TLE) available only if requested immediate childs of some parent lesson $arSqlSearch[] = CLearnHelper::FilterCreate('TLE.SORT', $val, 'number', $bFullJoin, $cOperationType); } else { // so, by default sort by b_learn_course.SORT (for partially backward compatibility) $arSqlSearch[] = CLearnHelper::FilterCreate('TC.SORT', $val, 'number', $bFullJoin, $cOperationType); } break; case 'LINKED_LESSON_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('TC.' . $key, $val, 'number', $bFullJoin, $cOperationType, false); break; case 'CHILDS_CNT': $arSqlSearch[] = CLearnHelper::FilterCreate('(SELECT COUNT(*) FROM b_learn_lesson_edges TLES WHERE TLES.SOURCE_NODE = TL.ID)', $val, 'number', $bFullJoin, $cOperationType); break; case 'ACTIVE_FROM': case 'ACTIVE_TO': if (strlen($val) > 0) { $arSqlSearch[] = "(TC." . $key . " " . ($cOperationType == "N" ? "<" : ">=") . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? "" : " OR TC.ACTIVE_FROM IS NULL") . ")"; } break; case "ACTIVE_DATE": if (strlen($val) > 0) { $arSqlSearch[] = ($cOperationType == "N" ? " NOT" : "") . "((TC.ACTIVE_TO >= " . $DB->GetNowFunction() . " OR TC.ACTIVE_TO IS NULL) AND (TC.ACTIVE_FROM <= " . $DB->GetNowFunction() . " OR TC.ACTIVE_FROM IS NULL))"; } break; case "DATE_ACTIVE_TO": case "DATE_ACTIVE_FROM": $arSqlSearch[] = CLearnHelper::FilterCreate("TC." . $key, $val, 'date', $bFullJoin, $cOperationType); break; case 'RATING_TYPE': $arSqlSearch[] = CLearnHelper::FilterCreate('TC.' . $key, $val, 'string', $bFullJoin, $cOperationType); break; case 'RATING': case 'SCORM': $arSqlSearch[] = CLearnHelper::FilterCreate('TC.' . $key, $val, 'string_equal', $bFullJoin, $cOperationType); break; // for all lessons // for all lessons case 'WAS_CHAPTER_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.WAS_CHAPTER_ID', $val, 'number', $bFullJoin, $cOperationType); break; case 'LESSON_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.ID', $val, 'number', $bFullJoin, $cOperationType); break; case 'CREATED_BY': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.' . $key, $val, 'number', $bFullJoin, $cOperationType); break; case 'NAME': case 'CODE': case 'LAUNCH': case 'DETAIL_TEXT': case 'DETAIL_TEXT_TYPE': case 'PREVIEW_TEXT': case 'PREVIEW_TEXT_TYPE': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.' . $key, $val, 'string', $bFullJoin, $cOperationType); break; case 'CREATED_USER_NAME': $arSqlSearch[] = CLearnHelper::FilterCreate($DB->Concat("'('", 'TU.LOGIN', "') '", 'TU.NAME', "' '", 'TU.LAST_NAME'), $val, 'string', $bFullJoin, $cOperationType); break; case 'KEYWORDS': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.' . $key, $val, 'string', $bFullJoin, $cOperationType); break; case 'ACTIVE': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.' . $key, $val, 'string_equal', $bFullJoin, $cOperationType); break; case 'TIMESTAMP_X': case 'DATE_CREATE': $arSqlSearch[] = CLearnHelper::FilterCreate('TL.' . $key, $val, 'date', $bFullJoin, $cOperationType); break; case 'SITE_ID': break; case 'CHECK_PERMISSIONS': case 'CHECK_PERMISSIONS_FOR_USER_ID': case 'ACCESS_OPERATIONS': // this is meta-fields, nothing to do with them here break; default: if (substr($key, 0, 3) !== 'UF_') { throw new LearnException('EA_PARAMS: unknown field ' . $key, LearnException::EXC_ERR_ALL_PARAMS); } break; } } return $arSqlSearch; }
$arResult["NAV"]["START_PAGE"] = 1; } if ($arResult["NAV"]["PAGE_NUMBER"] <= $arResult["NAV"]["PAGE_COUNT"] - floor($arParams["PAGE_WINDOW"] / 2) && $arResult["NAV"]["START_PAGE"] + $arParams["PAGE_WINDOW"] - 1 <= $arResult["NAV"]["PAGE_COUNT"]) { $arResult["NAV"]["END_PAGE"] = $arResult["NAV"]["START_PAGE"] + $arParams["PAGE_WINDOW"] - 1; } else { $arResult["NAV"]["END_PAGE"] = $arResult["NAV"]["PAGE_COUNT"]; if ($arResult["NAV"]["END_PAGE"] - $arParams["PAGE_WINDOW"] + 1 >= 1) { $arResult["NAV"]["START_PAGE"] = $arResult["NAV"]["END_PAGE"] - $arParams["PAGE_WINDOW"] + 1; } } $rsQuestion = CLQuestion::GetList(array(), array("ID" => $arResult["QBAR"][$arResult["NAV"]["PAGE_NUMBER"]]["QUESTION_ID"])); $arResult["QUESTION"] = $rsQuestion->GetNext(); // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any notifications. if (isset($arResult["QUESTION"]['DESCRIPTION'])) { $arResult["QUESTION"]['DESCRIPTION'] = CLearnHelper::PatchLessonContentLinks($arResult["QUESTION"]['DESCRIPTION'], $arParams['COURSE_ID']); } $arResult["QUESTION"]["FILE"] = CFile::GetFileArray($arResult["QUESTION"]["FILE_ID"]); //Answers $arResult["QUESTION"]["ANSWERS"] = array(); $arSort = $arTest["RANDOM_ANSWERS"] == "Y" || $arResult["QUESTION"]["QUESTION_TYPE"] == "R" ? array("RAND" => "RAND", "SORT" => "ASC") : array("SORT" => "ASC"); $rsAnswer = CLAnswer::GetList($arSort, array("QUESTION_ID" => $arResult["QUESTION"]["ID"])); while ($arAnswer = $rsAnswer->GetNext()) { $arResult["QUESTION"]["ANSWERS"][] = $arAnswer; } } } $arResult["SAFE_REDIRECT_PAGE"] = htmlspecialcharsbx($arResult["REDIRECT_PAGE"]); } $linkedLessonId = CCourse::CourseGetLinkedLesson($arResult['TEST']['COURSE_ID']); $bCanEdit = $linkedLessonId !== false && (CLearnAccessMacroses::CanUserEditLesson(array('lesson_id' => $linkedLessonId)) || $USER->IsAdmin());
public static function FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType = false, $bSkipEmpty = true) { // refactored: body of function moved to CLearnHelper class return CLearnHelper::FilterCreate($fname, $vals, $type, $bFullJoin, $cOperationType, $bSkipEmpty); }
public function ImportPackage() { if (!$this->CreateCourse()) { return false; } $this->CreateContent(); CLearnHelper::CopyDirFiles($this->package_dir . "/resources", $_SERVER["DOCUMENT_ROOT"] . "/" . COption::GetOptionString("main", "upload_dir", "upload") . "/learning/" . $this->COURSE_ID, true, true); return true; }
//Courses $rsCourse = CCourse::GetList(array("SORT" => "ASC"), array("ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "SITE_ID" => LANG)); while ($arCourse = $rsCourse->GetNext()) { //Test list Url $arCourse["TESTS_LIST_URL"] = CComponentEngine::MakePathFromTemplate($arParams["TESTS_LIST_TEMPLATE"], array("COURSE_ID" => $arCourse["ID"])); //Course Url $arCourse["COURSE_DETAIL_URL"] = CComponentEngine::MakePathFromTemplate($arParams["COURSE_DETAIL_TEMPLATE"], array("COURSE_ID" => $arCourse["ID"])); $arCourse["COMPLETED"] = array_key_exists($arCourse["ID"], $arResult["CERTIFICATES"]); if (!$arCourse["COMPLETED"]) { $rsTest = CTest::GetList(array(), array("COURSE_ID" => $arCourse["ID"], "ACTIVE" => "Y", 'CHECK_PERMISSIONS' => 'N')); $rsTest->NavStart(1); $arCourse["NO_TESTS"] = !$rsTest->SelectedRowsCount(); } // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any notifications. if (isset($arCourse['DETAIL_TEXT'])) { $arCourse['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks($arCourse['DETAIL_TEXT'], $arCourse['ID']); } if (isset($arCourse['PREVIEW_TEXT'])) { $arCourse['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks($arCourse['PREVIEW_TEXT'], $arCourse['ID']); } $arResult["COURSES"][] = $arCourse; } unset($arCertificate); unset($arCourse); //Set Title $arParams["SET_TITLE"] = $arParams["SET_TITLE"] == "N" ? "N" : "Y"; if ($arParams["SET_TITLE"] == "Y") { $APPLICATION->SetTitle(GetMessage("LEARNING_CERTIFICATES_TITLE")); } $this->IncludeComponentTemplate();
function GetFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "SORT": case "QUESTION_ID": $arSqlSearch[] = CLearnHelper::FilterCreate("CA." . $key, $val, "number", $bFullJoin, $cOperationType); break; case "ANSWER": $arSqlSearch[] = CLearnHelper::FilterCreate("CA." . $key, $val, "string", $bFullJoin, $cOperationType); break; case "CORRECT": $arSqlSearch[] = CLearnHelper::FilterCreate("CA." . $key, $val, "string_equal", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }
private static function getFilter($arFilter) { global $DB; if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case 'ID': case 'SORT': case 'COURSE_LESSON_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'number', $bFullJoin, $cOperationType); break; case 'ACTIVE': $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'string_equal', $bFullJoin, $cOperationType); break; case 'ACTIVE_FROM': case 'ACTIVE_TO': if ($val !== null) { $arSqlSearch[] = CLearnHelper::FilterCreate('LG.' . $key, $val, 'date', $bFullJoin, $cOperationType); } break; case 'TITLE': case 'CODE': $arSqlSearch[] = CLearnHelper::FilterCreate("LG." . $key, $val, "string", $bFullJoin, $cOperationType); break; case 'COURSE_TITLE': $arSqlSearch[] = CLearnHelper::FilterCreate("LL.NAME", $val, "string", $bFullJoin, $cOperationType); break; case 'MEMBER_ID': $arSqlSearch[] = CLearnHelper::FilterCreate('LGM.USER_ID', $val, 'number', $bFullJoin, $cOperationType); break; default: if (substr($key, 0, 3) !== 'UF_') { throw new LearnException('Unknown field: ' . $key, LearnException::EXC_ERR_ALL_PARAMS); } break; } } return array_filter($arSqlSearch); }
public function ImportPackage() { $resources = $this->objXML->SelectNodes("/manifest/resources/"); $this->arResources = $resources->__toArray(); $this->arResources = $this->arResources["#"]["resource"]; if (!$this->CreateCourse()) { return false; } $this->CreateContent(); CLearnHelper::CopyDirFiles($this->package_dir, $_SERVER["DOCUMENT_ROOT"] . "/" . COption::GetOptionString("main", "upload_dir", "upload") . "/learning/scorm/" . $this->COURSE_ID, true, true); return true; }
function GetFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "SCORE": case "TEST_ID": $arSqlSearch[] = CLearnHelper::FilterCreate("TM." . $key, $val, "number", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }
return; exit; } } $rsCourse = CCourse::GetList(array(), array("ID" => $arParams["COURSE_ID"], "ACTIVE" => "Y", "ACTIVE_DATE" => "Y", "SITE_ID" => LANG, "CHECK_PERMISSIONS" => 'N')); if (!($arCourse = $rsCourse->GetNext())) { ShowError(GetMessage("LEARNING_COURSE_DENIED")); return; } // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any nitifications. if (isset($arCourse['DETAIL_TEXT'])) { $arCourse['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks($arCourse['DETAIL_TEXT'], $arParams["COURSE_ID"]); } if (isset($arCourse['PREVIEW_TEXT'])) { $arCourse['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks($arCourse['PREVIEW_TEXT'], $arParams["COURSE_ID"]); } //arResult $arResult = array("ITEMS" => array(), "COURSE" => $arCourse); //Set Title $arParams["SET_TITLE"] = $arParams["SET_TITLE"] == "N" ? "N" : "Y"; if ($arParams["SET_TITLE"] == "Y") { $APPLICATION->SetTitle($arResult["COURSE"]["NAME"]); } $parent =& $this->GetParent(); //Course description item $url = CComponentEngine::MakePathFromTemplate($arParams["COURSE_DETAIL_TEMPLATE"], array("COURSE_ID" => $arParams["COURSE_ID"])); $arResult["ITEMS"][] = array("NAME" => GetMessage("LEARNING_COURSE_DESCRIPTION"), "URL" => $url, "TYPE" => "CD", "SELECTED" => $parent->arResult["VARIABLES"]["INDEX"] == "Y", "DEPTH_LEVEL" => 1); $CHAPTER_ID = $parent->arResult["VARIABLES"]["CHAPTER_ID"]; if ($CHAPTER_ID > 0) { if (CLearnPath::IsUrlencodedPath($CHAPTER_ID)) {
if (isset($arLesson['DETAIL_TEXT'])) { $arLesson['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks($arLesson['DETAIL_TEXT'], $arParams['COURSE_ID']); } if (isset($arLesson['PREVIEW_TEXT'])) { $arLesson['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks($arLesson['PREVIEW_TEXT'], $arParams['COURSE_ID']); } //arResult $arResult = array("LESSON" => $arLesson, "QUESTIONS" => array(), "QUESTIONS_COUNT" => 0, "ERROR_MESSAGE" => ""); //Questions $obquestion = CLQuestion::GetList($arOrder = array("SORT" => "ASC", "ID" => "ASC"), $arFilter = array("LESSON_ID" => $arParams["LESSON_ID"], "ACTIVE" => "Y", "SELF" => "Y", 'CHECK_PERMISSIONS' => 'N')); while ($arQuestion = $obquestion->GetNext()) { $obanswer = CLAnswer::GetList(array("SORT" => "ASC"), array("QUESTION_ID" => $arQuestion["ID"])); // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any notifications. if (isset($arQuestion['DESCRIPTION'])) { $arQuestion['DESCRIPTION'] = CLearnHelper::PatchLessonContentLinks($arQuestion['DESCRIPTION'], $arParams['COURSE_ID']); } $arQuestion["FILE"] = CFile::GetFileArray($arQuestion["FILE_ID"]); $arQuestion["ANSWERS"] = array(); while ($arAnswer = $obanswer->GetNext()) { $arQuestion["ANSWERS"][] = $arAnswer; } if ($arQuestion["QUESTION_TYPE"] == "R") { $arQuestion["ANSWERS_ORIGINAL"] = $arQuestion["ANSWERS"]; shuffle($arQuestion["ANSWERS"]); } $arResult["QUESTIONS"][] = $arQuestion; } $arResult["QUESTIONS_COUNT"] = count($arResult["QUESTIONS"]); //Errors if ($arResult["QUESTIONS_COUNT"] <= 0) {
public static function GetFilter($arFilter) { if (!is_array($arFilter)) $arFilter = Array(); $arSqlSearch = Array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "ATTEMPT_ID": case "QUESTION_ID": case "POINT": $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "number", $bFullJoin, $cOperationType); break; case "RESPONSE": $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "string", $bFullJoin, $cOperationType); break; case "QUESTION_NAME": $arSqlSearch[] = CLearnHelper::FilterCreate("Q.NAME", $val, "string", $bFullJoin, $cOperationType); break; case "ANSWERED": case "CORRECT": $arSqlSearch[] = CLearnHelper::FilterCreate("TR.".$key, $val, "string_equal", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }
public static function CopyDirFiles($path_from, $path_to, $ReWrite = True, $Recursive = False) { if (strpos($path_to . "/", $path_from . "/") === 0 || realpath($path_to) === realpath($path_from)) { return false; } if (is_dir($path_from)) { CheckDirPath($path_to . "/"); } elseif (is_file($path_from)) { $p = bxstrrpos($path_to, "/"); $path_to_dir = substr($path_to, 0, $p); CheckDirPath($path_to_dir . "/"); if (file_exists($path_to) && !$ReWrite) { return False; } @copy($path_from, $path_to); if (is_file($path_to)) { @chmod($path_to, BX_FILE_PERMISSIONS); } return True; } else { return True; } if ($handle = @opendir($path_from)) { while (($file = readdir($handle)) !== false) { if ($file == "." || $file == "..") { continue; } // skip files with non-safe names if (!CLearnHelper::IsBaseFilenameSafe($file)) { continue; } if (is_dir($path_from . "/" . $file) && $Recursive) { self::CopyDirFiles($path_from . "/" . $file, $path_to . "/" . $file, $ReWrite, $Recursive); } elseif (is_file($path_from . "/" . $file)) { if (file_exists($path_to . "/" . $file) && !$ReWrite) { continue; } @copy($path_from . "/" . $file, $path_to . "/" . $file); @chmod($path_to . "/" . $file, BX_FILE_PERMISSIONS); } } @closedir($handle); return true; } return false; }
public static function GetFilter($arFilter) { if (!is_array($arFilter)) $arFilter = Array(); $arSqlSearch = Array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "STUDENT_ID": case "TEST_ID": case "RESULT": case "MAX_RESULT": $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "number", $bFullJoin, $cOperationType); break; case "COMPLETED": $arSqlSearch[] = CLearnHelper::FilterCreate("G.".$key, $val, "string_equal", $bFullJoin, $cOperationType); break; case "USER": $arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME",$val); break; } } return $arSqlSearch; }
protected static function _CreateAttemptQuestions($arCallbackSqlFormer, $ATTEMPT_ID) { global $APPLICATION, $DB, $DBType; $ATTEMPT_ID = intval($ATTEMPT_ID); $attempt = CTestAttempt::GetByID($ATTEMPT_ID); if (!($arAttempt = $attempt->Fetch())) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_ATTEMPT_ID_EX"), "ERROR_NO_ATTEMPT_ID"); return false; } $test = CTest::GetByID($arAttempt["TEST_ID"]); if (!($arTest = $test->Fetch())) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_ID_EX"), "ERROR_NO_TEST_ID"); return false; } $strSql = "DELETE FROM b_learn_test_result WHERE ATTEMPT_ID = " . $ATTEMPT_ID; if (!$DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__)) { return false; } /** * QUESTIONS_FROM values: * 'L' - X questions from every lesson in course * 'C' - X questions from every lesson from every chapter in the course * In this case questions taken from immediate lessons of all chapters (X per chapter) in the course. * In new data model it means, get X questions from every lesson in the course, except * 1) immediate lessons-childs of the course and * 2) lessons, contains other lessons (because, in old data model chapters doesn't contains questions) * * 'H' - all questions from the selected chapter (recursive) in the course * This case must be ignored, because converter to new data model updates 'H' to 'R', but in case * when chapter is not exists updates didn't become. So QUESTIONS_FROM stayed in 'H' value. And it means, * that there is no chapter exists with QUESTIONS_FROM_ID, so we can't do work. And we should just * ignore, for backward compatibility (so, don't throw an error). * 'S' - all questions from the selected lesson (unilesson_id in QUESTIONS_FROM_ID) * 'A' - all questions of the course (nothing interesting in QUESTIONS_FROM_ID) * * new values: * 'R' - all questions from the tree with root at selected lesson (include questions of selected lesson) * in the course (unilesson_id in QUESTIONS_FROM_ID) */ if ($arTest["QUESTIONS_FROM"] == "C" || $arTest["QUESTIONS_FROM"] == "L") { $courseId = $arTest['COURSE_ID'] + 0; $courseLessonId = CCourse::CourseGetLinkedLesson($courseId); if ($courseLessonId === false) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } $clauseAllChildsLessons = CLearnHelper::SQLClauseForAllSubLessons($courseLessonId); if ($arTest["QUESTIONS_FROM"] == "C") { $strSql = "SELECT Q.ID as QUESTION_ID, TLEUP.SOURCE_NODE as FROM_ID\n\t\t\t\tFROM b_learn_lesson L\n\t\t\t\tINNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID\n\t\t\t\tINNER JOIN b_learn_lesson_edges TLEUP ON L.ID = TLEUP.TARGET_NODE\n\t\t\t\tLEFT OUTER JOIN b_learn_lesson_edges TLEDOWN ON L.ID = TLEDOWN.SOURCE_NODE " . "WHERE L.ID IN (" . $clauseAllChildsLessons . ") \n" . " AND TLEDOWN.SOURCE_NODE IS NULL \n" . " AND TLEUP.SOURCE_NODE IN (" . $clauseAllChildsLessons . ") \n" . " AND Q.ACTIVE = 'Y' " . ($arTest["INCLUDE_SELF_TEST"] != "Y" ? "AND Q.SELF = 'N' " : "") . "ORDER BY " . ($arTest["RANDOM_QUESTIONS"] == "Y" ? CTest::GetRandFunction() : "L.SORT, Q.SORT"); } else { $strSql = "SELECT Q.ID as QUESTION_ID, L.ID as FROM_ID " . "FROM b_learn_lesson L " . "INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID " . "WHERE L.ID IN (" . $clauseAllChildsLessons . ") AND Q.ACTIVE = 'Y' " . ($arTest["INCLUDE_SELF_TEST"] != "Y" ? "AND Q.SELF = 'N' " : "") . "ORDER BY " . ($arTest["RANDOM_QUESTIONS"] == "Y" ? CTest::GetRandFunction() : "L.SORT, Q.SORT"); } if (!($res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__))) { return false; } $Values = array(); $tmp = array(); while ($arRecord = $res->Fetch()) { if (is_set($tmp, $arRecord["FROM_ID"])) { if ($tmp[$arRecord["FROM_ID"]] < $arTest["QUESTIONS_AMOUNT"]) { $tmp[$arRecord["FROM_ID"]]++; } else { continue; } } else { $tmp[$arRecord["FROM_ID"]] = 1; } $Values[] = $arRecord["QUESTION_ID"]; } if (empty($Values)) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } $DB->StartTransaction(); foreach ($Values as $ID) { $strSql = "INSERT INTO b_learn_test_result (ATTEMPT_ID, QUESTION_ID) VALUES (" . $ATTEMPT_ID . "," . $ID . ")"; if (!$DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__)) { $DB->Rollback(); return false; } } $DB->Commit(); } elseif (($arTest["QUESTIONS_FROM"] == "H" || $arTest["QUESTIONS_FROM"] == "S" || $arTest["QUESTIONS_FROM"] == "R") && $arTest["QUESTIONS_FROM_ID"]) { $WHERE = ''; if ($arTest["QUESTIONS_FROM"] == "H") { /** * 'H' - all questions from the selected chapter (recursive) in the course * This case must be ignored, because converter to new data model updates 'H' to 'R', but in case * when chapter is not exists updates didn't become. So QUESTIONS_FROM stayed in 'H' value. And it means, * that there is no chapter exists with QUESTIONS_FROM_ID, so we can't do work. And we should just * ignore, for backward compatibility (so, don't throw an error). */ $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } elseif ($arTest["QUESTIONS_FROM"] == 'R') { $clauseAllChildsLessons = CLearnHelper::SQLClauseForAllSubLessons($arTest['QUESTIONS_FROM_ID']); $WHERE = " (L.ID IN(" . $clauseAllChildsLessons . ") OR (L.ID = " . ($arTest['QUESTIONS_FROM_ID'] + 0) . ")) "; } elseif ($arTest["QUESTIONS_FROM"] == 'S') { $clauseAllChildsLessons = $arTest["QUESTIONS_FROM_ID"] + 0; $WHERE = " (L.ID IN(" . $clauseAllChildsLessons . ") OR (L.ID = " . ($arTest['QUESTIONS_FROM_ID'] + 0) . ")) "; } else { return false; } $strSql = "INSERT INTO b_learn_test_result (ATTEMPT_ID, QUESTION_ID) " . "SELECT " . $ATTEMPT_ID . " ,Q.ID " . "FROM b_learn_lesson L " . "INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID " . "WHERE " . $WHERE . " AND Q.ACTIVE = 'Y' " . ($arTest["INCLUDE_SELF_TEST"] != "Y" ? "AND Q.SELF = 'N' " : "") . "ORDER BY " . ($arTest["RANDOM_QUESTIONS"] == "Y" ? CTest::GetRandFunction() : "Q.SORT ") . ($arTest["QUESTIONS_AMOUNT"] > 0 ? "LIMIT " . $arTest["QUESTIONS_AMOUNT"] : ""); //echo $strSql;exit; $q = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!$q || intval($q->AffectedRowsCount()) <= 0) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } } elseif ($arTest["QUESTIONS_FROM"] == 'A') { $courseId = $arTest['COURSE_ID'] + 0; $courseLessonId = CCourse::CourseGetLinkedLesson($courseId); if ($courseLessonId === false) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } $clauseAllChildsLessons = CLearnHelper::SQLClauseForAllSubLessons($courseLessonId); $strSql = call_user_func($arCallbackSqlFormer, $ATTEMPT_ID, $arTest, $clauseAllChildsLessons, $courseLessonId); //echo $strSql; exit; $q = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (!$q || intval($q->AffectedRowsCount()) <= 0) { $APPLICATION->ThrowException(GetMessage("LEARNING_BAD_TEST_IS_EMPTY"), "ERROR_TEST_IS_EMPTY"); return false; } } else { return false; } $strSql = "UPDATE b_learn_attempt SET QUESTIONS = '" . CTestResult::GetCount($ATTEMPT_ID) . "' WHERE ID = " . $ATTEMPT_ID; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); return true; }
} if ($rsChapter === false || !($arChapter = $rsChapter->GetNext())) { $this->AbortResultCache(); ShowError(GetMessage("LEARNING_CHAPTER_DENIED")); return; } //Images $arChapter["PREVIEW_PICTURE_ARRAY"] = CFile::GetFileArray($arChapter["PREVIEW_PICTURE"]); $arChapter["DETAIL_PICTURE_ARRAY"] = CFile::GetFileArray($arChapter["DETAIL_PICTURE"]); // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour // can be changed in future without any notifications. if (isset($arChapter['DETAIL_TEXT'])) { $arChapter['DETAIL_TEXT'] = CLearnHelper::PatchLessonContentLinks($arChapter['DETAIL_TEXT'], $arParams['COURSE_ID']); } if (isset($arChapter['PREVIEW_TEXT'])) { $arChapter['PREVIEW_TEXT'] = CLearnHelper::PatchLessonContentLinks($arChapter['PREVIEW_TEXT'], $arParams['COURSE_ID']); } // Self test page URL $arChapter["SELF_TEST_URL"] = CComponentEngine::MakePathFromTemplate($arParams["SELF_TEST_TEMPLATE"], array("LESSON_ID" => $arParams["CHAPTER_ID"], "SELF_TEST_ID" => $arParams["CHAPTER_ID"], "COURSE_ID" => $arParams["COURSE_ID"])); //Self test exists? $rsQuestion = CLQuestion::GetList(array(), array("LESSON_ID" => $arParams["CHAPTER_ID"], "ACTIVE" => "Y", "SELF" => "Y")); $arChapter["SELF_TEST_EXISTS"] = (bool) $rsQuestion->Fetch(); $arResult = array("COURSE" => $arCourse, "CHAPTER" => $arChapter, "CONTENTS" => array()); //Included chapters and lessons $rsContent = CCourse::GetCourseContent($arParams["COURSE_ID"], array()); $foundChapter = false; while ($arContent = $rsContent->GetNext()) { if ($foundChapter) { if ($arContent["DEPTH_LEVEL"] <= $baseDepthLevel) { break; }
function GetFilter($arFilter) { if (!is_array($arFilter)) { $arFilter = array(); } $arSqlSearch = array(); foreach ($arFilter as $key => $val) { $res = CLearnHelper::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ID": case "SORT": case "COURSE_ID": case "ATTEMPT_LIMIT": case "TIME_LIMIT": $arSqlSearch[] = CLearnHelper::FilterCreate("LT." . $key, $val, "number", $bFullJoin, $cOperationType); break; case "NAME": case "DESCRIPTION": $arSqlSearch[] = CLearnHelper::FilterCreate("LT." . $key, $val, "string", $bFullJoin, $cOperationType); break; case "ACTIVE": case "APPROVED": case "INCLUDE_SELF_TEST": case "RANDOM_ANSWERS": case "RANDOM_QUESTIONS": case "QUESTIONS_FROM": case "QUESTIONS_FROM_ID": case "PASSAGE_TYPE": $arSqlSearch[] = CLearnHelper::FilterCreate("LT." . $key, $val, "string_equal", $bFullJoin, $cOperationType); break; } } return $arSqlSearch; }