Skip to content
Snippets Groups Projects
Select Git revision
  • c6e87d84a4614ff7f789596870b3fd9dd892bdc3
  • main default protected
  • nrpc
3 results

index.html

Blame
  • 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();
    }
    
    
    
    ?>