Example #1
0
 public static final function Delete($lesson_id)
 {
     global $USER_FIELD_MANAGER;
     list($lesson_id, $simulate, $check_permissions, $user_id) = self::_funcDelete_ParseOptions($lesson_id);
     if ($check_permissions) {
         $oAccess = CLearnAccess::GetInstance($user_id);
         if (!$oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_REMOVE)) {
             throw new LearnException('EA_ACCESS_DENIED', LearnException::EXC_ERR_ALL_ACCESS_DENIED);
         }
     }
     // Parents and childs of the lesson
     $arNeighboursEdges = self::ListImmediateNeighbours($lesson_id);
     // precache rights for lesson
     if ($check_permissions) {
         $IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS = $oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS);
         $IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS = $oAccess->IsLessonAccessible($lesson_id, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS);
     }
     foreach (GetModuleEvents('learning', 'OnBeforeLessonDelete', true) as $arEvent) {
         ExecuteModuleEventEx($arEvent, array($lesson_id));
     }
     foreach ($arNeighboursEdges as $arEdge) {
         $child_lesson_id = (int) $arEdge['CHILD_LESSON'];
         $parent_lesson_id = (int) $arEdge['PARENT_LESSON'];
         if ($check_permissions) {
             $IsLessonAccessible = false;
             if ($child_lesson_id === $lesson_id) {
                 // if we will be remove edge to parent - use precached rights for OP_LESSON_UNLINK_FROM_PARENTS
                 $IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_FROM_PARENTS && $oAccess->IsLessonAccessible($parent_lesson_id, CLearnAccess::OP_LESSON_UNLINK_DESCENDANTS);
             } elseif ($parent_lesson_id === $lesson_id) {
                 // if we will be remove edge to child - use precached rights for OP_LESSON_UNLINK_DESCENDANTS
                 $IsLessonAccessible = $IsLessonAccessibleFor_OP_LESSON_UNLINK_DESCENDANTS && $oAccess->IsLessonAccessible($child_lesson_id, CLearnAccess::OP_LESSON_UNLINK_FROM_PARENTS);
             } else {
                 throw new LearnException('EA_FATAL: $lesson_id (' . $lesson_id . ') not equal to one of: $child_lesson_id (' . $child_lesson_id . '), $parent_lesson_id (' . $parent_lesson_id . ')', LearnException::EXC_ERR_ALL_LOGIC | LearnException::EXC_ERR_ALL_GIVEUP);
             }
             if (!$IsLessonAccessible) {
                 throw new LearnException('EA_ACCESS_DENIED', LearnException::EXC_ERR_ALL_ACCESS_DENIED);
             }
             if ($simulate === false) {
                 self::RelationRemove($parent_lesson_id, $child_lesson_id);
             }
         }
     }
     $linkedCourseId = self::GetLinkedCourse($lesson_id);
     // If lesson is course, remove course
     if ($linkedCourseId !== false) {
         global $DB;
         if ($simulate === false) {
             if (!$DB->Query("DELETE FROM b_learn_course_site WHERE COURSE_ID = " . (int) $linkedCourseId, true)) {
                 throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP);
             }
             $rc = self::CourseBecomeLesson($linkedCourseId);
             // if course cannot be converted to lesson - don't remove lesson
             if ($rc === false) {
                 throw new LearnException('EA_OTHER: lesson is unremovable because linked course is in use.', LearnException::EXC_ERR_LL_UNREMOVABLE_CL);
             }
             // reload cache of LINKED_LESSON_ID -> COURSE_ID
             self::GetCourseToLessonMap_ReloadCache();
             if (CModule::IncludeModule("search")) {
                 CSearch::DeleteIndex("learning", false, "C" . $linkedCourseId);
                 CSearch::DeleteIndex("learning", "C" . $linkedCourseId);
             }
         }
     }
     // And remove lesson
     if ($simulate === false) {
         global $DB;
         $r = $DB->Query("SELECT PREVIEW_PICTURE, DETAIL_PICTURE \n\t\t\t\tFROM b_learn_lesson \n\t\t\t\tWHERE ID = " . (int) $lesson_id, true);
         if ($r === false) {
             throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP);
         }
         $arRes = $r->Fetch();
         if (!$arRes) {
             throw new LearnException('EA_SQLERROR', LearnException::EXC_ERR_ALL_GIVEUP);
         }
         CFile::Delete($arRes['PREVIEW_PICTURE']);
         CFile::Delete($arRes['DETAIL_PICTURE']);
         // Remove questions
         $q = CLQuestion::GetList(array(), array('LESSON_ID' => $lesson_id));
         while ($arQ = $q->Fetch()) {
             if (!CLQuestion::Delete($arQ['ID'])) {
                 throw new LearnException('EA_QUESTION_NOT_REMOVED', LearnException::EXC_ERR_ALL_GIVEUP);
             }
         }
         CLearnGraphNode::Remove($lesson_id);
         $USER_FIELD_MANAGER->delete('LEARNING_LESSONS', $lesson_id);
         CLearnCacheOfLessonTreeComponent::MarkAsDirty();
         CEventLog::add(array('AUDIT_TYPE_ID' => 'LEARNING_REMOVE_ITEM', 'MODULE_ID' => 'learning', 'ITEM_ID' => 'L #' . $lesson_id, 'DESCRIPTION' => 'lesson removed'));
         if (CModule::IncludeModule('search')) {
             CSearch::DeleteIndex('learning', false, 'L' . $lesson_id);
             CSearch::DeleteIndex('learning', 'L' . $lesson_id);
         }
     }
     if ($simulate === false) {
         foreach (GetModuleEvents('learning', 'OnAfterLessonDelete', true) as $arEvent) {
             ExecuteModuleEventEx($arEvent, array($lesson_id));
         }
     }
 }
Example #2
0
 }
 //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;
         }
         $arContent["DEPTH_LEVEL"] -= $baseDepthLevel;
         if ($arContent["TYPE"] == "CH") {
             $arContent["URL"] = CComponentEngine::MakePathFromTemplate($arParams["CHAPTER_DETAIL_TEMPLATE"], array("CHAPTER_ID" => '0' . $arContent["ID"], "COURSE_ID" => $arParams["COURSE_ID"]));
         } else {
             $arContent["URL"] = CComponentEngine::MakePathFromTemplate($arParams["LESSON_DETAIL_TEMPLATE"], array("LESSON_ID" => $arContent["ID"], "COURSE_ID" => $arParams["COURSE_ID"]));
                if (!$cl->Update($ID, $arFields)) {
                    if ($e = $APPLICATION->GetException()) {
                        $lAdmin->AddGroupError(GetMessage("SAVE_ERROR") . $ID . ": " . $e->GetString(), $ID);
                    }
                }
                break;
        }
    }
}
// fetch data
if (isset($_REQUEST["mode"]) && $_REQUEST["mode"] == "excel") {
    $arNavParams = array();
} else {
    $arNavParams = array('nPageSize' => CAdminResult::GetNavSize($sTableID));
}
$rsData = CLQuestion::GetList(array($by => $order), $arFilter, true, $arNavParams);
$rsData = new CAdminResult($rsData, $sTableID);
// navigation string setup
$lAdmin->NavText($rsData->GetNavPrint(GetMessage("LEARNING_QUESTION")));
// list header
$lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "sort" => "id", "default" => true), array("id" => "ACTIVE", "content" => GetMessage('LEARNING_COURSE_ADM_ACT'), "sort" => "active", "default" => true), array("id" => "TIMESTAMP_X", "content" => GetMessage('LEARNING_COURSE_ADM_DATECH'), "sort" => "timestamp_x", "default" => true), array("id" => "NAME", "content" => GetMessage('LEARNING_NAME'), "sort" => "name", "default" => true), array("id" => "SORT", "content" => GetMessage('LEARNING_COURSE_ADM_SORT'), "sort" => "sort", "default" => true), array("id" => "SELF", "content" => GetMessage('LEARNING_QUESTION_ADM_SELF'), "sort" => "self", "default" => true), array("id" => "CORRECT_REQUIRED", "content" => GetMessage('LEARNING_QUESTION_ADM_REQUIRED'), "sort" => "correct_required", "default" => true), array("id" => "QUESTION_TYPE", "content" => GetMessage('LEARNING_QUESTION_ADM_TYPE'), "sort" => "type", "default" => true), array("id" => "POINT", "content" => GetMessage('LEARNING_QUESTION_ADM_POINT'), "sort" => "point", "default" => true), array("id" => "ANSWERS_STATS", "content" => GetMessage('LEARNING_QUESTION_ADM_STATS'), "default" => true)));
$arQuestions = array();
$arQuestionsIds = array();
while ($arRes = $rsData->Fetch()) {
    $arQuestionsIds[] = (int) $arRes['ID'];
    $arQuestions[] = $arRes;
}
$arMultiStats = CLAnswer::getMultiStats($arQuestionsIds);
// building list
foreach ($arQuestions as $arRes) {
    extract($arRes, EXTR_PREFIX_ALL, 'f');
Example #4
0
 /**
  * <p>Возвращает вопрос по идентификатору.</p>
  *
  *
  * @param int $ID  Идентификатор вопроса.
  *
  * @return CDBResult <p>Возвращается объект <a
  * href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>.</p> </h
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?
  * if (CModule::IncludeModule("learning"))
  * {
  *     $QUESTION_ID = 289;
  *     
  *     $res = CLQuestion::GetByID($QUESTION_ID);
  * 
  *     if ($arQuestion = $res-&gt;GetNext())
  *     {
  *         echo "Name: ".$arQuestion["NAME"];
  *     }
  * }
  * ?&gt;
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a> </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php#question">Поля вопроса</a> </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/learning/classes/clquestion/index.php">CLQuestion</a>::<a
  * href="http://dev.1c-bitrix.ru/api_help/learning/classes/clquestion/getlist.php">GetList</a> </li> </ul> <a
  * name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/learning/classes/clquestion/getbyid.php
  * @author Bitrix
  */
 public static function GetByID($ID)
 {
     return CLQuestion::GetList($arOrder = array(), $arFilter = array("ID" => $ID));
 }
Example #5
0
 $arLesson["PREVIEW_PICTURE_ARRAY"] = CFile::GetFileArray($arLesson["PREVIEW_PICTURE"]);
 $arLesson["DETAIL_PICTURE_ARRAY"] = CFile::GetFileArray($arLesson["DETAIL_PICTURE"]);
 // For backward compatibility with template`
 $arLesson['ID'] = $arLesson['LESSON_ID'];
 // Resolve links "?COURSE_ID={SELF}". Don't relay on it, this behaviour
 // can be changed in future without any notifications.
 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"]);
Example #6
0
         }
     }
     if ($arResult["NAV"]["PAGE_NUMBER"] > floor($arParams["PAGE_WINDOW"] / 2) + 1 && $arResult["NAV"]["PAGE_COUNT"] > $arParams["PAGE_WINDOW"]) {
         $arResult["NAV"]["START_PAGE"] = $arResult["NAV"]["PAGE_NUMBER"] - floor($arParams["PAGE_WINDOW"] / 2);
     } else {
         $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;
     }
 }
                break;
            case "required":
            case "derequired":
                $cl = new CLQuestion();
                $arFields = array("CORRECT_REQUIRED" => $_REQUEST['action'] == "required" ? "Y" : "N");
                if (!$cl->Update($ID, $arFields)) {
                    if ($e = $APPLICATION->GetException()) {
                        $lAdmin->AddGroupError(GetMessage("SAVE_ERROR") . $ID . ": " . $e->GetString(), $ID);
                    }
                }
                break;
        }
    }
}
// fetch data
$rsData = CLQuestion::GetList(array($by => $order), $arFilter, true);
$rsData = new CAdminResult($rsData, $sTableID);
$rsData->NavStart();
// navigation string setup
$lAdmin->NavText($rsData->GetNavPrint(GetMessage("LEARNING_QUESTION")));
// list header
$lAdmin->AddHeaders(array(array("id" => "ID", "content" => "ID", "sort" => "id", "default" => true), array("id" => "ACTIVE", "content" => GetMessage('LEARNING_COURSE_ADM_ACT'), "sort" => "active", "default" => true), array("id" => "TIMESTAMP_X", "content" => GetMessage('LEARNING_COURSE_ADM_DATECH'), "sort" => "timestamp_x", "default" => true), array("id" => "NAME", "content" => GetMessage('LEARNING_NAME'), "sort" => "name", "default" => true), array("id" => "SORT", "content" => GetMessage('LEARNING_COURSE_ADM_SORT'), "sort" => "sort", "default" => true), array("id" => "SELF", "content" => GetMessage('LEARNING_QUESTION_ADM_SELF'), "sort" => "self", "default" => true), array("id" => "CORRECT_REQUIRED", "content" => GetMessage('LEARNING_QUESTION_ADM_REQUIRED'), "sort" => "correct_required", "default" => true), array("id" => "QUESTION_TYPE", "content" => GetMessage('LEARNING_QUESTION_ADM_TYPE'), "sort" => "type", "default" => true), array("id" => "POINT", "content" => GetMessage('LEARNING_QUESTION_ADM_POINT'), "sort" => "point", "default" => true), array("id" => "ANSWERS_STATS", "content" => GetMessage('LEARNING_QUESTION_ADM_STATS'), "default" => true)));
// building list
while ($arRes = $rsData->NavNext(true, "f_")) {
    $row =& $lAdmin->AddRow($f_ID, $arRes);
    $arStat = CLAnswer::GetStats($f_ID);
    $row->AddCheckField("SELF");
    $row->AddCheckField("ACTIVE");
    $row->AddCheckField("CORRECT_REQUIRED");
    $row->AddInputField("NAME", array("size" => "35"));
    $row->AddInputField("SORT", array("size" => "3"));