From d64a78eeca9bdef94156b1bfb5fabd9a8339991e Mon Sep 17 00:00:00 2001 From: Myriam Delaruelle <myriam.delaruelle@univ-lorraine.fr> Date: Thu, 16 Jan 2025 10:10:34 +0100 Subject: [PATCH] Cleaned php --- amd/build/suivi.js | 71 ++++++++++++++++++------ suivi_unit.php | 133 ++++++++++++++++++++++----------------------- 2 files changed, 118 insertions(+), 86 deletions(-) diff --git a/amd/build/suivi.js b/amd/build/suivi.js index 7dff6ca..e7b5205 100644 --- a/amd/build/suivi.js +++ b/amd/build/suivi.js @@ -38,6 +38,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], registerSubmit:function(infos){ data=infos; + console.log(infos); $("#id_submit_iena").on('click', function(e){ triggerAction(e); }); @@ -96,14 +97,10 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], }); }, initTable:function(){ - initActivityFilter(false); - displayTotalActivitiesFilter(false); - displayTotalGroupsFilter(false); - displayActivities(false); - initGroupFilter(false); - registerGroupFilter(); - changeSection(false); - reloadTable(data); + data=fetchProgress(); + + + } @@ -112,6 +109,32 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } + function fetchProgress(){ + completeUrl=getCompleteUrl(); + console.log(completeUrl); + $.ajax({ url: completeUrl, + data: {action: 'fetchprogress'}, + type: 'post', + success: function(request) { + + data=calcPercentage(JSON.parse(request)); + if(data.students.length<1000){ + + //localStorage.setItem("groups",request); + } + initActivityFilter(false); + displayTotalActivitiesFilter(false); + displayTotalGroupsFilter(false); + displayActivities(false); + initGroupFilter(false); + registerGroupFilter(); + changeSection(false); + reloadTable(data); + //displayTotalGroupsFilter(false); + return data; + } + }); + } function initHeaders(){ var nb_counts=$(".th-rotate").length; @@ -149,6 +172,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], for (var i = 0; i < groupscheckboxes.length; i++) { groupsid.push(groupscheckboxes[i].value); } + console.log(groupsid); loadMessage("loading"); if(groupsid.length==0){ groupsid.push(-2); @@ -170,7 +194,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], }); } - + + //Affiche ou non (dynamiquement, pas de requête) les étudiants selon le filtre d'achèvement function changeCompletion(changefilter=true){ symbol=$("#symbol-select").val(); filter=$("#filter-select").val(); @@ -240,6 +265,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], loadMessage("loading"); sectionid=$("#section-select").val(); data.count_results=0; + //Si les modules font partie de la section on les affiche, et on affiche également le progrès de ces modules for(var i = 0; i<data.modules.length; i++){ if(data.modules[i].section == sectionid || sectionid == 0){ data.modules[i].visible=true; @@ -282,6 +308,8 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], checkAllActivitiesFilter(); } + + //Affiche/cache dynamiquement les activités sélectionnées function displayActivities(changefilter=true){ var arrayActivitiesID=[]; var activitiesToStore=[]; @@ -302,8 +330,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], data.students[j].progress.find(progress => progress.idmodule === activities[i].value).visible=false; } } - - } if(data.students.length<1000){ localStorage.setItem("activities",JSON.stringify(activitiesToStore)); @@ -316,7 +342,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } - + //Charge message de chargement ou d'erreur function loadMessage(type){ if(type=="loading"){ var message = str.get_string('loadingResults', 'format_iena'); @@ -331,8 +357,9 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], }); } - //Reload table with nex parameters. + //Reload table with new parameters. function reloadTable(params){ + console.log("on est dans le reloadTable") url=getCompleteUrl(); templates.render('format_iena/suivi-table', params) .done(function(html, js){ @@ -349,7 +376,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], - + //Récupère les étudiants sélectionnées par les checkbox function getSelectedStudents(){ var selectedChecks=$("#table-body input:checked"); var students=[]; @@ -520,6 +547,7 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], //Pour chaque module non caché, on va regarder pour chaque étudiant + //Calcule le pourcentage pour les modules VISIBLES ? function calcPercentage(data){ for (var i = 0; i < data.students.length; i++) { data.students[i].percentage=0; @@ -603,8 +631,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } - //displayTotalActivitiesFilter(); - //displayActivities(); } //Coche toutes les activités quand on change de section @@ -627,7 +653,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], $('.selectallgroups').prop('checked', false); } displayTotalActivitiesFilter(); - //displayActivities(); }); @@ -663,7 +688,6 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], } displayTotalActivitiesFilter(); - //displayActivities(); } //Coche tous les groupes quand le select all est coché @@ -695,5 +719,16 @@ define(['jquery', 'core/ajax', 'core/templates', 'core/str'], + + /*Etapes + Premier chargement : + - On initialise les filtres (on les register) + - On a chargé les données en même temps (avec ces filtres par défaut) + - On affiche/cache les modules selon la section + - On calcule le pourcentage selon les modules VISIBLES + - On affiche/cache les étudiants selon le % d'achèvement + */ + + }); diff --git a/suivi_unit.php b/suivi_unit.php index 2ac9449..b5c3bb9 100644 --- a/suivi_unit.php +++ b/suivi_unit.php @@ -23,7 +23,7 @@ define('NO_OUTPUT_BUFFERING', true); require_once('../../../config.php'); -require_once('view/view_param_indicateur.php'); +//require_once('view/view_param_indicateur.php'); require_once('entity/course_format_iena_section_ressources.php'); require_once('entity/course_format_iena_sections.php'); require_once('entity/course_format_iena_groups.php'); @@ -65,16 +65,6 @@ function get_groups($context, $activegroupids, $groups) { $currentusergroupsids = groups_get_user_groups($COURSE->id, $USER->id)[0]; $currentusergroups = []; $othergroups = []; - // Si pas de groupe dans le get ou groupe 0 (tous) mais pas le droit => premier groupe existant du user ou groupe 0 (tous). - - /*if ($activegroupid == null || ($activegroupid == 0 && - !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) { - if ( count($currentusergroupsids) == 0 ) { - $activegroupid = 0; - } else { - $activegroupid = $currentusergroupsids[0]; - } - }*/ // Groupes du cours avec id, nom et liste des id utilisateur de tous les // membres (3 clefs d'un tableau de groupes : id, name, member). @@ -82,11 +72,7 @@ function get_groups($context, $activegroupids, $groups) { $activegroupname = ""; foreach ($groups as $group) { - // Récupération du nom du group actif au passage. - /*if ( $group->id == $activegroupid ) { - $activegroupname = $group->name; - $group->selected = 'selected'; - }*/ + // Récupération des groupes dont fait partie l'utilisateur if (in_array($group->id, $currentusergroupsids)) { $currentusergroups[] = $group; } else { @@ -106,6 +92,7 @@ function get_groups($context, $activegroupids, $groups) { function format_progress($progress, $modules, $groups, $activegroupids, $activesectionid) { global $CFG, $COURSE; $students = array(); + foreach ($progress as $proginfo) { $progressstudent = new StdClass(); $progressstudent->firstname = $proginfo->firstname; @@ -146,10 +133,6 @@ function format_progress($progress, $modules, $groups, $activegroupids, $actives $progressstudent->progress[$key] = $moduleprogress; } - //On a les données de tous les étudiants, c'est ici qu'on filtre selon le groupe actif - DEPRECATED - /*if ($activegroupid == 0 || ($activegroupid>0 && in_array($activegroupid, $progressstudent->groupsid))) { - $students[] = $progressstudent; - }*/ $students[] = $progressstudent; } @@ -232,17 +215,18 @@ function set_filters($data, $filters, $symbols, $sections, $groups, $currentuser return $data; } -function set_data($data, $modules, $progress, $groups, $activegroupsids, $activesectionid, $listoptions) { +// +function set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions) { global $COURSE, $USER, $CFG; $data["modules"] = $modules;; $countmodules = count($data["modules"]); - $data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid); - $countstudents = count($data["students"]); - + //$data["students"] = format_progress($progress, $modules, $groups, $activegroupsids, $activesectionid); + //$countstudents = count($data["students"]); + if ($countstudents > 0 && $countmodules > 0) { - $data['count_results'] = count($data["students"]); + $data['count_results'] = $countstudents; } if (has_capability('course/iena:suivi_edit', $context = context_course::instance($COURSE->id), $USER->id)) { @@ -257,16 +241,51 @@ function set_data($data, $modules, $progress, $groups, $activegroupsids, $active if($listoptions->listoptions['display_details']["value"]){ $data["display_details"]=1; } - - // Pour le téléchargement du tableau ? + + // Pas que pour le téléchargement du tableau, partie à optimiser if (!isset($data['data'])) { $data['data'] = array(); } - $data['data'] = json_encode($data); + //$data['data'] = json_encode($data); return $data; } +function get_progress_students($modules, $progress, $groups, $activegroupsids, $activesectionid, $courseid, $cache, $completion){ + + + //Si le progrès de chacun des groupes existe déjà en cache on va les charger, sinon on les récupère dans la BDD et on les stocke + $arrayprogress=array(); + for($i=0; $i<count($activegroupsids); $i++){ + if($cache->get($courseid."-".$activegroupsids[$i]) !== false){ + $progress=$cache->get($courseid."-".$activegroupsids[$i]); + + } + else{ + error_log("pas dans le cache"); + //On récupère le progrès des étudiants qui font partie des groupes activegroupsids + $progressrequest = $completion->get_progress_all( + '', + array(), + $activegroupsids[$i], + 'u.lastname ASC, u.firstname ASC', + '', + '', + $context + ); + //On active le cache seulement s'il y a plus de x étudiants + if($countstudents<1000){ + $cache->set($courseid."-".$activegroupsids[$i], $progressrequest); + } + $progress=$progressrequest; + + } + + $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR); + } + return format_progress($arrayprogress, $modules, $groups, $activegroupsids, $activesectionid); +} + $filters = [ "0" => (object)[ "value" => "0", @@ -316,7 +335,7 @@ $symbols = [ //On s'occupe des options ici - +$cache = cache::make('format_iena', 'students'); $courseid = required_param('courseid', PARAM_INT); // Define the url of the view. $url = new moodle_url('/course/format/iena/suivi_unit.php', array('courseid' => $courseid)); @@ -329,6 +348,8 @@ require_once($CFG->libdir . '/completionlib.php'); $completion = new completion_info($course); $context = context_course::instance($COURSE->id); + +//On récupère les options du tableau de suivi : affichage du groupe, modale détails.... $listoptions=new \format_iena\output\course_format_iena_table_option(); $listoptions->setCourseid($courseid); $listoptions->get_request_options(); @@ -340,12 +361,15 @@ if (!has_capability('course/iena:suivi', $context = context_course::instance($co } - $countstudents=count_enrolled_users($context); + +//Si on a sélectionné des groupes dans les filtres if (isset($_POST['groupsid'])) { + $activegroupsids = $_POST['groupsid']; } else { if($countstudents>1000){ + $activegroupsids = array(); } else{ @@ -355,32 +379,8 @@ if (isset($_POST['groupsid'])) { } -$cache = cache::make('format_iena', 'students'); -//Si le progrès de chacun des groupes existe déjà en cache on va les charger, sinon on les récupère dans la BDD et on les stocke -$arrayprogress=array(); -for($i=0; $i<count($activegroupsids); $i++){ - if($cache->get($courseid."-".$activegroupsids[$i]) !== false){ - $progress=$cache->get($courseid."-".$activegroupsids[$i]); - } - else{ - $progressrequest = $completion->get_progress_all( - '', - array(), - $activegroupsids[$i], - 'u.lastname ASC, u.firstname ASC', - '', - '', - $context - ); - //On active le cache seulement s'il y a plus de x étudiants - if($countstudents<1000){ - $cache->set($courseid."-".$activegroupsids[$i], $progressrequest); - } - $progress=$progressrequest; - } - $arrayprogress=(object) array_unique(array_merge((array) $arrayprogress, (array) $progress), SORT_REGULAR); -} + $activesectionid = 0; @@ -408,8 +408,6 @@ if (isset($_POST['action']) && $_POST['action'] == "details") { $activitydates = \core\activity_dates::get_dates_for_module($cm, $idetu); $activityinfo = new \core_course\output\activity_information($cm, $completiondetails, $activitydates); - //$activity = $activityinfo->export_for_template($renderer); - $activityhtml=$renderer->render_activity_information($activityinfo); $gradesobject=array(); try{ @@ -431,9 +429,7 @@ if (isset($_POST['action']) && $_POST['action'] == "details") { if(isset($gradesobject->items[0]->gradepass)){ $lastgrade["passgrade"]=number_format($gradesobject->items[0]->gradepass, 2, ',', ''); } - else{ - - } + /*$lastgrade["passgrade"]=$gradesobject->items[0]->gradepass ? number_format($gradesobject->items[0]->gradepass, 2, ',', '') : null;*/ } @@ -447,6 +443,7 @@ if (isset($_POST['action']) && $_POST['action'] == "details") { $data["grades"]=$lastgrade; $data["customcompletion"]=$cm->customdata; $data["completioninfos"]=$activityhtml; + //Récupère le pourcentage de complétion total $data["completionstate"]=$completiondetails->get_overall_completion(); $data["completiondetails"] = $completiondetails; $data["activityname"]=$cm->name; @@ -456,20 +453,20 @@ if (isset($_POST['action']) && $_POST['action'] == "details") { } // If a post is sent trought the page --> Si on change les filtres (de groupes), le template est appelé en JS else if (isset($_POST['action']) && !empty($_POST['action'])) { - // Si on change les filtres. $data = []; $modules = get_activities($completion, $activesectionid); - - $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions); - + $data["students"]=get_progress_students($modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $courseid, $cache, $completion); + $data["modules"]=$modules; + $data["countstudents"]=count($data["students"]); echo json_encode($data); -} else { +} +else { init_page($course, $PAGE); echo $OUTPUT->header(); //$progress=$cache->get($activegroupids); - $progress=$arrayprogress; + $data = []; //Si la complétion du cours n'est pas activée on redirige l'enseignant vers l'interface pour l'activer if(!$COURSE->enablecompletion){ @@ -491,9 +488,9 @@ else if (isset($_POST['action']) && !empty($_POST['action'])) { } //$groups = $groupsall->groups; $sections = get_sections($activesectionid); - $data["countstudents"]=$countstudents; + //$data["countstudents"]=$countstudents; $data = set_filters($data, $filters, $symbols, $sections, array_values($groups), $groupsall->current_user_groups, $groupsall->othergroups, $activesectionid); - $data = set_data($data, $modules, $arrayprogress, $groups, $activegroupsids, $activesectionid, $listoptions); + $data = set_data($data, $modules, $groups, $activegroupsids, $activesectionid, $listoptions); if (isset($_GET["msg_success"])) { $msg = $_GET["msg_success"]; -- GitLab