An error occurred while fetching lock information, please try again.
Select Git revision
suivi_unit.php 12.58 KiB
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
*
* @package format_iena
* @category format
* @copyright 2018 Softia/Université lorraine
* @author vrignaud camille / Thomas Fradet
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define('NO_OUTPUT_BUFFERING', true);
require_once('../../../config.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');
$PAGE->requires->css('/course/format/iena/styles.css');
global $COURSE, $DB, $USER, $PAGE;
function init_page($course){
global $PAGE;
// Defines the id of the course with a get parameter
// Getting DB information (*) of the course
$PAGE->set_title($course->fullname);
$PAGE->set_heading($course->fullname . " – " .get_string('table_progress', 'format_iena'));
$PAGE->set_pagelayout('incourse');
/* Cache le menu dans le header ? */
$coursenode = $PAGE->navbar->add(get_string('table_progress', 'format_iena'), null, navigation_node::TYPE_CONTAINER, null, 'suiviena');
$coursenode->make_active();
$coursenode->force_open();
}
function get_groups($context, $active_group_id, $progress, $groups){
global $USER, $COURSE;
/* Groupe du GET provenant du sélecteur de la page du cours, ou premier groupe de l'utilisateur, ou groupe 0 (tous les groupes). */
$groups_all=new StdClass();
// @TODO à supprimer si pas utilisé dans le JS (mettre dans la clause IF pour éviter un appel inutile si le GET existe)
$current_user_groups_ids = groups_get_user_groups($COURSE->id, $USER->id)[0];
$current_user_groups=[];
$other_groups=[];
/* 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 ($active_group_id == NULL || ($active_group_id == 0 && !has_capability('course/iena:suivi_edit', $context, $USER->id)) ) {
if ( count($current_user_groups_ids) == 0 ) {
$active_group_id = 0;
} else {
$active_group_id = $current_user_groups_ids[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) */
//$current_user_groups = [];
$active_group_name = "";
foreach ($groups as $group) {
/* Récupération du nom du group actif au passage */
if ( $group->id == $active_group_id ) {
$active_group_name = $group->name;
$group->selected='selected';
}
foreach ($current_user_groups_ids as $ugi) {
if ( $group->id == $ugi ) {
$current_user_groups[] = $group;
}
else{
$other_groups[]=$group;
}
}
}
//Réservé pour l'export ?
/*if ( $active_group_id == 0 ) {
foreach ($progress as $prog) {
$prog->groups = "";
foreach ($groups as $group) {
if ( in_array($prog->id, $group->members) ) {
$prog->groups .= $group->name . " ";
}
}
}
}*/
$groups_all->groups=$other_groups;
$groups_all->current_user_groups=$current_user_groups;
return $groups_all;
}
//Formate l'achèvement d'activités pour le tableau de suivi. Pour chaque étudiant, on aura dans le bon ordre la liste des modules et le completionstate
function format_progress($progress, $modules, $groups, $active_group_id, $active_section_id){
global $CFG, $COURSE;
$students=array();
foreach ($progress as $prog_info) {
$progress_student=new StdClass();
$progress_student->firstname=$prog_info->firstname;
$progress_student->lastname=$prog_info->lastname;
//$progress_student->name=$prog_info->firstname." ".$prog_info->lastname;
$progress_student->id=$prog_info->id;
$progress_student->email=$prog_info->email;
$progress_student->progress=array();
$progress_student->report_link=$CFG->wwwroot . "/report/outline/user.php?id=" . $progress_student->id . "&course=" . $COURSE->id . "&mode=outline";
$progress_student->message_link=$CFG->wwwroot . "/message/index.php?id=" . $progress_student->id;
if ( $active_group_id == 0 ) {
$progress_student->groups = "";
foreach ($groups as $group) {
if ( in_array($progress_student->id, $group->members) ) {
$progress_student->groups .= $group->name . " ";
}
}
}
foreach($modules as $key=>$module){
$module_progress=new StdClass();
if(!isset($prog_info->progress[$module->id])){
$module_progress->completionstate='0';
}
else{
$module_progress->completionstate=$prog_info->progress[$module->id]->completionstate;
}
/*if($module->section == $active_section_id || $active_section_id == 0){
$module_progress->visible=true;
}
else{
$module_progress->visible=false;
}*/
$module_progress->namemodule=$module->name;
$module_progress->idmodule=$module->id;
$progress_student->progress[$key]=$module_progress;
}
$students[]=$progress_student;
}
return $students;
}
function get_activities($completion, $active_section_id){
$activities = $completion->get_activities();
$modules = [];
foreach ($activities as $activity) {
$module = new StdClass();
$module->id = $activity->id;
$module->name = $activity->name;
$displayname = format_string($activity->name, true, array('context' => $activity->context));
$module->displayname = strlen($displayname) > 20 ? mb_substr($displayname, 0, 19, 'UTF-8').'…' : $displayname;
$module->section = $activity->section;
$modules[] = $module;
if($activity->section == $active_section_id || $active_section_id==0 ){
$module->visible=true;
}
else{
$module->visible=false;
}
}
return $modules;
}
function get_sections($active_section_id){
global $COURSE;
// Liste des sections du cours
$modinfo = get_fast_modinfo($COURSE->id);
$sections_info_all = $modinfo->get_section_info_all();
$sections = [];
foreach ($sections_info_all as $key => $section_info) {
$section = new StdClass();
$section->id = $section_info->id;
$section->name = $section_info->name === NULL || $section_info->name === '' ? 'Section ' . $key : $section_info->name;
if($section->id==$active_section_id){ $section->selected="selected";
}
$sections[] = $section;
}
return $sections;
}
function set_filters($data, $filters, $symbols, $sections, $groups, $current_user_groups, $active_group_name, $active_section_id){
if (isset($_GET['filter'])) {
$filterComplete = $_GET['filter'];
$symbols[substr($filterComplete, 0, 1)]->selected="selected";
$filters[substr($filterComplete, 1)]->selected="selected";
} else {
$filters["0"]->selected="selected";
$symbols[">"]->selected="selected";
}
$data['filters']=array_values($filters);
$data['symbols']=array_values($symbols);
$data["sections"]=$sections;
$data["groups"]=array_values($groups);
$data['current_user_groups']=$current_user_groups;
//$data['active_section_id']=$active_section_id;
if($active_group_name==""){
$data['default_group']='selected';
}
$data['data']=array();
$data['data']["sections"]=$sections;
$data['data']["groups"]=array_values($groups);
$data['data']['current_user_groups']=$current_user_groups;
$data['data']['active_group_name']=$active_group_name;
$data['data']['active_section_id']=$active_section_id;
return $data;
}
function set_data($data, $modules, $progress, $groups, $active_group_id, $active_section_id){
global $COURSE, $USER, $CFG;
$data["modules"]=$modules;
$count_modules=count($data["modules"]);
$data["students"]=format_progress($progress, $modules, $groups, $active_group_id, $active_section_id);
$count_students=count($data["students"]);
if($count_students>0 && $count_modules>0){
$data['count_results']=count($data["students"]);
}
if (has_capability('course/iena:suivi_edit', $context = context_course::instance($COURSE->id), $USER->id)) {
$data['link_bulkcompletion']= $CFG->wwwroot . "/course/bulkcompletion.php?id=" . $COURSE->id;
}
$data['link_classicview']= $CFG->wwwroot . "/report/progress/index.php?course=" . $COURSE->id;
//Pour le téléchargement du tableau ?
if(!isset($data['data'])){
$data['data']=array();
}
$data['data']=json_encode($data);
return $data;
}
$filters=[
"0"=>(object)[
"value"=>"0",
"name"=>"0",
],
"25"=>(object)[
"value"=>"25",
"name"=>"25%",
],
"50"=>(object)[
"value"=>"50",
"name"=>"50%",
],
"75"=>(object)[
"value"=>"75",
"name"=>"75%",
],
"100"=>(object)[
"value"=>"100",
"name"=>"100%",
]
,
];
$symbols=[
"="=>(object)[
"value"=>"=",
"name"=>"=",
],
"<"=>(object)[
"value"=>"<",
"name"=>"<",
],
">"=>(object)[
"value"=>">",
"name"=>">",
]
];
$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));
$PAGE->set_url($url);
$course = $DB->get_record('course', array('id' => $courseID), '*', MUST_EXIST);
require_login($course);
require_once($CFG->libdir . '/completionlib.php');
$completion = new completion_info($course);
$context = context_course::instance($COURSE->id);
// if (!has_capability('moodle/course:sectionvisibility', $context = context_course::instance($courseID), $USER->id)) {
if (!has_capability('course/iena:suivi', $context = context_course::instance($courseID), $USER->id)) {
$link = $CFG->wwwroot . '/course/view.php?id=' . $courseID;
header("Location: {$link}");
exit;
}
if(isset($_GET['groupid'])){
$active_group_id = $_GET['groupid'];
}
else{
$active_group_id=0;
}
$progress = $completion->get_progress_all(
'',
array(),
$active_group_id,
'u.lastname ASC, u.firstname ASC',
'',
'',
$context
);
$active_section_id=0;
// Section du get acquise depuis le clic sur l'indicateur dans la page du cours, section depuis laquelle on a cliqué sur le bouton pour voir le suivi.
if(isset($_GET['sectionid'])){
$active_section_id = $_GET['sectionid'];
}
if ( $active_group_id == 0 ) {
//On récupère les ids des membres parce que dans l'excel on veut savoir qui appartient à quel groupe
//$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', true);
} else {
//On ne récupère pas les ids des membres
$groups = groups_get_all_groups($COURSE->id, 0, 0, 'g.*', false);
}
// If a post is sent trought the page
/*if ($_POST && !isset($_POST["action"])) {
require_once("$CFG->libdir/formslib.php");
require_once('view/view_send_message.php');
$usersID = $_POST["api_url"];
$view = new view_send_message();
echo $view->get_content($usersID);
} else */
if(isset($_POST['action']) && !empty($_POST['action'])) {
//Si on change les filtres
$data=[];
$modules=get_activities($completion, $active_section_id);
$data=set_data($data, $modules, $progress, $groups, $active_group_id, $active_section_id);
echo json_encode($data);
}
else {
init_page($course, $PAGE); echo $OUTPUT->header();
$current_user_groups=[];
$active_group_name="";
$data=[];
$modules=get_activities($completion, $active_section_id);
$groups_all=get_groups($context, $active_group_id, $progress, $groups);
if(isset($groups_all->current_user_groups) && !empty($groups_all->current_user_groups)){
$current_user_groups=$groups_all->current_user_groups;
}
$groups=$groups_all->groups;
$sections=get_sections($active_section_id);
$data=set_filters($data, $filters, $symbols, $sections, $groups, $current_user_groups, $active_group_name, $active_section_id);
$data=set_data($data, $modules, $progress, $groups, $active_group_id, $active_section_id);
if(isset($_GET["msg_success"])){
$msg=$_GET["msg_success"];
$data["msg_success"]=$msg;
}
$renderer = $PAGE->get_renderer('format_iena');
$renderer->display_completion($data);
echo $OUTPUT->footer();
}
?>