protected static function _GetList($arOrder = array(), $arFilter = array(), $arSelect = array(), $arCallbackSqlFormer)
 {
     global $DB, $USER, $APPLICATION, $USER_FIELD_MANAGER;
     $obUserFieldsSql = new CUserTypeSQL();
     $obUserFieldsSql->SetEntity("LEARN_ATTEMPT", "A.ID");
     $obUserFieldsSql->SetSelect($arSelect);
     $obUserFieldsSql->SetFilter($arFilter);
     $obUserFieldsSql->SetOrder($arOrder);
     $arFields = array("ID" => "A.ID", "TEST_ID" => "A.TEST_ID", "OBY_DATE_END" => "A.DATE_END", "STUDENT_ID" => "A.STUDENT_ID", "DATE_START" => $DB->DateToCharFunction("A.DATE_START", "FULL"), "DATE_END" => $DB->DateToCharFunction("A.DATE_END", "FULL"), "STATUS" => "A.STATUS", "COMPLETED" => "A.COMPLETED", "SCORE" => "A.SCORE", "MAX_SCORE" => "A.MAX_SCORE", "QUESTIONS" => "A.QUESTIONS", "TEST_NAME" => "T.NAME", "USER_NAME" => $DB->Concat("'('", 'U.LOGIN', "') '", "CASE WHEN U.NAME IS NULL THEN '' ELSE U.NAME END", "' '", "CASE WHEN U.LAST_NAME IS NULL THEN '' ELSE U.LAST_NAME END"), "USER_ID" => "U.ID", "MARK" => "TM.MARK", "MESSAGE" => "TM.DESCRIPTION");
     if (count($arSelect) <= 0 || in_array("*", $arSelect)) {
         $arSelect = array_keys($arFields);
     }
     $arSqlSelect = array();
     foreach ($arSelect as $field) {
         $field = strtoupper($field);
         if (array_key_exists($field, $arFields)) {
             $arSqlSelect[$field] = $arFields[$field] . " AS " . $field;
         }
     }
     $sSelect = implode(",\n", $arSqlSelect);
     if (!is_array($arFilter)) {
         $arFilter = array();
     }
     $arSqlSearch = CTestAttempt::GetFilter($arFilter);
     $strSqlSearch = "";
     $arSqlSearchCnt = count($arSqlSearch);
     for ($i = 0; $i < $arSqlSearchCnt; $i++) {
         if (strlen($arSqlSearch[$i]) > 0) {
             $strSqlSearch .= " AND " . $arSqlSearch[$i] . " ";
         }
     }
     $r = $obUserFieldsSql->GetFilter();
     if (strlen($r) > 0) {
         $strSqlSearch .= " AND (" . $r . ") ";
     }
     $bCheckPerm = 'ORPHANED VAR';
     $strSql = call_user_func($arCallbackSqlFormer, $sSelect, $obUserFieldsSql, $bCheckPerm, $USER, $arFilter, $strSqlSearch);
     if (!is_array($arOrder)) {
         $arOrder = array();
     }
     foreach ($arOrder as $by => $order) {
         $by = strtolower($by);
         $order = strtolower($order);
         if ($order != "asc") {
             $order = "desc";
         }
         if ($by == "id") {
             $arSqlOrder[] = " A.ID " . $order . " ";
         } elseif ($by == "test_id") {
             $arSqlOrder[] = " A.TEST_ID " . $order . " ";
         } elseif ($by == "student_id") {
             $arSqlOrder[] = " A.STUDENT_ID " . $order . " ";
         } elseif ($by == "date_start") {
             $arSqlOrder[] = " A.DATE_START " . $order . " ";
         } elseif ($by == "date_end") {
             $arSqlOrder[] = " A.DATE_END " . $order . " ";
         } elseif ($by == "status") {
             $arSqlOrder[] = " A.STATUS " . $order . " ";
         } elseif ($by == "score") {
             $arSqlOrder[] = " A.SCORE " . $order . " ";
         } elseif ($by == "max_score") {
             $arSqlOrder[] = " A.MAX_SCORE " . $order . " ";
         } elseif ($by == "completed") {
             $arSqlOrder[] = " A.COMPLETED " . $order . " ";
         } elseif ($by == "questions") {
             $arSqlOrder[] = " A.QUESTIONS " . $order . " ";
         } elseif ($by == "user_name") {
             $arSqlOrder[] = " USER_NAME " . $order . " ";
         } elseif ($by == "test_name") {
             $arSqlOrder[] = " TEST_NAME " . $order . " ";
         } elseif ($s = $obUserFieldsSql->GetOrder($by)) {
             $arSqlOrder[$by] = " " . $s . " " . $order . " ";
         } else {
             $arSqlOrder[] = " A.ID " . $order . " ";
             $by = "id";
         }
     }
     $strSqlOrder = "";
     DelDuplicateSort($arSqlOrder);
     $arSqlOrderCnt = count($arSqlOrder);
     for ($i = 0; $i < $arSqlOrderCnt; $i++) {
         if ($i == 0) {
             $strSqlOrder = " ORDER BY ";
         } else {
             $strSqlOrder .= ",";
         }
         $strSqlOrder .= $arSqlOrder[$i];
     }
     $strSql .= $strSqlOrder;
     //echo $strSql;
     $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
     $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARN_ATTEMPT"));
     return $res;
 }
Exemple #2
0
 /**
  * <p>Возвращает список попыток по фильтру <b>arFilter</b>, отсортированный в порядке <b>arOrder</b>. Учитываются права доступа текущего пользователя.</p>
  *
  *
  * @param array $arrayarOrder = Array("ID"=>"DESC") Массив для сортировки результата. Массив вида <i>array("поле
  * сортировки"=&gt;"направление сортировки" [, ...])</i>.<br>Поле для
  * сортировки может принимать значения: <ul> <li> <b>ID</b> - идентификатор
  * попытки; </li> <li> <b>TEST_ID</b> - идентификатор теста; </li> <li> <b>STUDENT_ID</b> -
  * идентификатор студента ; </li> <li> <b>DATE_START</b> - дата начала попытки; </li>
  * <li> <b>DATE_END</b> - дата окончания попытки; </li> <li> <b>STATUS</b> - статус
  * попытки; </li> <li> <b>SCORE</b> - количество баллов; </li> <li> <b>MAX_SCORE</b> -
  * максимальное количество баллов; </li> <li> <b>COMPLETED</b> - тест пройден; </li>
  * <li> <b>QUESTIONS</b> - количество вопросов; </li> <li> <b>USER_NAME</b> - имя студента ;
  * </li> <li> <b>TEST_NAME</b> - название теста. </li> </ul>Направление сортировки
  * может принимать значения: <ul> <li> <b>asc</b> - по возрастанию; </li> <li>
  * <b>desc</b> - по убыванию; </li> </ul>Необязательный. По умолчанию
  * сортируется по убыванию идентификатора попытки.
  *
  * @param array $arrayarFilter = Array() Массив вида <i>array("фильтруемое поле"=&gt;"значение фильтра" [, ...])</i>.
  * Фильтруемое поле может принимать значения: <ul> <li> <b>ID</b> -
  * идентификатор попытки; </li> <li> <b>TEST_ID</b> - идентификатор теста; </li> <li>
  * <b>STUDENT_ID</b> - идентификатор студента; </li> <li> <b>SCORE</b> - количество
  * баллов; </li> <li> <b>MAX_SCORE</b> - максимальное количество баллов; </li> <li>
  * <b>QUESTIONS</b> - количество вопросов; </li> <li> <b>STATUS</b> - статус попытки (B -
  * тестирование началось, D - тест прерван, F - тест закончен.); </li> <li>
  * <b>COMPLETED</b> - тест пройден (Y|N); </li> <li> <b>DATE_START</b> - дата начала попытки;
  * </li> <li> <b>DATE_END</b> - дата окончания попытки; </li> <li> <b>USER</b> -
  * пользователь (возможны сложные условия по полям пользователя ID,
  * LOGIN, NAME, LAST_NAME); </li> <li> <b>MIN_PERMISSION</b> - минимальный уровень доcтупа. По
  * умолчанию "R". Список прав доступа см. в <a
  * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ccourse/setpermission.php">CCourse::SetPermission</a>. </li>
  * <li> <b>CHECK_PERMISSIONS</b> - проверять уровень доступа. Если установлено
  * значение "N" - права доступа не проверяются. </li> </ul>Перед названием
  * фильтруемого поля может указать тип фильтрации: <ul> <li>"!" - не равно
  * </li> <li>"&lt;" - меньше </li> <li>"&lt;=" - меньше либо равно </li> <li>"&gt;" - больше
  * </li> <li>"&gt;=" - больше либо равно </li> </ul> <br>"<i>значения фильтра</i>" -
  * одиночное значение или массив.<br><br>Необязательный. По умолчанию
  * записи не фильтруются.
  *
  * @param array $arrayarSelect = Array() Массив полей записей, которые будут возвращены методом.<br><br>
  * Значение по умолчанию - пустой массив array() - означает, что будут
  * возвращены все поля основной таблицы запроса.
  *
  * @param array $arrayarNavParams = Array() Массив настроек постраничной навигации.
  *
  * @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"))
  * {
  *     $TEST_ID = 45;
  *     $res = CTestAttempt::GetList(
  *         Array("ID" =&gt; "ASC"), 
  *         Array("TEST_ID" =&gt; $TEST_ID)
  *     );
  * 
  *     while ($arAttempt = $res-&gt;GetNext())
  *     {
  *         echo "Attempt ID:".$arAttempt["ID"]."; Date start: ".$arAttempt["DATE_START"]."; Test name: ".$arAttempt["TEST_NAME"]."&lt;br&gt;";
  *     }
  * }
  * 
  * ?&gt;
  * 
  * &lt;?
  * 
  * if (CModule::IncludeModule("learning"))
  * {
  *     $TEST_ID = 45;
  *     $STUDENT_ID = 3;
  * 
  *     $res = CTestAttempt::GetList(
  *         Array("SCORE" =&gt; "DESC"), 
  *         Array("CHECK_PERMISSIONS" =&gt; "N", "TEST_ID" =&gt; $TEST_ID, "STUDENT_ID" =&gt; $STUDENT_ID)
  *     );
  * 
  *     while ($arAttempt = $res-&gt;GetNext())
  *     {
  *         echo "Attempt ID:".$arAttempt["ID"]."; Date start: ".$arAttempt["DATE_START"]."; Test name: ".$arAttempt["TEST_NAME"]."&lt;br&gt;";
  *     }
  * }
  * 
  * ?&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/classes/ctestattempt/index.php">CTestAttempt</a>::<a
  * href="http://dev.1c-bitrix.ru/api_help/learning/classes/ctestattempt/getbyid.php">GetByID</a> </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/learning/fields.php#attempt">Поля попытки</a> </li> </ul> <a
  * name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/learning/classes/ctestattempt/getlist.php
  * @author Bitrix
  */
 public static function GetList($arOrder = array(), $arFilter = array(), $arSelect = array(), $arNavParams = array())
 {
     global $DB, $USER, $USER_FIELD_MANAGER;
     $obUserFieldsSql = new CUserTypeSQL();
     $obUserFieldsSql->SetEntity("LEARN_ATTEMPT", "A.ID");
     $obUserFieldsSql->SetSelect($arSelect);
     $obUserFieldsSql->SetFilter($arFilter);
     $obUserFieldsSql->SetOrder($arOrder);
     $arFields = array("ID" => "A.ID", "TEST_ID" => "A.TEST_ID", "OBY_DATE_END" => "A.DATE_END", "STUDENT_ID" => "A.STUDENT_ID", "DATE_START" => $DB->DateToCharFunction("A.DATE_START", "FULL"), "DATE_END" => $DB->DateToCharFunction("A.DATE_END", "FULL"), "STATUS" => "A.STATUS", "COMPLETED" => "A.COMPLETED", "SCORE" => "A.SCORE", "MAX_SCORE" => "A.MAX_SCORE", "QUESTIONS" => "A.QUESTIONS", "TEST_NAME" => "T.NAME", "USER_NAME" => $DB->Concat("'('", 'U.LOGIN', "') '", "CASE WHEN U.NAME IS NULL THEN '' ELSE U.NAME END", "' '", "CASE WHEN U.LAST_NAME IS NULL THEN '' ELSE U.LAST_NAME END"), "USER_ID" => "U.ID", "MARK" => "TM.MARK", "MESSAGE" => "TM.DESCRIPTION", "LINKED_LESSON_ID" => "C.LINKED_LESSON_ID", "COURSE_ID" => "C.ID", "SPEED" => self::getSpeedFieldSql());
     if (count($arSelect) <= 0 || in_array("*", $arSelect)) {
         $arSelect = array_keys($arFields);
     }
     $arSqlSelect = array();
     foreach ($arSelect as $field) {
         $field = strtoupper($field);
         if (array_key_exists($field, $arFields)) {
             $arSqlSelect[$field] = $arFields[$field] . " AS " . $field;
         }
     }
     $sSelect = implode(",\n", $arSqlSelect);
     if (!is_array($arFilter)) {
         $arFilter = array();
     }
     $arSqlSearch = CTestAttempt::GetFilter($arFilter);
     $strSqlSearch = "";
     $arSqlSearchCnt = count($arSqlSearch);
     for ($i = 0; $i < $arSqlSearchCnt; $i++) {
         if (strlen($arSqlSearch[$i]) > 0) {
             $strSqlSearch .= " AND " . $arSqlSearch[$i] . " ";
         }
     }
     $r = $obUserFieldsSql->GetFilter();
     if (strlen($r) > 0) {
         $strSqlSearch .= " AND (" . $r . ") ";
     }
     $bCheckPerm = 'ORPHANED VAR';
     $strSqlFrom = '';
     $strSql = static::_GetListSQLFormer($sSelect, $obUserFieldsSql, $bCheckPerm, $USER, $arFilter, $strSqlSearch, $strSqlFrom);
     if (!is_array($arOrder)) {
         $arOrder = array();
     }
     foreach ($arOrder as $by => $order) {
         $by = strtolower($by);
         $order = strtolower($order);
         if ($order != "asc") {
             $order = "desc";
         }
         if ($by == "id") {
             $arSqlOrder[] = " A.ID " . $order . " ";
         } elseif ($by == "test_id") {
             $arSqlOrder[] = " A.TEST_ID " . $order . " ";
         } elseif ($by == "student_id") {
             $arSqlOrder[] = " A.STUDENT_ID " . $order . " ";
         } elseif ($by == "date_start") {
             $arSqlOrder[] = " A.DATE_START " . $order . " ";
         } elseif ($by == "date_end") {
             $arSqlOrder[] = " A.DATE_END " . $order . " ";
         } elseif ($by == "status") {
             $arSqlOrder[] = " A.STATUS " . $order . " ";
         } elseif ($by == "score") {
             $arSqlOrder[] = " A.SCORE " . $order . " ";
         } elseif ($by == "max_score") {
             $arSqlOrder[] = " A.MAX_SCORE " . $order . " ";
         } elseif ($by == "completed") {
             $arSqlOrder[] = " A.COMPLETED " . $order . " ";
         } elseif ($by == "questions") {
             $arSqlOrder[] = " A.QUESTIONS " . $order . " ";
         } elseif ($by == "user_name") {
             $arSqlOrder[] = " USER_NAME " . $order . " ";
         } elseif ($by == "test_name") {
             $arSqlOrder[] = " TEST_NAME " . $order . " ";
         } elseif ($by == "speed") {
             $arSqlOrder[] = " SPEED " . $order . " ";
         } elseif ($s = $obUserFieldsSql->GetOrder($by)) {
             $arSqlOrder[$by] = " " . $s . " " . $order . " ";
         } else {
             $arSqlOrder[] = " A.ID " . $order . " ";
         }
     }
     $strSqlOrder = "";
     DelDuplicateSort($arSqlOrder);
     $arSqlOrderCnt = count($arSqlOrder);
     for ($i = 0; $i < $arSqlOrderCnt; $i++) {
         if ($i == 0) {
             $strSqlOrder = " ORDER BY ";
         } else {
             $strSqlOrder .= ",";
         }
         $strSqlOrder .= $arSqlOrder[$i];
     }
     $strSql .= $strSqlOrder;
     if (!empty($arNavParams)) {
         $nTopCount = null;
         if (isset($arNavParams['NAV_PARAMS']['nPageTop']) && $arNavParams['NAV_PARAMS']['nPageTop'] > 0) {
             $nTopCount = (int) $arNavParams['NAV_PARAMS']['nPageTop'];
         } else {
             if (isset($arNavParams['nPageTop'])) {
                 $nTopCount = (int) $arNavParams['nPageTop'];
             } else {
                 if (isset($arNavParams['nTopCount'])) {
                     $nTopCount = (int) $arNavParams['nTopCount'];
                 } else {
                     $res_cnt = $DB->Query("SELECT COUNT(A.ID) as C " . $strSqlFrom);
                     $res_cnt = $res_cnt->fetch();
                     $res = new CDBResult();
                     $res->NavQuery($strSql, $res_cnt['C'], $arNavParams);
                     $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARN_ATTEMPT"));
                 }
             }
         }
         if ($nTopCount !== null) {
             $strSql = $DB->TopSql($strSql, $nTopCount);
             $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
             $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARN_ATTEMPT"));
         }
     } else {
         $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__);
         $res->SetUserFields($USER_FIELD_MANAGER->GetUserFields("LEARN_ATTEMPT"));
     }
     return $res;
 }