Example #1
0
 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);
 }
Example #2
0
 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;
 }
Example #3
0
    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;
    }
Example #4
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 "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;
 }
Example #5
0
 /**
  * @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;
 }
Example #6
0
                $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());
Example #7
0
 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);
 }
Example #8
0
 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;
 }
Example #9
0
//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();
Example #10
0
 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;
 }
Example #11
0
 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);
 }
Example #12
0
 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;
 }
Example #13
0
 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;
 }
Example #14
0
        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)) {
Example #15
0
 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) {
Example #16
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;
 }
Example #18
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 "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;

	}
Example #19
0
 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;
 }
Example #20
0
 }
 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;
         }
Example #21
0
 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;
 }