diff --git a/css/global.css b/css/global.css index a8da609..1bb72f2 100755 --- a/css/global.css +++ b/css/global.css @@ -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; } /*********************/ diff --git a/js/actionScript.js b/js/actionScript.js index 49cfbd4..95e424a 100755 --- a/js/actionScript.js +++ b/js/actionScript.js @@ -93,16 +93,20 @@ var connected = !( DOM.AUTH.children[0].innerHTML == 'Connexion' ); /* GESTION DES CATEGORIES (SECTIONS) * * @param section l'élément à activer + * @param clearParam 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 de type
  • 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); diff --git a/manager/career.php b/manager/career.php index 65d0348..f8c7541 100755 --- a/manager/career.php +++ b/manager/career.php @@ -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; + + /***********/ diff --git a/manager/database.php b/manager/database.php index b22bffa..68def46 100755 --- a/manager/database.php +++ b/manager/database.php @@ -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 ***/ /**************************************/ diff --git a/manager/repo/controle.php b/manager/repo/controle.php index 58f28a8..91c9267 100755 --- a/manager/repo/controle.php +++ b/manager/repo/controle.php @@ -14,12 +14,17 @@ class controleRepo extends DBAccess{ * * @controleUID l'UID du controle duquel on veut les infos * - * @return controle tableau associatif contenant tout les champs de la BDD pour ce controle + * @return controle 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 ". diff --git a/manager/repo/note.php b/manager/repo/note.php index 13494cb..bfa8a9b 100755 --- a/manager/repo/note.php +++ b/manager/repo/note.php @@ -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 l'UID du controle concerné * - * @return notes retourne les notes des étudiants pour un controle particulier + * @groupe ***OPTIONNEL*** l'UID du groupe spécifique + * + * + * @return notes [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() ); } - } \ No newline at end of file diff --git a/page/_JS/career.js b/page/_JS/career.js index 96df9bb..da4285a 100644 --- a/page/_JS/career.js +++ b/page/_JS/career.js @@ -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); + } } diff --git a/page/_JS/groups.js b/page/_JS/groups.js index 6303038..49c60aa 100755 --- a/page/_JS/groups.js +++ b/page/_JS/groups.js @@ -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); diff --git a/page/career.php b/page/career.php index 2e24baf..abb8244 100755 --- a/page/career.php +++ b/page/career.php @@ -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 ''; - echo ''.$controle['intitule'].''; + echo "".$controle['intitule'].""; echo "".$module['nom']." - ".$module['libelle'].""; @@ -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 ""; - echo "".$note['groupe'].""; + echo "".$note['groupe'].""; if( $note['nb_notes'] == 1 ) echo "".$note['nb_notes']." note"; else echo "".$note['nb_notes']." notes"; echo "Allant de ".$note['min']." à ".$note['max'].""; - echo "Moyenne de ".number_format($note['moyenne'], 2)." / ".$controle['base'].""; + echo "Moyenne de ".number_format($note['valeur'], 2)." / ".$controle['base'].""; echo ""; } @@ -198,6 +213,87 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un }else echo "
    Aucun contrôle trouvé
    "; + + +} + +/* [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 "
    "; + + + // bouton retour + // echo "
    Retour
    "; + // echo "
    "; + + + echo ""; + + echo ''; + echo ""; + + echo ""; + + if( count($answer->controle['notes']) == 0 ) // si il y a au moins une note pour ce contrôle + echo ''; + else + echo ''; + // echo ''; + + echo ''; + + echo ''; + + echo ""; + + foreach($answer->controle['notes'] as $note){ // on affiche la liste des élèves avec leurs notes + echo ""; + + /* 1) s'il s'agit d'afficher par groupe */ + if( isset($note['nb_notes']) ){ + + echo ""; + + if( $note['nb_notes'] == 1 ) + echo ""; + else + echo ""; + + echo ""; + echo ""; + + /* 2) s'il s'agit d'afficher par élève */ + }else{ + + echo ""; + echo ""; + echo ""; + echo ""; + + } + + echo ""; + } + + echo '
    ".$answer->controle['intitule']."".$answer->controle['module']." - ".$answer->controle['modulelib']."Pas notéMoyenne de 10 / 20'.number_format($answer->controle['moyenne'], 2).'Coefficient '.number_format($answer->controle['coefficient'], 2).'
    ".$note['groupe']."".$note['nb_notes']." note".$note['nb_notes']." notesAllant de ".$note['min']." à ".$note['max']."Moyenne de ".number_format($note['valeur'], 2)." / ".$answer->controle['base']."".$note['etudiant']."".$note['groupe']."".number_format($note['valeur'], 2)." / ".$answer->controle['base']."
    '; + + } + + } @@ -221,7 +317,6 @@ if( permission('teacher') ){ // si l'utilisateur est connecté et que c'est un - ?>