-
Myriam Delaruelle authoredMyriam Delaruelle authored
course_competency.php 11.05 KiB
<?php
require_once('../../config.php');
global $USER, $COURSE;
$courseid = required_param('courseid', PARAM_INT);
$studentid = required_param('studentid', PARAM_INT);
$competencyid = required_param('competencyid', PARAM_INT);
$url = new moodle_url('/blocks/competency_iena/course_competency.php', array('courseid' => $courseid, 'studentid' => $studentid, 'competencyid' => $competencyid));
$PAGE->set_url($url);
require_login($courseid, false, NULL);
$PAGE->set_pagelayout('course');
$PAGE->set_title(get_string('title_plugin', 'block_competency_iena'));
$PAGE->set_heading($OUTPUT->heading($COURSE->fullname, 2, 'headingblock header outline'));
$PAGE->requires->js("/blocks/competency_iena/js/dropdown.js");
$PAGE->requires->js("/blocks/competency_iena/js/cpt-stud-course.js");
/* <<< GESTION DROITS D'ACCÈS >>> */
$context = context_course::instance($courseid);
$coursenode = $PAGE->navigation->find($courseid, navigation_node::TYPE_COURSE);
$thingnode = $coursenode->add(get_string('details_competency', 'block_competency_iena'));
$thingnode->make_active();
/* Check if studentid is a course participant */
$is_enrolled = is_enrolled($context, $studentid, '', true);
/* Check if the user is teacher */
$is_teacher = false;
if (has_capability('moodle/course:update', $context, $USER->id)) {
$is_teacher = true;
}
/* Redirect student if he try accèss another student data */
if ( $is_teacher === false && $studentid != $USER->id ) {
$link = $CFG->wwwroot . '/blocks/competency_iena/course_competency.php?courseid=' . $courseid . '&studentid=' . $USER->id . '&competencyid=' . $competencyid;
header("Location: {$link}");
exit;
}
echo $OUTPUT->header();
/* <<< REVIEW DATA >>> */
$sql_rev = "SELECT * FROM {competency_usercomp}
WHERE userid = ? AND competencyid = ? AND status = ?";
$reviews_data = $DB->get_records_sql($sql_rev, [$studentid, $competencyid, 1]);
$review_asked = count($reviews_data) > 0 ? true : false;
/* <<< POST >>> */
/* POST EVALUATION */
if ( isset($_POST['grade']) ) {
$note = $_POST['note'];
\core_competency\api::grade_competency_in_course($courseid, $studentid, $competencyid, $_POST['grade'], $note);
if ( $review_asked ) {
\core_competency\api::user_competency_start_review($studentid, $competencyid);
\core_competency\api::user_competency_stop_review($studentid, $competencyid);
/* Refresh review data */
$reviews_data = $DB->get_records_sql($sql_rev, [$studentid, $competencyid, 1]);
$review_asked = count($reviews_data) > 0 ? true : false;
}
}
/* POST REVIEW */
if ( isset($_POST['review']) ) {
if ( $_POST['review'] == 'request' ) {
\core_competency\api::user_competency_request_review($studentid, $competencyid);
} elseif ( $_POST['review'] == 'cancel' ) {
\core_competency\api::user_competency_cancel_review_request($studentid, $competencyid);
}
/* Refresh review data */
$reviews_data = $DB->get_records_sql($sql_rev, [$studentid, $competencyid, 1]);
$review_asked = count($reviews_data) > 0 ? true : false;
}
/* <<< HELPERS >>> */
/* <<< DATA >>> */
/* Student USER object */
$student = user_get_users_by_id([$studentid])[$studentid];
/* All students */
/* Only if is teacher because it's to load stud list to switch : teacher feature */
$students = NULL;
if ( $is_teacher ) {
$students = get_enrolled_users($context);
}
/* Course modules linked to this competency */
$cm_ids = \core_competency\api::list_course_modules_using_competency($competencyid, $courseid);
/* Competency */
$u_c_cpt = \core_competency\api::get_user_competency_in_course($courseid, $studentid, $competencyid);
$cpt = new \core_competency\competency($competencyid);
$cpt->shortname=$cpt->get('shortname');
$cpt_scale = $cpt->get_scale()->scale_items;
$eval = "-"; /* current eval string */
if ( $u_c_cpt->get('grade') != null ) {
$eval = $cpt_scale[$u_c_cpt->get('grade') - 1];
}
$proficiency = $u_c_cpt->get('proficiency') == 1 ? "La compétence est validée" : "La compétence n'est pas encore validée";
$proficiency_class = $u_c_cpt->get('proficiency') == 1 ? "success" : "secondary";
/* All course competencies */
$course_cpts = \core_competency\course_competency::list_competencies($COURSE->id);
foreach ($course_cpts as $course_cpt) {
$course_cpt->shortname=$course_cpt->get("shortname");
}
/* COMPETENCY TREE PATH */
/* Competency tree parents path from current to framework */
$cptid = $competencyid;
$parent_cpts = array();
while ($cptid > 0) {
$tmp_cpt = new \core_competency\competency($cptid);
array_unshift($parent_cpts, ['id' => $tmp_cpt->get('id'), 'shortname' => $tmp_cpt->get('shortname'), 'description' => $tmp_cpt->get('description')]);
$cptid = $tmp_cpt->get('parentid');
}
/* Framework infos */
//$cpt_path_link = "<a href='#' data-toggle='modal' data-target='#modalref'>{$cpt->get_framework()->get('shortname')}</a>" . _modal_builder('modalref', $cpt->get_framework()->get('shortname'), $cpt->get_framework()->get('description'));
/* Each competency info */
/*foreach ($parent_cpts as $parent_cpt) {
$cpt_path_link .= " / <a href='#' data-toggle='modal' data-target='#modal{$parent_cpt['id']}'>{$parent_cpt['shortname']}</a>" . _modal_builder("modal{$parent_cpt['id']}", $parent_cpt['shortname'], $parent_cpt['description']);
}*/
/* Review and grade ASK and ACTION */
$review_class = $review_asked ? "info" : "secondary";
$review_msg = $review_asked ? "Évaluation demandée" : "Aucune évaluation demandée";
$is_me=false;
if ( $review_asked ) {
/* Request review and cancel buttons */
if ( $USER->id == $studentid ) {
$is_me=true;
}
} else {
if ( $USER->id == $studentid ) {
$is_me=true;
}
}
if ( $is_teacher ) {
$scale=array();
foreach ($cpt_scale as $key => $item) {
$scaleItem=new StdClass();
$scaleItem->label=$item;
$scaleItem->grade = $key + 1;
if ( $item == $eval ) {
$scaleItem->selected = " selected";
}
array_push($scale, $scaleItem);
}
}
/* GRADES AND EVIDENCES HISTORY CHART AND LIST */
/* Utilisation des renderer du /admin/tool/lp/class/output pour obtenir toutes les données d'historique construites et organisées */
/* /admin/tool/lp/user_competency.php?id= */
$tool_lp_renderer = $PAGE->get_renderer('tool_lp');
$user_competency = \core_competency\api::get_user_competency($studentid, $competencyid);
$user_cpt_all_data = new \tool_lp\output\user_competency_summary($user_competency);
$user_cpt_all_data = $user_cpt_all_data->export_for_template($tool_lp_renderer);
$all_evidences = $user_cpt_all_data->evidence;
if ( count($all_evidences) != 0 ) {
$user_cpt_course_data = new \tool_lp\output\user_competency_summary_in_course($studentid, $competencyid, $courseid);
$user_cpt_course_data = $user_cpt_course_data->export_for_template($tool_lp_renderer);
$course_evidences = $user_cpt_course_data->usercompetencysummary->evidence;
$course_evidences_ids = array();
foreach ($course_evidences as $course_evidence) {
$course_evidences_ids[] = $course_evidence->id;
}
/* CHART EVALUATION HISTORY */
$labels = array();
$series_data_all = array();
$series_data_course = array();
$series_data_other = array();
foreach ($all_evidences as $key => $ev) {
//partie chart
if ( isset($ev->grade) ) {
$labels[] = userdate($ev->timemodified, "%d/%m/%y");
$series_data_all[] = $ev->grade;
if ( in_array($ev->id, $course_evidences_ids) ) {
$series_data_course[] = $ev->grade;
$series_data_other[] = 0;
} else {
$series_data_course[] = 0;
$series_data_other[] = $ev->grade;
}
}
//fin partie chart
/* mark difference between this course evidences in html for JS filter with tabs */
if ( in_array($ev->id, $course_evidences_ids) ) {
$ev->is_course_evidence = " data-evidenceorigin=course";
} else {
$ev->is_course_evidence = " data-evidenceorigin=other";
}
if ( $ev->action === "0" ) {
$ev->grade_make_proficient = ' list-group-item-light';
} else {
/* proficient or not depending of rating in scale (set in framework by creator) */
$scale_rules = json_decode($user_cpt_all_data->competency->scaleconfiguration);
foreach ($scale_rules as $scale_rule) {
if ( isset($scale_rule->proficient) && $scale_rule->id == $ev->grade && $scale_rule->proficient == 1 ) {
$ev->grade_make_proficient = ' list-group-item-success';
break;
} else {
$ev->grade_make_proficient = '';
}
}
}
$ev->date = date("d/m/y – H:i", $ev->timemodified);
}
var_dump($all_evidences);
/* $chart = new core\chart_line(); */
$chart = new core\chart_bar();
$axis_labels = $cpt_scale;
array_unshift($axis_labels, "");
$chart->get_yaxis(0, true)->set_labels($axis_labels);
$series_all = new core\chart_series("Complet", array_reverse($series_data_all));
$series_course = new core\chart_series('Dans ce cours', array_reverse($series_data_course));
$series_other = new core\chart_series('Hors de ce cours', array_reverse($series_data_other));
// $chart->add_series($series_all);
$chart->add_series($series_course);
$chart->add_series($series_other);
$chart->set_labels(array_reverse($labels));
/* LIST COMPLETE HISTORY (evaluation and other evidences) */
} /* END IF count all evidences (course and outside) == 0 */
/*
TODO :
Remonter ces données en haut et commenter les données préalablement récupérées d'une autre manière devenues superflues avec celles-ci. Ca réduira l'impact du chargement de la page. Et ça sera plus propre et plus concis. Quand-même garder les éléments en commentaire au cas où les exporteurs sautent dans les prochaines versions de MOODLE.
*/
/* LINKED MODULES */
if ( count($cm_ids) !== 0 ) {
$modules=array();
$modinfo = get_fast_modinfo($courseid);
foreach ($cm_ids as $cm_id) {
$module=new StdClass();
$module->url = $modinfo->cms[$cm_id]->url->out();
$is_assign = strpos($url, '/mod/assign') !== false;
if ($is_teacher && $is_assign) {
$module->url = $url . "&rownum=0&action=grader&userid=" . $studentid;
}
$module->link_icon=$CFG->wwwroot."/theme/image.php/boost/".$modinfo->cms[$cm_id]->modname."/1/icon";
$module->name=$modinfo->cms[$cm_id]->name;
array_push($modules, $module);
}
}
$data=array();
$data['is_enrolled']=$is_enrolled;
$data['link_switch']=$CFG->wwwroot."/blocks/competency_iena/course_competency.php";
$data['courseid']=$courseid;
$data['competencyid']=$competencyid;
$data['studentid']=$studentid;
$data['student']=$student;
$data['students']=array_values($students);
$data['cpt']=$cpt;
$data['course_cpts']=array_values($course_cpts);
$data['is_teacher']=$is_teacher;
$data['review_class']=$review_class;
$data['review_msg']=$review_msg;
$data['is_me']=$is_me;
$data['link_review']=$CFG->wwwroot."/blocks/competency_iena/course_competency.php?courseid=".$courseid."&studentid=".$studentid."&competencyid=".$competencyid;
$data['scale']=$scale;
$data['all_evidences']=$all_evidences;
$data['count_all_evidences']=count($all_evidences);
if(isset($chart)){
$data['chart']=$OUTPUT->render($chart);
}
$data['count_cm_ids']=count($cm_ids);
$data['cm_ids']=$modules;
$data['proficiency']=$proficiency;
$data['proficiency_class']=$proficiency_class;
$data['eval']=$eval;
$data['review_asked']=$review_asked;
$renderer = $PAGE->get_renderer('block_competency_iena');
$renderer->get_dashboard_competency_student($data);
echo $OUTPUT->footer();
?>