model.ajax.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. //@todo this could be integrated in the inc/lib/model.lib.php + try to clean this file
  4. $language_file = array('admin', 'exercice', 'gradebook', 'tracking');
  5. require_once '../global.inc.php';
  6. $libpath = api_get_path(LIBRARY_PATH);
  7. // 1. Setting variables needed by jqgrid
  8. $action = $_GET['a'];
  9. $page = intval($_REQUEST['page']); //page
  10. $limit = intval($_REQUEST['rows']); //quantity of rows
  11. $sidx = $_REQUEST['sidx']; //index (field) to filter
  12. $sord = $_REQUEST['sord']; //asc or desc
  13. if (strpos(strtolower($sidx), 'asc') !== false) {
  14. $sidx = str_replace(array('asc', ','), '', $sidx);
  15. $sord = 'asc';
  16. }
  17. if (strpos(strtolower($sidx), 'desc') !== false) {
  18. $sidx = str_replace(array('desc', ','), '', $sidx);
  19. $sord = 'desc';
  20. }
  21. if (!in_array($sord, array('asc','desc'))) {
  22. $sord = 'desc';
  23. }
  24. if (!in_array($action,
  25. array(
  26. 'get_exercise_results',
  27. 'get_hotpotatoes_exercise_results',
  28. 'get_work_user_list',
  29. 'get_timelines',
  30. 'get_user_skill_ranking',
  31. 'get_usergroups_teacher',
  32. 'get_question_list',
  33. 'get_user_list_plugin_widescale'
  34. )
  35. ))
  36. {
  37. api_protect_admin_script(true);
  38. }
  39. if ($action == 'get_user_list_plugin_widescale') {
  40. $allowed = api_is_drh() || api_is_platform_admin();
  41. if (!$allowed) {
  42. api_not_allowed();
  43. }
  44. }
  45. //Search features
  46. $ops = array(
  47. 'eq' => '=', //equal
  48. 'ne' => '<>', //not equal
  49. 'lt' => '<', //less than
  50. 'le' => '<=', //less than or equal
  51. 'gt' => '>', //greater than
  52. 'ge' => '>=', //greater than or equal
  53. 'bw' => 'LIKE', //begins with
  54. 'bn' => 'NOT LIKE', //doesn't begin with
  55. 'in' => 'LIKE', //is in
  56. 'ni' => 'NOT LIKE', //is not in
  57. 'ew' => 'LIKE', //ends with
  58. 'en' => 'NOT LIKE', //doesn't end with
  59. 'cn' => 'LIKE', //contains
  60. 'nc' => 'NOT LIKE' //doesn't contain
  61. );
  62. //@todo move this in the display_class or somewhere else
  63. /**
  64. * @param $col
  65. * @param $oper
  66. * @param $val
  67. * @return string
  68. */
  69. function get_where_clause($col, $oper, $val) {
  70. global $ops;
  71. if (empty($col)) {
  72. return '';
  73. }
  74. if ($oper == 'bw' || $oper == 'bn') {
  75. $val .= '%';
  76. }
  77. if ($oper == 'ew' || $oper == 'en') {
  78. $val = '%'.$val;
  79. }
  80. if ($oper == 'cn' || $oper == 'nc' || $oper == 'in' || $oper == 'ni') {
  81. $val = '%'.$val.'%';
  82. }
  83. $val = Database::escape_string($val);
  84. return " $col {$ops[$oper]} '$val' ";
  85. }
  86. $where_condition = ""; //if there is no search request sent by jqgrid, $where should be empty
  87. $operation = isset($_REQUEST['oper']) ? $_REQUEST['oper'] : false;
  88. $export_format = isset($_REQUEST['export_format']) ? $_REQUEST['export_format'] : 'csv';
  89. $search_field = isset($_REQUEST['searchField']) ? $_REQUEST['searchField'] : false;
  90. $search_oper = isset($_REQUEST['searchOper']) ? $_REQUEST['searchOper'] : false;
  91. $search_string = isset($_REQUEST['searchString']) ? $_REQUEST['searchString'] : false;
  92. $extra_fields = array();
  93. if ($_REQUEST['_search'] == 'true') {
  94. $where_condition = ' 1 = 1 ';
  95. $where_condition_in_form = get_where_clause($search_field, $search_oper, $search_string);
  96. if (!empty($where_condition_in_form)) {
  97. $where_condition .= ' AND '.$where_condition_in_form;
  98. }
  99. $filters = isset($_REQUEST['filters']) ? json_decode($_REQUEST['filters']) : false;
  100. // for now
  101. if (!empty($filters)) {
  102. switch($action) {
  103. case 'get_questions':
  104. $type = 'question';
  105. break;
  106. case 'get_sessions':
  107. $type = 'session';
  108. break;
  109. }
  110. $extraField = new ExtraField($type);
  111. $result = $extraField->getExtraFieldRules($filters);
  112. $extra_fields = $result['extra_fields'];
  113. $condition_array = $result['condition_array'];
  114. if (!empty($condition_array)) {
  115. $where_condition .= ' AND ( ';
  116. $where_condition .= implode($filters->groupOp, $condition_array);
  117. $where_condition .= ' ) ';
  118. }
  119. }
  120. }
  121. // get index row - i.e. user click to sort $sord = $_GET['sord'];
  122. // get the direction
  123. if (!$sidx) {
  124. $sidx = 1;
  125. }
  126. //2. Selecting the count FIRST
  127. //@todo rework this
  128. switch ($action) {
  129. case 'get_questions':
  130. $categoryId = isset($_REQUEST['categoryId']) ? $_REQUEST['categoryId'] : null;
  131. /** @var \Doctrine\ORM\EntityManager $em */
  132. /*$em = $app['orm.em'];
  133. $repo = $em->getRepository('Entity\CQuizQuestionRelCategory');
  134. $count = $repo->getCountQuestionByCategory($categoryId);*/
  135. if (isset($_REQUEST['categoryId'])) {
  136. $categoryId = intval($_REQUEST['categoryId']);
  137. }
  138. $count = Question::getQuestions($categoryId, array('where'=> $where_condition, 'extra' => $extra_fields), true);
  139. break;
  140. case 'get_user_list_plugin_widescale':
  141. $count = UserManager::get_user_data(null, null, null, null, true);
  142. break;
  143. case 'get_question_list':
  144. require_once api_get_path(SYS_CODE_PATH).'exercice/exercise.class.php';
  145. $exerciseId = isset($_REQUEST['exerciseId']) ? $_REQUEST['exerciseId'] : null;
  146. $exercise = new Exercise(api_get_course_int_id());
  147. $exercise->read($exerciseId);
  148. $count = $exercise->selectNbrQuestions();
  149. break;
  150. case 'get_group_reporting':
  151. $course_id = isset($_REQUEST['course_id']) ? $_REQUEST['course_id'] : null;
  152. $group_id = isset($_REQUEST['gidReq']) ? $_REQUEST['gidReq'] : null;
  153. $count = Tracking::get_group_reporting($course_id, $group_id, 'count');
  154. break;
  155. case 'get_user_course_report_resumed':
  156. $count = CourseManager::get_count_user_list_from_course_code(true, 'ruc');
  157. break;
  158. case 'get_user_course_report':
  159. $count = CourseManager::get_count_user_list_from_course_code(false);
  160. break;
  161. case 'get_course_exercise_medias':
  162. $course_id = api_get_course_int_id();
  163. $count = Question::get_count_course_medias($course_id);
  164. break;
  165. case 'get_user_skill_ranking':
  166. $skill = new Skill();
  167. $count = $skill->get_user_list_skill_ranking_count();
  168. break;
  169. case 'get_work_user_list':
  170. require_once api_get_path(SYS_CODE_PATH).'work/work.lib.php';
  171. $work_id = $_REQUEST['work_id'];
  172. $count = get_count_work($work_id);
  173. break;
  174. case 'get_exercise_results':
  175. $exercise_id = $_REQUEST['exerciseId'];
  176. if (isset($_GET['filter_by_user']) && !empty($_GET['filter_by_user'])) {
  177. $filter_user = intval($_GET['filter_by_user']);
  178. if ($where_condition == "") {
  179. $where_condition .= " te.exe_user_id = '$filter_user'" ;
  180. } else {
  181. $where_condition .= " AND te.exe_user_id = '$filter_user'";
  182. }
  183. }
  184. $count = ExerciseLib::get_count_exam_results($exercise_id, $where_condition);
  185. break;
  186. case 'get_hotpotatoes_exercise_results':
  187. $hotpot_path = $_REQUEST['path'];
  188. $count = ExerciseLib::get_count_exam_hotpotatoes_results($hotpot_path);
  189. break;
  190. case 'get_sessions':
  191. $list_type = isset($_REQUEST['list_type']) ? $_REQUEST['list_type'] : 'simple';
  192. if ($list_type == 'simple') {
  193. $count = SessionManager::get_sessions_admin(array('where'=> $where_condition, 'extra' => $extra_fields), true);
  194. } else {
  195. $count = SessionManager::get_count_admin_complete(array('where'=> $where_condition, 'extra' => $extra_fields));
  196. }
  197. break;
  198. case 'get_extra_fields':
  199. $type = $_REQUEST['type'];
  200. $obj = new ExtraField($type);
  201. $count = $obj->get_count();
  202. break;
  203. case 'get_extra_field_options':
  204. $type = $_REQUEST['type'];
  205. $field_id = $_REQUEST['field_id'];
  206. $obj = new ExtraFieldOption($type);
  207. $count = $obj->get_count_by_field_id($field_id);
  208. break;
  209. case 'get_timelines':
  210. require_once $libpath.'timeline.lib.php';
  211. $obj = new Timeline();
  212. $count = $obj->get_count();
  213. break;
  214. case 'get_gradebooks':
  215. require_once $libpath.'gradebook.lib.php';
  216. $obj = new Gradebook();
  217. $count = $obj->get_count();
  218. break;
  219. case 'get_event_email_template':
  220. $obj = new EventEmailTemplate();
  221. $count = $obj->get_count();
  222. break;
  223. case 'get_careers':
  224. $obj = new Career();
  225. $count = $obj->get_count();
  226. break;
  227. case 'get_promotions':
  228. $obj = new Promotion();
  229. $count = $obj->get_count();
  230. break;
  231. case 'get_grade_models':
  232. $obj = new GradeModel();
  233. $count = $obj->get_count();
  234. break;
  235. case 'get_usergroups':
  236. $obj = new UserGroup();
  237. $count = $obj->get_count();
  238. break;
  239. case 'get_usergroups_teacher':
  240. $obj = new UserGroup();
  241. $type = isset($_REQUEST['type']) ? $_REQUEST['type'] : 'registered';
  242. $course_id = api_get_course_int_id();
  243. if ($type == 'registered') {
  244. $count = $obj->get_usergroup_by_course_with_data_count($course_id);
  245. } else {
  246. $count = $obj->get_count();
  247. }
  248. break;
  249. default:
  250. exit;
  251. }
  252. //3. Calculating first, end, etc
  253. $total_pages = 0;
  254. if ($count > 0) {
  255. if (!empty($limit)) {
  256. $total_pages = ceil($count/$limit);
  257. }
  258. }
  259. if ($page > $total_pages) {
  260. $page = $total_pages;
  261. }
  262. $start = $limit * $page - $limit;
  263. if ($start < 0) {
  264. $start = 0;
  265. }
  266. //4. Deleting an element if the user wants to
  267. if (isset($_REQUEST['oper']) && $_REQUEST['oper'] == 'del') {
  268. $obj->delete($_REQUEST['id']);
  269. }
  270. $is_allowedToEdit = api_is_allowed_to_edit(null, true) || api_is_allowed_to_edit(true) || api_is_drh();
  271. //5. Querying the DB for the elements
  272. $columns = array();
  273. switch ($action) {
  274. case 'get_questions':
  275. // @todo implement a class that manages jqgrid petitions
  276. /** @var \Entity\Repository\CQuizQuestionRepository $repo */
  277. /*$repo = $em->getRepository('Entity\CQuizQuestion');
  278. var_dump($where_condition, $extra_fields);
  279. $qb = $repo->getQuestionsByCategory($categoryId);
  280. if (!empty($sidx) && strlen($sidx) > 1) {
  281. $sidx = 'q.'.$sidx;
  282. $sord = strtoupper($sord);
  283. $qb->addOrderBy($sidx, $sord);
  284. }
  285. $qb->getFirstResult($start);
  286. $qb->getMaxResults($limit);
  287. $query = $qb->getQuery();
  288. //echo $qb->getQuery()->getSQL();
  289. $questions = $query->getResult();*/
  290. /** @var \Entity\CQuizCategory $category */
  291. /*$category = $repo->find($categoryId);
  292. $questions = $category->getQuestions();*/
  293. $columns = Question::getQuestionColumns();
  294. $columns = $columns['simple_column_name'];
  295. $result = Question::getQuestions($categoryId, array('where'=> $where_condition, 'order'=>"$sidx $sord", 'extra' => $extra_fields, 'limit'=> "$start , $limit"));
  296. break;
  297. case 'get_user_list_plugin_widescale':
  298. $columns = array('username', 'firstname', 'lastname', 'exam_password');
  299. $column_names = array(get_lang('Username'), get_lang('Firstname'), get_lang('Lastname'), get_lang('Password'));
  300. $result = UserManager::get_user_data($start, $limit, $sidx, $sord);
  301. break;
  302. case 'get_question_list':
  303. if (isset($exercise) && !empty($exercise)) {
  304. $columns = array('question', 'type', 'category', 'level', 'score', 'actions');
  305. $result = $exercise->getQuestionList($start, $limit, $sidx, $sord, $where_condition);
  306. }
  307. break;
  308. case 'get_group_reporting':
  309. $columns = array('name', 'time', 'progress', 'score', 'works', 'messages', 'actions');
  310. $result = Tracking::get_group_reporting($course_id, $group_id, 'all', $start, $limit, $sidx, $sord, $where_condition);
  311. break;
  312. case 'get_course_exercise_medias':
  313. $columns = array('question');
  314. $result = Question::get_course_medias($course_id, $start, $limit, $sidx, $sord, $where_condition);
  315. if (!empty($result)) {
  316. foreach ($result as &$media) {
  317. $media['id'] = $media['iid'];
  318. }
  319. }
  320. break;
  321. case 'get_user_course_report_resumed':
  322. $columns = array('extra_ruc', 'training_hours', 'count_users', 'count_users_registered', 'average_hours_per_user', 'count_certificates');
  323. $column_names = array(get_lang('Company'), get_lang('TrainingHoursAccumulated'), get_lang('CountOfSubscriptions'), get_lang('CountOfUsers'), get_lang('AverageHoursPerStudent'), get_lang('CountCertificates'));
  324. $result = CourseManager::get_user_list_from_course_code(null, null, "LIMIT $start, $limit", " $sidx $sord", null, null, true, true, 'ruc');
  325. $new_result = array();
  326. if (!empty($result)) {
  327. foreach ($result as $row) {
  328. $row['training_hours'] = api_time_to_hms($row['training_hours']);
  329. $row['average_hours_per_user'] = api_time_to_hms($row['average_hours_per_user']);
  330. $new_result[] = $row;
  331. }
  332. $result = $new_result;
  333. }
  334. break;
  335. case 'get_user_course_report':
  336. $columns = array('course', 'user', 'time', 'certificate', 'progress_100', 'progress');
  337. $column_names = array(get_lang('Course'), get_lang('User'), get_lang('ManHours'), get_lang('CertificateGenerated'), get_lang('Approved'), get_lang('CourseAdvance'));
  338. $extra_fields = UserManager::get_extra_fields(0, 100, null, null, true, true);
  339. if (!empty($extra_fields)) {
  340. foreach($extra_fields as $extra) {
  341. $columns[] = $extra['1'];
  342. $column_names[] = $extra['3'];
  343. }
  344. }
  345. $result = CourseManager::get_user_list_from_course_code(null, null, "LIMIT $start, $limit", " $sidx $sord", null, null, true);
  346. break;
  347. case 'get_user_skill_ranking':
  348. $columns = array('photo', 'firstname', 'lastname', 'skills_acquired', 'currently_learning', 'rank');
  349. $result = $skill->get_user_list_skill_ranking($start, $limit, $sidx, $sord, $where_condition);
  350. $result = ArrayClass::msort($result, 'skills_acquired', 'asc');
  351. $skills_in_course = array();
  352. if (!empty($result)) {
  353. //$counter = 1;
  354. foreach ($result as &$item) {
  355. $user_info = api_get_user_info($item['user_id']);
  356. $personal_course_list = UserManager::get_personal_session_course_list($item['user_id']);
  357. $count_skill_by_course = array();
  358. foreach ($personal_course_list as $course_item) {
  359. if (!isset($skills_in_course[$course_item['code']])) {
  360. $count_skill_by_course[$course_item['code']] = $skill->get_count_skills_by_course($course_item['code']);
  361. $skills_in_course[$course_item['code']] = $count_skill_by_course[$course_item['code']];
  362. } else {
  363. $count_skill_by_course[$course_item['code']] = $skills_in_course[$course_item['code']];
  364. }
  365. }
  366. $item['photo'] = Display::img($user_info['avatar_small']);
  367. $item['currently_learning'] = !empty($count_skill_by_course) ? array_sum($count_skill_by_course) : 0;
  368. }
  369. }
  370. break;
  371. case 'get_work_user_list':
  372. if (isset($_GET['type']) && $_GET['type'] == 'simple') {
  373. $columns = array('type', 'firstname', 'lastname', 'username', 'title', 'qualification', 'sent_date', 'qualificator_id', 'actions');
  374. } else {
  375. $columns = array('type', 'firstname', 'lastname', 'username', 'title', 'sent_date', 'actions');
  376. }
  377. $result = get_work_user_list($start, $limit, $sidx, $sord, $work_id, $where_condition);
  378. break;
  379. case 'get_exercise_results':
  380. $course = api_get_course_info();
  381. //used inside get_exam_results_data()
  382. $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document";
  383. if ($is_allowedToEdit) {
  384. $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_duration', 'start_date', 'exe_date', 'score', 'status', 'lp', 'actions');
  385. } else {
  386. //$columns = array('exe_duration', 'start_date', 'exe_date', 'score', 'status', 'actions');
  387. }
  388. $result = ExerciseLib::get_exam_results_data($start, $limit, $sidx, $sord, $exercise_id, $where_condition);
  389. break;
  390. case 'get_hotpotatoes_exercise_results':
  391. $course = api_get_course_info();
  392. //used inside get_exam_results_data()
  393. $documentPath = api_get_path(SYS_COURSE_PATH) . $course['path'] . "/document";
  394. $columns = array('firstname', 'lastname', 'username', 'group_name', 'exe_date', 'score', 'actions');
  395. $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);
  396. break;
  397. case 'get_sessions':
  398. $session_columns = SessionManager::get_session_columns($list_type);
  399. $columns = $session_columns['simple_column_name'];
  400. if ($list_type == 'simple') {
  401. $result = SessionManager::get_sessions_admin(array('where'=> $where_condition, 'order'=>"$sidx $sord", 'extra' => $extra_fields, 'limit'=> "$start , $limit"), false);
  402. } else {
  403. $result = SessionManager::get_sessions_admin_complete(array('where'=> $where_condition, 'order'=>"$sidx $sord", 'extra' => $extra_fields, 'limit'=> "$start , $limit"));
  404. }
  405. break;
  406. case 'get_timelines':
  407. $columns = array('headline', 'actions');
  408. //$columns = array('headline', 'type', 'start_date', 'end_date', 'text', 'media', 'media_credit', 'media_caption', 'title_slide', 'parent_id');
  409. if(!in_array($sidx, $columns)) {
  410. $sidx = 'headline';
  411. }
  412. $course_id = api_get_course_int_id();
  413. $result = Database::select('*', $obj->table, array('where' => array('parent_id = ? AND c_id = ?' => array('0', $course_id)), 'order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  414. $new_result = array();
  415. foreach ($result as $item) {
  416. if (!$item['status']) {
  417. $item['name'] = '<font style="color:#AAA">'.$item['name'].'</font>';
  418. }
  419. $item['headline'] = Display::url($item['headline'], api_get_path(WEB_CODE_PATH).'timeline/view.php?id='.$item['id']);
  420. $item['actions'] = Display::url(Display::return_icon('add.png', get_lang('AddItems')), api_get_path(WEB_CODE_PATH).'timeline/?action=add_item&parent_id='.$item['id']);
  421. $item['actions'] .= Display::url(Display::return_icon('edit.png', get_lang('Edit')), api_get_path(WEB_CODE_PATH).'timeline/?action=edit&id='.$item['id']);
  422. $item['actions'] .= Display::url(Display::return_icon('delete.png', get_lang('Delete')), api_get_path(WEB_CODE_PATH).'timeline/?action=delete&id='.$item['id']);
  423. $new_result[] = $item;
  424. }
  425. $result = $new_result;
  426. break;
  427. case 'get_gradebooks':
  428. $columns = array('name', 'certificates','skills', 'actions', 'has_certificates');
  429. if (!in_array($sidx, $columns)) {
  430. $sidx = 'name';
  431. }
  432. $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  433. $new_result = array();
  434. foreach($result as $item) {
  435. if ($item['parent_id'] != 0) {
  436. continue;
  437. }
  438. $skills = $obj->get_skills_by_gradebook($item['id']);
  439. //Fixes bug when gradebook doesn't have names
  440. if (empty($item['name'])) {
  441. $item['name'] = $item['course_code'];
  442. } else {
  443. //$item['name'] = $item['name'].' ['.$item['course_code'].']';
  444. }
  445. $item['name'] = Display::url($item['name'], api_get_path(WEB_CODE_PATH).'gradebook/index.php?id_session=0&cidReq='.$item['course_code']);
  446. if (!empty($item['certif_min_score']) && !empty($item['document_id'])) {
  447. $item['certificates'] = Display::return_icon('accept.png', get_lang('WithCertificate'), array(), ICON_SIZE_SMALL);
  448. $item['has_certificates'] = '1';
  449. } else {
  450. $item['certificates'] = Display::return_icon('warning.png', get_lang('NoCertificate'), array(), ICON_SIZE_SMALL);
  451. $item['has_certificates'] = '0';
  452. }
  453. if (!empty($skills)) {
  454. foreach($skills as $skill) {
  455. $item['skills'] .= Display::span($skill['name'], array('class' => 'label_tag skill'));
  456. }
  457. }
  458. $new_result[] = $item;
  459. }
  460. $result = $new_result;
  461. break;
  462. case 'get_event_email_template':
  463. $columns = array('subject', 'event_type_name', 'language_id', 'activated', 'actions');
  464. if(!in_array($sidx, $columns)) {
  465. $sidx = 'subject';
  466. }
  467. $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  468. $new_result = array();
  469. foreach ($result as $item) {
  470. $language_info = api_get_language_info($item['language_id']);
  471. $item['language_id'] = $language_info['english_name'];
  472. $item['actions'] = Display::url(Display::return_icon('edit.png', get_lang('Edit')), api_get_path(WEB_CODE_PATH).'admin/event_type.php?action=edit&event_type_name='.$item['event_type_name']);
  473. $item['actions'] .= Display::url(Display::return_icon('delete.png', get_lang('Delete')), api_get_path(WEB_CODE_PATH).'admin/event_controller.php?action=delete&id='.$item['id']);
  474. /*if (!$item['status']) {
  475. $item['name'] = '<font style="color:#AAA">'.$item['subject'].'</font>';
  476. }*/
  477. $new_result[] = $item;
  478. }
  479. $result = $new_result;
  480. break;
  481. case 'get_careers':
  482. $columns = array('name', 'description', 'actions');
  483. if(!in_array($sidx, $columns)) {
  484. $sidx = 'name';
  485. }
  486. $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  487. $new_result = array();
  488. foreach ($result as $item) {
  489. if (!$item['status']) {
  490. $item['name'] = '<font style="color:#AAA">'.$item['name'].'</font>';
  491. }
  492. $new_result[] = $item;
  493. }
  494. $result = $new_result;
  495. break;
  496. case 'get_promotions':
  497. $columns = array('name', 'career', 'description', 'actions');
  498. if(!in_array($sidx, $columns)) {
  499. $sidx = 'name';
  500. }
  501. $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"));
  502. $new_result = array();
  503. foreach($result as $item) {
  504. if (!$item['status']) {
  505. $item['name'] = '<font style="color:#AAA">'.$item['name'].'</font>';
  506. }
  507. $new_result[] = $item;
  508. }
  509. $result = $new_result;
  510. break;
  511. case 'get_grade_models':
  512. $columns = array('name', 'description', 'actions');
  513. if (!in_array($sidx, $columns)) {
  514. $sidx = 'name';
  515. }
  516. $result = Database::select('*', "$obj->table ", array('order' =>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  517. $new_result = array();
  518. foreach($result as $item) {
  519. $new_result[] = $item;
  520. }
  521. $result = $new_result;
  522. break;
  523. case 'get_usergroups':
  524. $columns = array('name', 'users', 'courses', 'sessions', 'group_type', 'actions');
  525. $result = Database::select('*', $obj->table, array('order'=>"name $sord", 'LIMIT'=> "$start , $limit"));
  526. $new_result = array();
  527. if (!empty($result)) {
  528. foreach ($result as $group) {
  529. $group['sessions'] = count($obj->get_sessions_by_usergroup($group['id']));
  530. $group['courses'] = count($obj->get_courses_by_usergroup($group['id']));
  531. $group['users'] = count($obj->get_users_by_usergroup($group['id']));
  532. switch ($group['group_type']) {
  533. case '0':
  534. $group['group_type'] = Display::label(get_lang('Class'), 'info');
  535. break;
  536. case '1' :
  537. $group['group_type'] = Display::label(get_lang('Social'), 'success');
  538. break;
  539. }
  540. $new_result[] = $group;
  541. }
  542. $result = $new_result;
  543. }
  544. $columns = array('name', 'users', 'courses','sessions', 'group_type');
  545. if(!in_array($sidx, $columns)) {
  546. $sidx = 'name';
  547. }
  548. //Multidimensional sort
  549. ArrayClass::msort($result, $sidx);
  550. break;
  551. case 'get_extra_fields':
  552. $obj = new ExtraField($type);
  553. $columns = array('field_display_text', 'field_variable', 'field_type', 'field_changeable', 'field_visible', 'field_filter', 'field_order');
  554. $result = Database::select('*', $obj->table, array('order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  555. $new_result = array();
  556. if (!empty($result)) {
  557. foreach ($result as $item) {
  558. $item['field_type'] = $obj->get_field_type_by_id($item['field_type']);
  559. $item['field_changeable'] = $item['field_changeable'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  560. $item['field_visible'] = $item['field_visible'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  561. $item['field_filter'] = $item['field_filter'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  562. $new_result[] = $item;
  563. }
  564. $result = $new_result;
  565. }
  566. break;
  567. case 'get_extra_field_options':
  568. $obj = new ExtraFieldOption($type);
  569. $columns = array('option_display_text', 'option_value', 'option_order');
  570. $result = Database::select('*', $obj->table, array('where' => array("field_id = ? " => $field_id),'order'=>"$sidx $sord", 'LIMIT'=> "$start , $limit"));
  571. /*$new_result = array();
  572. if (!empty($result)) {
  573. foreach ($result as $item) {
  574. $item['field_type'] = $obj->get_field_type_by_id($item['field_type']);
  575. $item['field_changeable'] = $item['field_changeable'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  576. $item['field_visible'] = $item['field_visible'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  577. $item['field_filter'] = $item['field_filter'] ? Display::return_icon('right.gif') : Display::return_icon('wrong.gif');
  578. $new_result[] = $item;
  579. }
  580. $result = $new_result;
  581. }*/
  582. break;
  583. case 'get_usergroups_teacher':
  584. $columns = array('name', 'users', 'actions');
  585. $options = array('order'=>"name $sord", 'LIMIT'=> "$start , $limit");
  586. $options['course_id'] = $course_id;
  587. switch ($type) {
  588. case 'not_registered':
  589. $options['where'] = array(" (course_id IS NULL OR course_id != ?) " => $course_id);
  590. $result = $obj->get_usergroup_not_in_course($options);
  591. break;
  592. case 'registered':
  593. $options['where'] = array(" usergroup.course_id = ? " => $course_id);
  594. $result = $obj->get_usergroup_in_course($options);
  595. break;
  596. }
  597. $new_result = array();
  598. if (!empty($result)) {
  599. foreach ($result as $group) {
  600. $group['users'] = count($obj->get_users_by_usergroup($group['id']));
  601. if ($obj->usergroup_was_added_in_course($group['id'], $course_id)) {
  602. $url = 'class.php?action=remove_class_from_course&id='.$group['id'];
  603. $icon = Display::return_icon('delete.png', get_lang('Remove'));
  604. } else {
  605. $url = 'class.php?action=add_class_to_course&id='.$group['id'];
  606. $icon = Display::return_icon('add.png', get_lang('Add'));
  607. }
  608. $group['actions'] = Display::url($icon, $url);
  609. $new_result[] = $group;
  610. }
  611. $result = $new_result;
  612. }
  613. if(!in_array($sidx, $columns)) {
  614. $sidx = 'name';
  615. }
  616. //Multidimensional sort
  617. ArrayClass::msort($result, $sidx);
  618. break;
  619. default:
  620. exit;
  621. }
  622. $allowed_actions = array(
  623. 'get_careers',
  624. 'get_promotions',
  625. 'get_usergroups',
  626. 'get_usergroups_teacher',
  627. 'get_gradebooks',
  628. 'get_sessions',
  629. 'get_exercise_results',
  630. 'get_hotpotatoes_exercise_results',
  631. 'get_work_user_list',
  632. 'get_timelines',
  633. 'get_grade_models',
  634. 'get_event_email_template',
  635. 'get_user_skill_ranking',
  636. 'get_extra_fields',
  637. 'get_extra_field_options',
  638. 'get_course_exercise_medias',
  639. 'get_user_course_report',
  640. 'get_user_course_report_resumed',
  641. 'get_group_reporting',
  642. 'get_question_list',
  643. 'get_user_list_plugin_widescale',
  644. 'get_questions'
  645. );
  646. //5. Creating an obj to return a json
  647. if (in_array($action, $allowed_actions)) {
  648. $response = new stdClass();
  649. $response->page = $page;
  650. $response->total = $total_pages;
  651. $response->records = $count;
  652. if ($operation && $operation == 'excel') {
  653. $j = 1;
  654. $array = array();
  655. if (empty($column_names)) {
  656. $column_names = $columns;
  657. }
  658. //Headers
  659. foreach ($column_names as $col) {
  660. $array[0][] = $col;
  661. }
  662. foreach ($result as $row) {
  663. foreach ($columns as $col) {
  664. $array[$j][] = strip_tags($row[$col]);
  665. }
  666. $j++;
  667. }
  668. switch ($export_format) {
  669. case 'xls':
  670. Export::export_table_xls($array, 'company_report');
  671. break;
  672. case 'csv':
  673. default:
  674. Export::export_table_csv($array, 'company_report');
  675. break;
  676. }
  677. exit;
  678. }
  679. $i = 0;
  680. if (!empty($result)) {
  681. foreach ($result as $row) {
  682. //print_r($row);
  683. // if results tab give not id, set id to $i otherwise id="null" for all <tr> of the jqgrid - ref #4235
  684. if (!isset($row['id']) || isset($row['id']) && $row['id'] == "") {
  685. $response->rows[$i]['id']=$i;
  686. } else {
  687. $response->rows[$i]['id']=$row['id'];
  688. }
  689. $array = array();
  690. foreach ($columns as $col) {
  691. $array[] = isset($row[$col]) ? $row[$col] : null;
  692. }
  693. $response->rows[$i]['cell']=$array;
  694. $i++;
  695. }
  696. }
  697. echo json_encode($response);
  698. }
  699. exit;