diff --git a/main/admin/exercise_report.php b/main/admin/exercise_report.php new file mode 100644 index 0000000000..bd80ededbc --- /dev/null +++ b/main/admin/exercise_report.php @@ -0,0 +1,281 @@ + jqgrid integration + * Modified by hubert.borderiou (question category) + * + * @todo fix excel export + * + */ +/** + * Code + */ +// name of the language file that needs to be included +$language_file = array('exercice'); + +api_protect_global_admin_script(); + +$urlMainExercise = api_get_path(WEB_CODE_PATH).'exercice/'; + +// Setting the tabs +$this_section = SECTION_COURSES; + +$htmlHeadXtra[] = api_get_jqgrid_js(); + +// including additional libraries +require_once api_get_path(SYS_CODE_PATH).'exercice/exercise.class.php'; +require_once api_get_path(SYS_CODE_PATH).'exercice/question.class.php'; +require_once api_get_path(SYS_CODE_PATH).'exercice/answer.class.php'; + +// need functions of statsutils lib to display previous exercices scores +require_once api_get_path(LIBRARY_PATH).'statsUtils.lib.inc.php'; + +// document path +$documentPath = api_get_path(SYS_COURSE_PATH).$_course['path']."/document"; + +/* Constants and variables */ +$is_tutor = api_is_allowed_to_edit(true); + +$TBL_QUESTIONS = Database :: get_course_table(TABLE_QUIZ_QUESTION); +$TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES); +$TBL_TRACK_ATTEMPT = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); +$TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING); +$TBL_LP_ITEM_VIEW = Database :: get_course_table(TABLE_LP_ITEM_VIEW); +$course_id = api_get_course_int_id(); + +if (!empty($_REQUEST['export_report']) && $_REQUEST['export_report'] == '1') { + + $load_extra_data = false; + if (isset($_REQUEST['extra_data']) && $_REQUEST['extra_data'] == 1) { + $load_extra_data = true; + } + require_once 'exercise_result.class.php'; + switch ($_GET['export_format']) { + case 'xls': + $export = new ExerciseResult(); + $export->exportCompleteReportXLS( + $documentPath, + null, + $load_extra_data, + null, + $_GET['exerciseId'], + $_GET['hotpotato_name'] + ); + exit; + break; + case 'csv': + default: + $export = new ExerciseResult(); + $export->exportCompleteReportCSV( + $documentPath, + null, + $load_extra_data, + null, + $_GET['exerciseId'], + $_GET['hotpotato_name'] + ); + exit; + break; + } + +} + +$nameTools = get_lang('StudentScore'); + +$interbreadcrumb[] = array ('url' => 'index.php', 'name' => get_lang('PlatformAdmin')); +$interbreadcrumb[] = array("url" => "", "name" => get_lang('ExercicesReport')); + +Display :: display_header($nameTools); + +$extra = ''; + +$extra .= '
'; +$form = new FormValidator('report', 'post', null, null, array('class' => 'form-vertical')); +$form->addElement( + 'radio', + 'export_format', + null, + get_lang('ExportAsCSV'), + 'csv', + array('id' => 'export_format_csv_label') +); +$form->addElement( + 'radio', + 'export_format', + null, + get_lang('ExportAsXLS'), + 'xls', + array('id' => 'export_format_xls_label') +); +$form->addElement( + 'checkbox', + 'load_extra_data', + null, + get_lang('LoadExtraData'), + '0', + array('id' => 'export_format_xls_label') +); +$form->setDefaults(array('export_format' => 'csv')); +$extra .= $form->return_form(); +$extra .= '
'; + +echo $extra; + +$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_admin_exercise_results'; + +$action_links = ''; + +//The order is important you need to check the the $column variable in the model.ajax.php file +$columns = array( + get_lang('LoginName'), + get_lang('FirstName'), + get_lang('LastName'), + get_lang('Score'), + get_lang('Link'), + get_lang('Session') + // get_lang('Actions') +); + +//Column config +$column_model = array( + array( + 'name' => 'login', + 'index' => 'username', + 'width' => '40', + 'align' => 'left', + 'search' => 'true' + ), + array('name' => 'firstname', 'index' => 'firstname', 'width' => '50', 'align' => 'left', 'search' => 'true'), + array( + 'name' => 'lastname', + 'index' => 'lastname', + 'width' => '50', + 'align' => 'left', + //'formatter' => 'action_formatter', + 'search' => 'true' + ), + array('name' => 'score', 'index' => 'exe_result', 'width' => '50', 'align' => 'left', 'search' => 'true'), + array('name' => 'link', 'index' => 'link', 'width' => '50', 'align' => 'left', 'search' => 'false'), + array('name' => 'session', 'index' => 'session_id', 'width' => '50', 'align' => 'left', 'search' => 'true'), +); + +//Autowidth +$extra_params['autowidth'] = 'true'; + +//height auto +$extra_params['height'] = 'auto'; + +?> + +
+ + +
+'usergroups.php', 'label' => get_lang('Classes')); - - - +$items[] = array('url'=> 'exercise_report.php', 'label' => get_lang('ExerciseReport')); $items[] = array('url'=>'extra_fields.php?type=session', 'label' => get_lang('ManageSessionFields')); $blocks['sessions']['items'] = $items; diff --git a/main/exercice/exercise_report.php b/main/exercice/exercise_report.php index 65fe8239a3..2bde9399f3 100644 --- a/main/exercice/exercise_report.php +++ b/main/exercice/exercise_report.php @@ -243,7 +243,7 @@ if ($is_allowedToEdit) { echo $actions; -$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_exercise_results&exerciseId='.$exercise_id.'&filter_by_user='.$filter_user; +$url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_exercise_results&exerciseId='.$exercise_id.'&filter_by_user='.$filter_user.'&'.api_get_cidreq(); $action_links = ''; @@ -404,35 +404,16 @@ $extra_params['height'] = 'auto'; if ($is_allowedToEdit || $is_tutor) { ?> - //setSearchSelect("status"); - // - //view:true, del:false, add:false, edit:false, excel:true} - $("#results").jqGrid('navGrid', '#results_pager', {view:true, edit:false, add:false, del:false, excel:false}, - {height:280, reloadAfterSubmit:false}, // view options - {height:280, reloadAfterSubmit:false}, // edit options - {height:280, reloadAfterSubmit:false}, // add options - {reloadAfterSubmit:false}, // del options - {width:500} // search options + $("#results").jqGrid( + 'navGrid', + '#results_pager', + { view:true, edit:false, add:false, del:false, excel:false }, + { height:280, reloadAfterSubmit:false }, // view options + { height:280, reloadAfterSubmit:false }, // edit options + { height:280, reloadAfterSubmit:false }, // add options + { reloadAfterSubmit:false }, // del options + { width:500 } // search options ); - /* -// add custom button to export the data to excel -jQuery("#results").jqGrid('navButtonAdd','#results_pager',{ - caption:"", - onClickButton : function () { - //exportExcel(); - } -});*/ - - /* - jQuery('#sessions').jqGrid('navButtonAdd','#sessions_pager',{id:'pager_csv',caption:'',title:'Export To CSV',onClickButton : function(e) - { - try { - jQuery("#sessions").jqGrid('excelExport',{tag:'csv', url:'grid.php'}); - } catch (e) { - window.location= 'grid.php?oper=csv'; - } - },buttonicon:'ui-icon-document'}) - */ //Adding search options var options = { diff --git a/main/inc/ajax/model.ajax.php b/main/inc/ajax/model.ajax.php index 3e51847d58..eac173aeea 100644 --- a/main/inc/ajax/model.ajax.php +++ b/main/inc/ajax/model.ajax.php @@ -83,7 +83,8 @@ $ops = array( * @param $val * @return string */ -function get_where_clause($col, $oper, $val) { +function get_where_clause($col, $oper, $val) +{ global $ops; if (empty($col)) { return ''; @@ -233,10 +234,13 @@ switch ($action) { } $count = ExerciseLib::get_count_exam_results($exercise_id, $where_condition); break; + case 'get_admin_exercise_results': + $count = ExerciseLib::get_admin_count_exam_results($where_condition); + break; case 'get_hotpotatoes_exercise_results': $hotpot_path = $_REQUEST['path']; - $count = ExerciseLib::get_count_exam_hotpotatoes_results($hotpot_path); - break; + $count = ExerciseLib::get_count_exam_hotpotatoes_results($hotpot_path); + break; case 'get_sessions': $list_type = isset($_REQUEST['list_type']) ? $_REQUEST['list_type'] : 'simple'; if ($list_type == 'simple') { @@ -344,7 +348,6 @@ switch ($action) { } } $columns[] = 'actions'; - $result = $exercise->getQuestionListPagination($start, $limit, $sidx, $sord, $where_condition, $extraFields); } break; @@ -380,22 +383,22 @@ switch ($action) { $column_names = array(get_lang('Course'), get_lang('User'), get_lang('ManHours'), get_lang('CertificateGenerated'), get_lang('Approved'), get_lang('CourseAdvance')); $extra_fields = UserManager::get_extra_fields(0, 100, null, null, true, true); if (!empty($extra_fields)) { - foreach($extra_fields as $extra) { + foreach ($extra_fields as $extra) { $columns[] = $extra['1']; $column_names[] = $extra['3']; } } $result = CourseManager::get_user_list_from_course_code(null, null, "LIMIT $start, $limit", " $sidx $sord", null, null, true); break; - case 'get_user_skill_ranking': + case 'get_user_skill_ranking': $columns = array('photo', 'firstname', 'lastname', 'skills_acquired', 'currently_learning', 'rank'); - $result = $skill->get_user_list_skill_ranking($start, $limit, $sidx, $sord, $where_condition); + $result = $skill->get_user_list_skill_ranking($start, $limit, $sidx, $sord, $where_condition); $result = ArrayClass::msort($result, 'skills_acquired', 'asc'); $skills_in_course = array(); - if (!empty($result)) { - //$counter = 1; - foreach ($result as &$item) { + if (!empty($result)) { + //$counter = 1; + foreach ($result as &$item) { $user_info = api_get_user_info($item['user_id']); $personal_course_list = UserManager::get_personal_session_course_list($item['user_id']); $count_skill_by_course = array(); @@ -407,11 +410,11 @@ switch ($action) { $count_skill_by_course[$course_item['code']] = $skills_in_course[$course_item['code']]; } } - $item['photo'] = Display::img($user_info['avatar_small']); - $item['currently_learning'] = !empty($count_skill_by_course) ? array_sum($count_skill_by_course) : 0; - } - } - break; + $item['photo'] = Display::img($user_info['avatar_small']); + $item['currently_learning'] = !empty($count_skill_by_course) ? array_sum($count_skill_by_course) : 0; + } + } + break; case 'get_work_user_list_all': if (isset($_GET['type']) && $_GET['type'] == 'simple') { //$columns = array('type', 'firstname', 'lastname', 'username', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions'); @@ -432,7 +435,7 @@ switch ($action) { } $where_condition .= " AND u.user_id <> ".api_get_user_id(); $result = get_work_user_list($start, $limit, $sidx, $sord, $work_id, $where_condition); - break; + break; case 'get_work_user_list': if (isset($_GET['type']) && $_GET['type'] == 'simple') { //$columns = array('type', 'firstname', 'lastname', 'username', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions'); @@ -444,24 +447,26 @@ switch ($action) { $where_condition .= " AND u.user_id = ".api_get_user_id(); $result = get_work_user_list($start, $limit, $sidx, $sord, $work_id, $where_condition); break; - case 'get_exercise_results': - $course = api_get_course_info(); + case 'get_exercise_results': + $course = api_get_course_info(); //used inside get_exam_results_data() - $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document"; - if ($is_allowedToEdit) { - $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_duration', 'start_date', 'exe_date', 'score', 'status', 'lp', 'actions'); - } else { - //$columns = array('exe_duration', 'start_date', 'exe_date', 'score', 'status', 'actions'); - } + $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document"; + if ($is_allowedToEdit) { + $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_duration', 'start_date', 'exe_date', 'score', 'status', 'lp', 'actions'); + } $result = ExerciseLib::get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition); break; - case 'get_hotpotatoes_exercise_results': - $course = api_get_course_info(); + case 'get_admin_exercise_results': + $columns = array('username', 'firstname', 'lastname', 'score', 'link', 'session'); + $result = ExerciseLib::get_admin_exam_results_data($start, $limit, $sidx, $sord, $where_condition); + break; + case 'get_hotpotatoes_exercise_results': + $course = api_get_course_info(); //used inside get_exam_results_data() - $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document"; - $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_date', 'score', 'actions'); - $result = ExerciseLib::get_exam_results_hotpotatoes_data($start, $limit, $sidx, $sord, $hotpot_path, $where_condition); //get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition); - break; + $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document"; + $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_date', 'score', 'actions'); + $result = ExerciseLib::get_exam_results_hotpotatoes_data($start, $limit, $sidx, $sord, $hotpot_path, $where_condition); //get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition); + break; case 'get_sessions': $session_columns = SessionManager::get_session_columns($list_type); $columns = $session_columns['simple_column_name']; @@ -474,9 +479,8 @@ switch ($action) { break; case 'get_timelines': $columns = array('headline', 'actions'); - //$columns = array('headline', 'type', 'start_date', 'end_date', 'text', 'media', 'media_credit', 'media_caption', 'title_slide', 'parent_id'); - if(!in_array($sidx, $columns)) { + if (!in_array($sidx, $columns)) { $sidx = 'headline'; } $course_id = api_get_course_int_id(); @@ -502,7 +506,7 @@ switch ($action) { } $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit")); $new_result = array(); - foreach($result as $item) { + foreach ($result as $item) { if ($item['parent_id'] != 0) { continue; } @@ -525,7 +529,7 @@ switch ($action) { $item['has_certificates'] = '0'; } if (!empty($skills)) { - foreach($skills as $skill) { + foreach ($skills as $skill) { $item['skills'] .= Display::span($skill['name'], array('class' => 'label_tag skill')); } } @@ -536,7 +540,7 @@ switch ($action) { case 'get_event_email_template': $columns = array('subject', 'event_type_name', 'language_id', 'activated', 'actions'); if(!in_array($sidx, $columns)) { - $sidx = 'subject'; + $sidx = 'subject'; } $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit")); $new_result = array(); @@ -555,7 +559,7 @@ switch ($action) { break; case 'get_careers': $columns = array('name', 'description', 'actions'); - if(!in_array($sidx, $columns)) { + if (!in_array($sidx, $columns)) { $sidx = 'name'; } $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit")); @@ -570,7 +574,7 @@ switch ($action) { break; case 'get_promotions': $columns = array('name', 'career', 'description', 'actions'); - if(!in_array($sidx, $columns)) { + if (!in_array($sidx, $columns)) { $sidx = 'name'; } $result = Database::select('p.id,p.name, p.description, c.name as career, p.status', "$obj->table p LEFT JOIN ".Database::get_main_table(TABLE_CAREER)." c ON c.id = p.career_id ", array('order' =>"$sidx $sord", 'LIMIT'=> "$start , $limit")); @@ -588,7 +592,7 @@ switch ($action) { if (!in_array($sidx, $columns)) { $sidx = 'name'; } - $result = Database::select('*', "$obj->table ", array('order' =>"$sidx $sord", 'LIMIT'=> "$start , $limit")); + $result = Database::select('*', "$obj->table ", array('order' =>"$sidx $sord", 'LIMIT'=> "$start , $limit")); $new_result = array(); foreach($result as $item) { $new_result[] = $item; @@ -608,7 +612,7 @@ switch ($action) { case '0': $group['group_type'] = Display::label(get_lang('Class'), 'info'); break; - case '1' : + case '1': $group['group_type'] = Display::label(get_lang('Social'), 'success'); break; } @@ -617,7 +621,7 @@ switch ($action) { $result = $new_result; } $columns = array('name', 'users', 'courses','sessions', 'group_type'); - if(!in_array($sidx, $columns)) { + if (!in_array($sidx, $columns)) { $sidx = 'name'; } //Multidimensional sort @@ -643,31 +647,20 @@ switch ($action) { $obj = new ExtraFieldOption($type); $columns = array('option_display_text', 'option_value', 'option_order'); $result = Database::select('*', $obj->table, array('where' => array("field_id = ? " => $field_id),'order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit")); - /*$new_result = array(); - if (!empty($result)) { - foreach ($result as $item) { - $item['field_type'] = $obj->get_field_type_by_id($item['field_type']); - $item['field_changeable'] = $item['field_changeable'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif'); - $item['field_visible'] = $item['field_visible'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif'); - $item['field_filter'] = $item['field_filter'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif'); - $new_result[] = $item; - } - $result = $new_result; - }*/ break; case 'get_usergroups_teacher': $columns = array('name', 'users', 'actions'); $options = array('order'=>"name $sord", 'LIMIT'=> "$start , $limit"); $options['course_id'] = $course_id; switch ($type) { - case 'not_registered': - $options['where'] = array(" (course_id IS NULL OR course_id != ?) " => $course_id); - $result = $obj->get_usergroup_not_in_course($options); - break; - case 'registered': - $options['where'] = array(" usergroup.course_id = ? " => $course_id); - $result = $obj->get_usergroup_in_course($options); - break; + case 'not_registered': + $options['where'] = array(" (course_id IS NULL OR course_id != ?) " => $course_id); + $result = $obj->get_usergroup_not_in_course($options); + break; + case 'registered': + $options['where'] = array(" usergroup.course_id = ? " => $course_id); + $result = $obj->get_usergroup_in_course($options); + break; } $new_result = array(); @@ -706,6 +699,7 @@ $allowed_actions = array( 'get_gradebooks', 'get_sessions', 'get_exercise_results', + 'get_admin_exercise_results', 'get_hotpotatoes_exercise_results', 'get_work_user_list', 'get_work_user_list_others', diff --git a/main/inc/lib/exercise.lib.php b/main/inc/lib/exercise.lib.php index d131b21d71..a916bbd75d 100644 --- a/main/inc/lib/exercise.lib.php +++ b/main/inc/lib/exercise.lib.php @@ -119,6 +119,134 @@ class ExerciseLib return $count; } + /** + * Gets count of exam results + * @todo this public static function should be moved in a library + no global calls + */ + public static function get_admin_count_exam_results($extra_where_conditions) + { + $count = self::get_admin_exam_results_data(null, null, null, null, $extra_where_conditions, true); + return $count; + } + + /** + * Gets the exam'data results + * @todo this function should be moved in a library + no global calls + */ + public static function get_admin_exam_results_data($from, $number_of_items, $column, $direction, $extra_where_conditions = null, $get_count = false) + { + + if (empty($extra_where_conditions)) { + $extra_where_conditions = "1 = 1 "; + } + + $TBL_USER = Database :: get_main_table(TABLE_MAIN_USER); + $tableCourse = Database :: get_main_table(TABLE_MAIN_COURSE); + $tableSession = Database :: get_main_table(TABLE_MAIN_SESSION); + $TBL_EXERCICES = Database :: get_course_table(TABLE_QUIZ_TEST); + + $TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES); + $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING); + + // sql for chamilo-type tests for teacher / tutor view + $sql_inner_join_tbl_track_exercices = " ( + SELECT DISTINCT ttte.* + FROM $TBL_TRACK_EXERCICES ttte LEFT JOIN $TBL_TRACK_ATTEMPT_RECORDING tr + ON (ttte.exe_id = tr.exe_id) + )"; + + $first_and_last_name = api_is_western_name_order() ? "firstname, lastname" : "lastname, firstname"; + + if ($get_count) { + $sql_select = "SELECT count(te.exe_id) "; + } else { + $sql_select = "SELECT DISTINCT + user_id, + $first_and_last_name, + ce.title, + username, + session.name as session, + te.exe_result, + te.exe_weighting, + te.exe_date, + te.exe_id, + email as exemail, + te.start_date, + steps_counter, + exe_user_id, + te.exe_duration, + propagate_neg, + te.c_id, + te.session_id, + course.code, + orig_lp_id"; + } + + $sql = " $sql_select + FROM $TBL_EXERCICES AS ce + INNER JOIN $sql_inner_join_tbl_track_exercices AS te ON (te.exe_exo_id = ce.iid) + INNER JOIN $TBL_USER AS user ON (user.user_id = exe_user_id) + INNER JOIN $tableCourse AS course ON (course.id = te.c_id) + INNER JOIN $tableSession AS session ON (session.id = te.session_id) + + WHERE $extra_where_conditions AND + te.status != 'incomplete' AND + ce.active <>-1 + "; + + $column = !empty($column) ? Database::escape_string($column) : null; + $from = intval($from); + $number_of_items = intval($number_of_items); + + // just count how many answers + if ($get_count) { + $res = Database::query($sql); + return Database::num_rows($res); + } + + if (!empty($column)) { + $sql .= " ORDER BY $column $direction "; + } + if ($get_count == false) { + $sql .= " LIMIT $from, $number_of_items"; + } + + $results = array(); + $resx = Database::query($sql); + while ($rowx = Database::fetch_array($resx, 'ASSOC')) { + $results[] = $rowx; + } + + $list_info = array(); + + if (is_array($results)) { + // Looping results. + foreach ($results as $result) { + + $id = $result['exe_id']; + $my_res = $result['exe_result']; + $my_total = $result['exe_weighting']; + + if (!$result['propagate_neg'] && $my_res < 0) { + $my_res = 0; + } + + $score = self::show_score($my_res, $my_total); + + $courseLink = 'cidReq='.$result['code'].'&id_session='.$result['session_id']; + + $url = api_get_path(WEB_CODE_PATH).'exercice/exercise_show.php?'.$courseLink.'&action=edit&id='.$id; + $link = Display::url('exercise', $url); + $result['link'] = $link; + $result['score'] = $score; + + $list_info[] = $result; + } + } + + return $list_info; + } + public static function get_count_exam_hotpotatoes_results($in_hotpot_path) { return self::get_exam_results_hotpotatoes_data(0, 0, '', '', $in_hotpot_path, true, ''); @@ -191,7 +319,6 @@ class ExerciseLib $TBL_TRACK_EXERCICES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_EXERCICES); $TBL_TRACK_HOTPOTATOES = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_HOTPOTATOES); $TBL_TRACK_ATTEMPT_RECORDING = Database :: get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT_RECORDING); - $session_id_and = ' AND te.session_id = '.api_get_session_id().' '; $exercise_id = intval($exercise_id); @@ -223,7 +350,7 @@ class ExerciseLib } $sqlFromOption = ""; - $sqlWhereOption = ""; // for hpsql + $sqlWhereOption = ""; //@todo fix to work with COURSE_RELATION_TYPE_RRHH in both queries //Hack in order to filter groups $sql_inner_join_tbl_user = ''; @@ -359,7 +486,7 @@ class ExerciseLib $teacher_id_list[] = $teacher['user_id']; } - //Simple exercises + // Simple exercises. if (empty($hotpotatoe_where)) { $column = !empty($column) ? Database::escape_string($column) : null; $from = intval($from); @@ -371,6 +498,7 @@ class ExerciseLib $sql .= " LIMIT $from, $number_of_items"; $results = array(); + $resx = Database::query($sql); while ($rowx = Database::fetch_array($resx, 'ASSOC')) { $results[] = $rowx;