Ajout de page/career vision professeur correcteur sur ses modules et les notes données aux groupes s'il y en a (moyenne, note min, max, ..) et possibilité d'affinage et donc d'afficher les élèves d'un groupe pour un partiel particulier

This commit is contained in:
xdrm-brackets 2015-11-14 18:33:06 +01:00
parent 6a2151caa1
commit 334272f0d1
9 changed files with 318 additions and 51 deletions

View File

@ -112,7 +112,6 @@ table.basic tr:hover td{ background-color: #fff; }
/* .transparentbg */
table.basic tr.transparentbg > td{ background-color: transparent; }
table.basic tr.transparentbg:hover > td{ background-color: transparent; }
table.basic tr.transparentbg .link{ background-color: #fff; }
table.basic tr.transparentbg > td{ color: inherit; }
@ -150,7 +149,7 @@ span.link{
box-shadow: inset 0 0 1px #f5f5f5;
/* background */
background: #eee;
background: #fff;
/* foreground */
color: #333;
@ -158,7 +157,7 @@ span.link{
/* extra */
cursor: pointer;
}
table.basic td > span.link{ background: #eee; }
span.link:hover{ color: #000; }
/*********************/

View File

@ -93,16 +93,20 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
/* GESTION DES CATEGORIES (SECTIONS)
*
* @param section<Element> l'élément à activer
* @param clearParam<Boolean> VRAI si on doit supprimer les variables de l'URL
*
* [1] selectionne l'élément, l'affichage de la page associée est géré par pageManager.js
* [2] déselectionne l'élément précédemment selectioné
*
*/
function selectSection(section){
function selectSection(section, clearParam){
// si @subSection est un <Element> de type <li> qui a la propriété "data-link" [ET] section pas déjà active
if( section instanceof Element && section.tagName == 'SPAN' && section.dataset.hasOwnProperty('link') ){
if( clearParam === true ) // si clearParam est vrai
pageM.vars = new Array(pageM.vars[0]); // on efface les paramètres de l'URL
// on charge la page
pageM.setPage( section.dataset.link );
@ -146,13 +150,16 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' );
}
// permet de recharger la page courante
function reload(){ selectSection( document.querySelector('#MENU span[data-link='+pageM.page+']') ); }
/* activation au chargement en fonction de la page courante de pageManager.js */
var lastSection = document.querySelector('#MENU span[data-link='+pageM.page+']');
if( lastSection != null )
selectSection(lastSection); // on l'active
/* Gestion des liens du menu */
DOM.MENU.addEventListener('click', function(e){ selectSection( e.target ); }, false);
DOM.MENU.addEventListener('click', function(e){ selectSection( e.target, true); }, false);

View File

@ -89,6 +89,39 @@ require_once __ROOT__.'/manager/database.php';
break;
/************************************/
/* liste des notes pour un contrôle */
/************************************/
case 'getNotesEnseignant': if( permission('teacher') ){
$areSetParam = isset($request->enseignant) && isset($request->controle); // les arguments existent
$typeOkParam = $areSetParam && is_string($request->enseignant); // si c'est des strings
$nEmptyParam = $typeOkParam && strlen($request->enseignant) > 0 && is_numeric($request->controle); // des bon types
$enseignantCheck = $nEmptyParam && preg_match('/^[\w -]{3,50}$/i', $request->enseignant); // nom bon format
// paramètre optionnel
$optionalGroupe = isset($request->groupe) && is_string($request->groupe) && strlen($request->groupe) > 1 && preg_match('/^[a-z0-9 -]{1,10}$/i', $request->groupe);
// définition (ou pas) du paramètre optionnel
if( $optionalGroupe ) $groupe = $request->groupe;
else $groupe = null;
if( $enseignantCheck ){ // si tout les paramètres sont bons
$controle = DataBase::getInstance()->getNotesEnseignant($request->enseignant, $request->controle, $groupe);
if( is_array($controle) ){ // si on a bien un tableau
$answer->controle = $controle; // on renvoie dans answer->controle
$answer->request = 'success'; // et on renvoie success
}else // sinon si c'est pas un tableau
$answer->request = $controle; // on retourne l'erreur
}else
$answer->request = 'param_error';
}else
$answer->request = 'permission_error';
break;
/***********/

View File

@ -652,6 +652,31 @@ class DataBase{
/********************************************/
/*** retourne les notes pour un contrôle ***/
/********************************************/
public function getNotesEnseignant($enseignant, $controle, $groupe=null){ // [OPTIONNEL] $groupe
// on récupère l'UID du contrôle, s'il existe
if( $groupe != null )
if( !($groupeUID=groupRepo::UID($groupe)) ) return 'unknown_group'; else $groupeUID = (int) $groupeUID;
else
$groupeUID = null;
// on récupère les informations du contrôle
if( ! ($noteList=controleRepo::info($controle)) ) return 'unknown_controle';
$noteList['notes'] = noteRepo::forTeacher($controle, $groupeUID);
return $noteList;
}
/**************************************/
/*** retourne les notes d'un module ***/
/**************************************/

View File

@ -14,12 +14,17 @@ class controleRepo extends DBAccess{
*
* @controleUID<int> l'UID du controle duquel on veut les infos
*
* @return controle<Array> tableau associatif contenant tout les champs de la BDD pour ce controle
* @return controle<Array> tableau associatif contenant tout les champs de la BDD pour ce controle
*
*/
public static function info($controleUID){
// on considère que le semestre existe
$getControleInfo = DataBase::getPDO()->prepare("SELECT id_controle as id, id_mcc_module, intitule, base, coefficient, date_publication FROM controle WHERE id_controle = :controleUID");
$getControleInfo = DataBase::getPDO()->prepare("SELECT ctrl.id_controle as id, ctrl.id_mcc_module, m.nom as module, m.libelle as modulelib, ctrl.intitule, ctrl.base, ctrl.coefficient, ctrl.date_publication ".
"FROM controle as ctrl, mcc_module as mcc_m, module as m ".
"WHERE ctrl.id_mcc_module = mcc_m.id_mcc_module ".
"AND mcc_m.id_module = m.id_module ".
"AND id_controle = :controleUID");
$getControleInfo->execute(array(
':controleUID' => $controleUID
));
@ -71,9 +76,10 @@ class controleRepo extends DBAccess{
*/
public static function forTeacher($enseignant, $module, $semestre){
$getControleList = DataBase::getPDO()->prepare("SELECT DISTINCT ctrl.id_controle as id, ctrl.id_mcc_module, ctrl.intitule, ctrl.base, ctrl.coefficient, ctrl.date_publication ".
"FROM enseignement as ens, mcc_module as mcc_m, mcc_ue, controle as ctrl ".
"FROM enseignement as ens, module as m, mcc_module as mcc_m, mcc_ue, controle as ctrl ".
"WHERE ens.id_mcc_module = mcc_m.id_mcc_module ".
"AND mcc_m.id_mcc_module = ctrl.id_mcc_module ".
"AND mcc_m.id_module = m.id_module ".
"AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ".
"AND ens.id_enseignant = :enseignant ".

View File

@ -114,39 +114,68 @@ class noteRepo extends DBAccess{
/*
** PAS UTILISÉ POUR L'INSTANT
*/
/* RENVOIE LES NOTES DES ETUDIANTS POUR UN CONTROLE PARTICULIER
/* RENVOIE LES NOTES POUR UN CONTROLE PARTICULIER
*
* [1] Par groupe si aucun groupe spécifié (statistiques: moyenne, min, max, nb notes, ...)
* [2] Liste des élèves d'un groupe si aucun groupe spécifié
*
*
* @controle<int> l'UID du controle concerné
*
* @return notes<Array> retourne les notes des étudiants pour un controle particulier
* @groupe<int> ***OPTIONNEL*** l'UID du groupe spécifique
*
*
* @return notes<Array> [1] retourne les stats des notes pour les groupes à ce contrôle
* [2] retourne les notes des étudiants du groupe spécifié pour ce contrôle
*
*/
public static function forTeacher($controle){
$getNoteList = DataBase::getPDO()->prepare("SELECT DISTINCT g.id_groupe, g.nom as groupe, n.id_note as id, n.id_appartenance, n.id_controle, AVG(n.valeur) as moyenne, min(n.valeur) as min, max(n.valeur) as max, COUNT(n.valeur) as nb_notes ".
"FROM note as n, appartenance as app, semestre as s, controle as ctrl, mcc_ue, mcc_module as mcc_m, groupe as g ".
"WHERE n.id_appartenance = app.id_appartenance ".
"AND app.id_semestre = s.id_semestre ".
"AND app.id_groupe = g.id_groupe ".
"AND s.id_semestre = mcc_ue.id_semestre ".
"AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ".
"AND mcc_m.id_mcc_module = ctrl.id_mcc_module ".
"AND n.id_controle = ctrl.id_controle ".
public static function forTeacher($controle, $groupe=null){
/* [1] Statistiques des groupes
============================================================*/
if( !is_int($groupe) ){
"AND ctrl.id_controle = :controle ".
$getNoteList = DataBase::getPDO()->prepare("SELECT DISTINCT g.id_groupe, g.nom as groupe, n.id_note as id, n.id_appartenance, n.id_controle, AVG(n.valeur) as valeur, min(n.valeur) as min, max(n.valeur) as max, COUNT(n.valeur) as nb_notes ".
"FROM note as n, appartenance as app, semestre as s, controle as ctrl, mcc_ue, mcc_module as mcc_m, groupe as g ".
"WHERE n.id_appartenance = app.id_appartenance ".
"AND app.id_semestre = s.id_semestre ".
"AND app.id_groupe = g.id_groupe ".
"AND s.id_semestre = mcc_ue.id_semestre ".
"AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ".
"AND mcc_m.id_mcc_module = ctrl.id_mcc_module ".
"AND n.id_controle = ctrl.id_controle ".
"GROUP BY g.id_groupe ".
"AND ctrl.id_controle = :controle ".
"ORDER BY g.nom ASC");
$getNoteList->execute(array( ':controle' => $controle ));
"GROUP BY g.id_groupe ".
"ORDER BY g.nom ASC");
$getNoteList->execute(array( ':controle' => $controle ));
/* [2] Notes des étudiants d'un groupe
============================================================*/
}else{
$getNoteList = DataBase::getPDO()->prepare("SELECT DISTINCT n.id_note as id, g.nom as groupe, app.id_etudiant as etudiant, n.id_appartenance, n.id_controle, n.valeur ".
"FROM note as n, appartenance as app, semestre as s, controle as ctrl, mcc_ue, mcc_module as mcc_m, groupe as g ".
"WHERE n.id_appartenance = app.id_appartenance ".
"AND app.id_semestre = s.id_semestre ".
"AND app.id_groupe = g.id_groupe ".
"AND s.id_semestre = mcc_ue.id_semestre ".
"AND mcc_ue.id_mcc_ue = mcc_m.id_mcc_ue ".
"AND mcc_m.id_mcc_module = ctrl.id_mcc_module ".
"AND n.id_controle = ctrl.id_controle ".
"AND ctrl.id_controle = :controle ".
"AND app.id_groupe = :groupe ".
"ORDER BY g.nom ASC");
$getNoteList->execute(array( ':controle' => $controle, ':groupe' => $groupe ));
}
return DataBase::delNumeric( $getNoteList->fetchAll() );
}
}

View File

@ -5,17 +5,90 @@
/***********************************************/
if( document.querySelector('#CONTAINER section[name=controlesenseignants]') ){ // on traite uniquement si la section est définie
// on récupère les liens
var groupLinks = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic table.basic tr td span.link.group');
// /**************************************************/
// /* GESTION DES LIENS POUR LES CONTRÔLES & GROUPES */
// /**************************************************/
// var groupControlList = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic table.basic tr td span.link.grp.ctrl');
for( var i = 0 ; i < groupLinks.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes
groupLinks[i].addEventListener('click', function(e){
// for( var i = 0 ; i < groupControlList.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes
// groupControlList[i].addEventListener('click', function(e){
// if( e.target.className == 'link grp ctrl' && e.target.dataset.hasOwnProperty('grp') && e.target.dataset.hasOwnProperty('ctrl') ){ // s'il s'agit bien d'un nom de groupe
// pageM.vars[2] = e.target.dataset.grp; // le groupe en question
// pageM.vars[1] = e.target.dataset.ctrl; // le contrôle en question
// reload();
// }
// }, false);
// /****************************************/
// /* GESTION DES LIENS POUR LES CONTRÔLES */
// /****************************************/
// // on récupère les liens
// var controleLinks = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic span.link.ctrl');
// for( var i = 0 ; i < controleLinks.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes
// controleLinks[i].addEventListener('click', function(e){
// if( e.target.className == 'link ctrl' && e.target.dataset.hasOwnProperty('ctrl') ){ // s'il s'agit bien d'un nom de groupe
// if( pageM.vars.length > 2 ) // si le groupe est défini, on le dé-défini
// pageM.vars.pop();
// pageM.vars[1] = e.target.dataset.ctrl; // le contrôle en question
// reload();
// }
// }, false);
// /**************************************/
// /* GESTION DES LIENS POUR LES GROUPES */
// /**************************************/
// // on récupère les liens
// var groupList = document.querySelectorAll('#CONTAINER section[name=controlesenseignants] table.basic span.link.grp');
// for( var i = 0 ; i < groupList.length ; i++ ) // on active un évènement pour le clic sur les nom de groupes
// groupList[i].addEventListener('click', function(e){
// if( e.target.className == 'link grp' && e.target.dataset.hasOwnProperty('grp') ){ // s'il s'agit bien d'un nom de groupe
// pageM.vars[2] = e.target.dataset.grp; // le contrôle en question
// console.log( e.target.dataset.grp );
// reload();
// }
// }, false);
controlesenseignantSection = document.querySelector('#CONTAINER section[name=controlesenseignants]');
if( controlesenseignantSection != null ){ // si la section enseignant est présente sur la page
controlesenseignantSection.addEventListener('click', function(e){ // on créé l'évènement
/* LIENS POUR LES GROUPES ET CONTRÔLES */
if( e.target.className == 'link grp ctrl' && e.target.dataset.hasOwnProperty('grp') && e.target.dataset.hasOwnProperty('ctrl') ){
pageM.vars[1] = e.target.dataset.ctrl;
pageM.vars[2] = e.target.dataset.grp;
reload();
if( e.target.className == 'link group' && e.target.dataset.hasOwnProperty('grp') && e.target.dataset.hasOwnProperty('ctrl') ){ // s'il s'agit bien d'un nom de groupe
console.log('id_groupe: '+ e.target.dataset.grp +', id_controle: '+ e.target.dataset.ctrl );
}
/* LIENS POUR LES GROUPES */
if( e.target.className == 'link grp' && e.target.dataset.hasOwnProperty('grp') ){
pageM.vars[2] = e.target.dataset.grp;
reload();
}
/* LIENS POUR LES CONTRÔLES */
if( e.target.className == 'link ctrl' && e.target.dataset.hasOwnProperty('ctrl') ){
pageM.vars[1] = e.target.dataset.ctrl;
if( pageM.vars[2] != null )
pageM.vars.pop();
reload();
}
}, false);
console.log(groupLinks);
}
}

View File

@ -119,7 +119,7 @@ if( document.querySelector('#CONTAINER section[name=movestudents]') != null ){ /
};
API.send(request, function(response){ // on gère la réponse de API, si déplacement effectué, on recharge la page
if( response.request == 'success' ) selectSection( document.querySelector('#MENU > span[data-link='+pageM.page+']') );
if( response.request == 'success' ) reload();
});
}
@ -147,7 +147,7 @@ DOM.CONTAINER.addEventListener('change', function(e){
pageM.vars[2] = e.target.value; // on active le groupe
}
selectSection( document.querySelector('#MENU > span[data-link='+pageM.page+']') );
reload();
// console.log(e.target.getAttribute('name')+' = '+e.target.value);
}
}, false);

View File

@ -14,14 +14,19 @@ require_once __ROOT__.'/manager/career.php';
foreach($_POST as $k=>$v)
array_push($postVars, $k);
/* GESTION CONTRÔLE OPTIONNEL */
if( isset($postVars[1]) && is_int($postVars[1]) )
$controleOpt = (String) $postVars[1];
else
$controleOpt = null;
/* GESTION GROUPE OPTIONNEL */
if( isset($postVars[1]) && is_string($postVars[1]) && strlen($postVars[1]) > 1 )
$groupeOpt = $postVars[1];
if( isset($postVars[2]) && is_string($postVars[2]) && strlen($postVars[2]) > 1 )
$groupeOpt = $postVars[2];
else
$groupeOpt = null;
/****************************************
* *
* SECTION "PARCOURS" *
@ -112,13 +117,23 @@ if( permission('student') ){ // si l'utilisateur est connecté et que c'est un
/***********************************/
/*** LES UE (version enseignant) ***/
/***********************************/
if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un élève
/******************************************/
/*** LES CONTRÔLES (version enseignant) ***/
/******************************************/
/*
*
* [1] Tous les contrôles
* [2] Un contrôle particulier( avec ou sans groupe particulier )
*
*/
/* [1] Tous les contrôles
==================================================================*/
if( permission('teacher') && $controleOpt == null ){ // si c'est un enseignant et qu'aucun contrôle n'est spécifié
$request = new stdClass(); $answer = new stdClass();
debug();
$request->level_1 = 'getControlesEnseignant';
$request->enseignant = $_SESSION['identifiant'];
@ -151,7 +166,7 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un
foreach($module['controles'] as $controle){ // pour chaque contrôle
echo '<tr>';
echo '<td><span class=link>'.$controle['intitule'].'</span></td>';
echo "<td><span class='link ctrl' data-ctrl='".$controle['id']."'>".$controle['intitule']."</span></td>";
echo "<td>".$module['nom']." - ".$module['libelle']."</td>";
@ -168,14 +183,14 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un
foreach($controle['notes'] as $note){ // on affiche la liste des élèves avec leurs notes
echo "<tr>";
echo "<td><span class='link group' data-grp='".$note['id_groupe']."' data-ctrl='".$controle['id']."'>".$note['groupe']."</span></td>";
echo "<td><span class='link grp ctrl' data-grp='".$note['groupe']."' data-ctrl='".$controle['id']."'>".$note['groupe']."</span></td>";
if( $note['nb_notes'] == 1 )
echo "<td>".$note['nb_notes']." <span class=unstressed>note</span></td>";
else
echo "<td>".$note['nb_notes']." <span class=unstressed>notes</span></td>";
echo "<td><span class=unstressed>Allant de</span> ".$note['min']." <span class=unstressed>à</span> ".$note['max']."</td>";
echo "<td><span class=unstressed>Moyenne de </span>".number_format($note['moyenne'], 2)." <span class=unstressed>/</span> ".$controle['base']."</td>";
echo "<td><span class=unstressed>Moyenne de </span>".number_format($note['valeur'], 2)." <span class=unstressed>/</span> ".$controle['base']."</td>";
echo "</tr>";
}
@ -198,6 +213,87 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un
}else
echo "<section name='controlesenseignants' title='Contrôles' class='basic'><table class=basic><tbody><tr><td>Aucun contrôle trouvé</td></tr></tbody></table></section>";
}
/* [2] Un contrôle particulier( avec ou sans groupe particulier )
==================================================================*/
elseif( permission('teacher') ){ // si enseignant et qu'un contrôle est spécifié
$request = new stdClass(); $answer = new stdClass();
$request->level_1 = 'getNotesEnseignant';
$request->enseignant = $_SESSION['identifiant'];
$request->controle = $controleOpt;
if( $groupeOpt != null ) $request->groupe = $groupeOpt; // on définit le groupe s'il est spécifié
career_switch_level_1($request, $answer);
if( $answer->request == 'success' ){
echo "<section name='controlesenseignants' title='Contrôles' class='basic'>";
// bouton retour
// echo "<table class='basic'><thead><tr><th><span class='link'>Retour</span></th></tr></thead></table>";
// echo "<table class='basic'><thead><tr><th></th></tr></thead></table>";
echo "<table class='basic col4'><thead>";
echo '<tr>';
echo "<th><span class='link ctrl' data-ctrl='".$answer->controle['id']."'>".$answer->controle['intitule']."</span></th>";
echo "<th>".$answer->controle['module']." - ".$answer->controle['modulelib']."</th>";
if( count($answer->controle['notes']) == 0 ) // si il y a au moins une note pour ce contrôle
echo '<th><span class=unstressed>Pas noté</span></th>';
else
echo '<th><span class=unstressed>Moyenne de</span> 10 <span class=unstressed>/</span> 20</th>';
// echo '<th>'.number_format($answer->controle['moyenne'], 2).'</th>';
echo '<th><span class=unstressed>Coefficient</span> '.number_format($answer->controle['coefficient'], 2).'</th>';
echo '</tr></thead>';
echo "<tbody>";
foreach($answer->controle['notes'] as $note){ // on affiche la liste des élèves avec leurs notes
echo "<tr>";
/* 1) s'il s'agit d'afficher par groupe */
if( isset($note['nb_notes']) ){
echo "<td><span class='link grp ctrl' data-grp='".$note['groupe']."' data-ctrl='".$answer->controle['id']."'>".$note['groupe']."</span></td>";
if( $note['nb_notes'] == 1 )
echo "<td>".$note['nb_notes']." <span class=unstressed>note</span></td>";
else
echo "<td>".$note['nb_notes']." <span class=unstressed>notes</span></td>";
echo "<td><span class=unstressed>Allant de</span> ".$note['min']." <span class=unstressed>à</span> ".$note['max']."</td>";
echo "<td><span class=unstressed>Moyenne de </span>".number_format($note['valeur'], 2)." <span class=unstressed>/</span> ".$answer->controle['base']."</td>";
/* 2) s'il s'agit d'afficher par élève */
}else{
echo "<td><span class='link etu' data-etu='".$note['etudiant']."' data-ctrl='".$answer->controle['id']."'>".$note['etudiant']."</span></td>";
echo "<td><span class='link grp' data-grp='".$note['groupe']."'>".$note['groupe']."</span></td>";
echo "<td>".number_format($note['valeur'], 2)." <span class=unstressed>/</span> ".$answer->controle['base']."</td>";
echo "<td></td>";
}
echo "</tr>";
}
echo '</tbody></table>';
}
}
@ -221,7 +317,6 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un
?>