diff -urN cahier-de-prepa3.1.1/admin.php cahier-de-prepa3.2.0/admin.php
--- cahier-de-prepa3.1.1/admin.php	2013-10-22 16:52:51.324399507 +0200
+++ cahier-de-prepa3.2.0/admin.php	2013-12-27 11:25:14.174363180 +0100
@@ -10,7 +10,7 @@
 //// HTML ////
 //////////////
 // Haut de page, menu et message
-$p = 'accueil_admin';
+$p = ".$urladmin2";
 $t = 'Cahier de Prépa - Administration';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
@@ -139,7 +139,7 @@
 ?>
 
   <div class="item admin">
-  <form action="docs<?php echo str_replace('&amp;','?',$urladmin); ?>" method="post" enctype="multipart/form-data">
+  <form action="docs<?php echo $urladmin2; ?>" method="post" enctype="multipart/form-data">
     <input class="bouton" type="submit" name="envoie" value="Envoyer">
     <h3>Déposer un document</h3>
     <p class="ligne"><label for="nom">Nom à afficher&nbsp;: </label><input type="text" id="nom" name="nom" value="" size="50"></p>
@@ -160,7 +160,10 @@
 //////////////////////////
 // Nouvelle information //
 //////////////////////////
-$resultat = $mysqli->query('SELECT cle, nom FROM pages');
+$resultat = $mysqli->query("SELECT CONCAT_WS('/',m.cle,p.cle) AS cle, CONCAT_WS('/',m.nom,p.nom) AS nom
+                            FROM pages AS p LEFT JOIN matieres AS m ON p.mat = m.id
+                            WHERE FIND_IN_SET(p.mat,'0,${_SESSION['matieres']}')
+                            ORDER BY FIND_IN_SET(p.mat,'0,${_SESSION['matieres']}'), p.ordre");
 $select_pages = '';
 while ( $r = $resultat->fetch_assoc() )
   $select_pages .= "        <option value=\"${r['cle']}\">${r['nom']}</option>\n";
@@ -168,7 +171,7 @@
 ?>
 
   <div class="item admin">
-  <form action=".<?php echo str_replace('&amp;','?',$urladmin); ?>" method="post">
+  <form action=".<?php echo $urladmin2; ?>" method="post">
     <input class="bouton" type="submit" name="modifie" value="Valider" title="Valider les modifications sur le titre ou le texte">
     <h3>Enregistrer une nouvelle information</h3>
     <p class="ligne"><label for="page">Page&nbsp;: </label>
diff -urN cahier-de-prepa3.1.1/cdt.php cahier-de-prepa3.2.0/cdt.php
--- cahier-de-prepa3.1.1/cdt.php	2013-11-03 15:38:13.293549138 +0100
+++ cahier-de-prepa3.2.0/cdt.php	2013-12-25 22:58:10.570164009 +0100
@@ -219,7 +219,7 @@
 ////////////
 /// HTML ///
 ////////////
-$p = "cdt?${matiere['cle']}";
+$p = "cdt?${matiere['cle']}$urladmin";
 $t = "Cahier de texte - ${matiere['nom']}";
 
 // Demander l'identification si la page est protégée et l'utilisateur non connecté
diff -urN cahier-de-prepa3.1.1/cdt-seances.php cahier-de-prepa3.2.0/cdt-seances.php
--- cahier-de-prepa3.1.1/cdt-seances.php	2013-10-21 22:11:59.354247436 +0200
+++ cahier-de-prepa3.2.0/cdt-seances.php	2013-12-25 22:58:46.854165170 +0100
@@ -118,7 +118,7 @@
 //////////////
 //// HTML ////
 //////////////
-$p = "cdt?${matiere['cle']}";
+$p = "cdt?${matiere['cle']}$urladmin";
 $t = "Modification des raccourcis du cahier de texte - ${matiere['nom']}";
 // Haut de page, menu et message
 include('haut.php');
diff -urN cahier-de-prepa3.1.1/cdt-types.php cahier-de-prepa3.2.0/cdt-types.php
--- cahier-de-prepa3.1.1/cdt-types.php	2013-10-21 00:40:53.495768519 +0200
+++ cahier-de-prepa3.2.0/cdt-types.php	2013-12-25 22:59:06.922165812 +0100
@@ -107,7 +107,7 @@
 //////////////
 //// HTML ////
 //////////////
-$p = "cdt?${matiere['cle']}";
+$p = "cdt?${matiere['cle']}$urladmin";
 $t = "Modification des types du cahier de texte - ${matiere['nom']}";
 // Haut de page, menu et message
 include('haut.php');
diff -urN cahier-de-prepa3.1.1/CHANGELOG.php cahier-de-prepa3.2.0/CHANGELOG.php
--- cahier-de-prepa3.1.1/CHANGELOG.php	2013-11-03 16:39:06.333666036 +0100
+++ cahier-de-prepa3.2.0/CHANGELOG.php	2013-12-30 23:46:41.144081201 +0100
@@ -1,4 +1,4 @@
-Version actuelle : 3.1.0 (24/10/13)
+Version actuelle : 3.1.1 (30/12/13)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -77,7 +77,7 @@
         Suppression du exit de CHANGELOG.php
 3.0.3 03/09/13 Correction d'un bug dans docs.php modifiant les dates d'envoi et tailles de tous
         les documents lors de la mise à jour d'un seul (merci PH. Jondot)
-3.1.0 24/10/13 Nouvelles foncionnalités :
+3.1.0 24/10/13 Nouvelles fonctionnalités :
         * Modifications des cahiers de texte (possibilité de voir toute l'année, affiche/efface
         les horaires en fonction du type de séance dans l'interface administrative)
         * Possibilité de prévisualiser les textes tapés en textarea
@@ -92,16 +92,16 @@
         * Liens incorrects dans le flux RSS
 3.1.1 03/11/13 Correction d'un bug sur l'affichage du cahier de texte (merci O. Bouverot) et d'un
         problème de définition MySQL des liens des informations récentes (merci A. Carrade)
-        
-
+3.2.0 30/12/13 Améliorations et nouvelles fonctionnalités :
+        * Modification de la page de lecture du flux RSS : affichage complet + lien
+        * Ordre d'affichage des documents modifiable
+        * Possibilité d'associer des pages d'informations à une matière
+        * Possibilité d'afficher dans le menu des liens directs vers des répertoires
+        Corrections de bugs :
+        * Noms de documents contenant un / tronqués (merci E. Blanc)
+        * Propagation de la demande d'identification pour les répertoires et documents mal réalisée
 ===================
 
-[ 3.2 ] Décembre 2013
- * page de lecture du flux RSS : affichage complet + lien
- * ordre d'affichage des documents/cahiers de textes : chronologique, chronologique inversé
- * choix possible des répertoires apparaissant dans le menu
- * pages d'informations associées à des matières
-
 [ 3.3 ] Février 2014
  * gestion des informations récentes : choix des notifications, suppressions/modifications
  * gestion *des* flux RSS : plusieurs flux avec choix possible de ce qui y apparait
diff -urN cahier-de-prepa3.1.1/colles.php cahier-de-prepa3.2.0/colles.php
--- cahier-de-prepa3.1.1/colles.php	2013-10-24 12:01:32.821369814 +0200
+++ cahier-de-prepa3.2.0/colles.php	2013-12-25 22:59:41.702166925 +0100
@@ -225,7 +225,7 @@
 ////////////
 /// HTML ///
 ////////////
-$p = "colles?${matiere['cle']}";
+$p = "colles?${matiere['cle']}$urladmin";
 $t = "Programme de colles - ${matiere['nom']}";
 
 // Demander l'identification si la page est protégée et l'utilisateur non connecté
diff -urN cahier-de-prepa3.1.1/css/couleurs.css cahier-de-prepa3.2.0/css/couleurs.css
--- cahier-de-prepa3.1.1/css/couleurs.css	2013-10-22 12:11:26.247859183 +0200
+++ cahier-de-prepa3.2.0/css/couleurs.css	2013-12-25 15:37:23.913317712 +0100
@@ -9,9 +9,9 @@
 /* Style particuliers */
 .warning, .annonce { color: #A31F35; border: 1px solid #882C3C; }
 .note { color: #A31F35; }
-.prec, .suiv { color: #555; }
+.prec, .suiv, #ordre { color: #555; }
 #bas { color: #444; background-color: #C4D2B6;  border-top: 1px solid black;}
-.admin, .cdt, .colle, #recherche, #parents { border: 1px solid #16210B; }
+.admin, .cdt, .colle, .recents, #recherche, #parents { border: 1px solid #16210B; }
 
 /* Menu */
 #menu, #recent { background-color: #CCDDFF; }
diff -urN cahier-de-prepa3.1.1/css/style.css cahier-de-prepa3.2.0/css/style.css
--- cahier-de-prepa3.1.1/css/style.css	2013-10-24 17:19:01.685979380 +0200
+++ cahier-de-prepa3.2.0/css/style.css	2013-12-29 22:35:40.005180033 +0100
@@ -28,12 +28,15 @@
 .note { margin: 0.5em 2%; padding: 0 4%; }
 .prec { font-size: 0.8em; margin: 0 3%; float: left; }
 .suiv { font-size: 0.8em; margin: 0 3%; float: right; }
+#ordre { font-size: 0.8em; margin: 0 4% 1.5em; }
+#ordre img { height: 1em; vertical-align: sub; }
+#ordre span + span { margin-left: 5%; }
 
 /* Liens non soulignés */
 .prec, .suiv, h3 a, #menu a, #recent a, #bas a { text-decoration: none; }
 
 /* Ombres : propriétés CSS3 incomprises d'IE8 et inférieurs */
-#menu, #recent, .admin, .cdt, .colle {
+#menu, #recent, .admin, .cdt, .colle, .recents {
   box-shadow: 0.5em 0.5em 0.5em #777;
   -moz-box-shadow: 0.5em 0.5em 0.5em #777;
   -webkit-box-shadow: 0.5em 0.5em 0.5em #777;
@@ -52,6 +55,7 @@
 #menu a.ligne { display: inline !important; }
 #menu p.menusupp { margin: 0 3% 0.3em; font-size: 0.9em; }
 #menu p { padding: 0.1em 0px; }
+#menu a.menurep { padding-left: 0.5em; font-size: 0.9em; }
 #actuel { font-style: italic; }
 #rss { display: inline !important; margin: 0 !important; vertical-align: top; }
 #rss .icone { float: right; }
@@ -76,7 +80,7 @@
 .cdtsemaine { margin: 1em 0; padding-top: 0.2em; }
 
 /* Documents */
-#parents { margin: 0 2% 1em; padding: 1em 1%; }
+#parents { margin: 0 2% 0.5em; padding: 1em 1%; }
 #parents-vide { margin: 2px 2% 1em; padding: 1em 1%; height: 1.4em; }
 div.rep { margin: 0 0 0 2%; padding: 0; }
 p.rep { margin: 0.5em 0 0.5em 2%; padding: 0; }
diff -urN cahier-de-prepa3.1.1/debut.php cahier-de-prepa3.2.0/debut.php
--- cahier-de-prepa3.1.1/debut.php	2013-10-24 15:20:31.149751842 +0200
+++ cahier-de-prepa3.2.0/debut.php	2013-12-25 22:43:28.674135788 +0100
@@ -198,6 +198,7 @@
   
   // Paramètre supplémentaire "&admin" à passer dans les urls si $siteadmin est vide
   $urladmin = ( strlen($siteadmin) ) ? '' : '&amp;admin';
+  $urladmin2 = ( strlen($siteadmin) ) ? '' : '?admin';
   $lecteur = true;
 }
 
diff -urN cahier-de-prepa3.1.1/docs.php cahier-de-prepa3.2.0/docs.php
--- cahier-de-prepa3.1.1/docs.php	2013-10-24 14:35:18.165665026 +0200
+++ cahier-de-prepa3.2.0/docs.php	2014-01-01 14:35:08.232551845 +0100
@@ -61,7 +61,7 @@
   $mysqli->set_charset('utf8');
 
   // Récupération des données du répertoire
-  $resultat = $mysqli->query("SELECT nom, parent, protection, nbrep+nbdoc_v+nbdoc_nv AS nb FROM reps WHERE id = $rid");
+  $resultat = $mysqli->query("SELECT nom, parent, protection, nbrep+nbdoc_v+nbdoc_nv AS nb, menu FROM reps WHERE id = $rid");
   $rep = $resultat->fetch_assoc();
   $resultat->free();
 
@@ -106,15 +106,26 @@
       ) ? " Le répertoire <em>${rep['nom']}</em> a bien été déplacé." : " Le répertoire <em>${rep['nom']}</em> n'a pas pu être déplacé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
     }
 
+    // Modification de l'affichage dans le menu
+    $menu = isset($_REQUEST['menu']) ? 1 : 0;
+    if ( ( $rep['parent'] ) && ( $menu != $rep['menu'] ) )
+      $message .= ( $mysqli->query("UPDATE reps SET menu = $menu WHERE id = $rid") ) ? " L'affichage dans le menu du répertoire <em>${rep['nom']}</em> a bien été modifié." : " L'affichage dans le menu du répertoire <em>${rep['nom']}</em> n'a pas pu être modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+
     // Modification de la demande d'identification pour accéder au répertoire
     $protection = isset($_REQUEST['protection']) ? 1 : 0;
-    if ( $protection != $rep['protection'] )
-      $message .= ( $mysqli->query("UPDATE reps SET protection = $protection WHERE id = $rid") ) ? " La visibilité du répertoire <em>${rep['nom']}</em> a bien été modifiée." : " La visibilité du répertoire <em>${rep['nom']}</em> n'a pas pu être modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+    if ( $protection != $rep['protection'] )  {
+      if ( $mysqli->query("UPDATE reps SET protection = $protection WHERE id = $rid") )  {
+        $message .=  " La visibilité du répertoire <em>${rep['nom']}</em> a bien été modifiée.";
+        $rep['protection'] = $protection;
+      }
+      else
+        $message .= " La visibilité du répertoire <em>${rep['nom']}</em> n'a pas pu être modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+    }
     
     // Propagation de demande d'identification aux sous-répertoires et documents
     if ( isset($_REQUEST['propagation']) && ( $rep['nb'] ) )
-      $message .=  ( $mysqli->query("UPDATE reps SET protection = $protection WHERE FIND_IN_SET($rid,parents)")
-                  && $mysqli->query("UPDATE docs SET protection = $protection WHERE FIND_IN_SET($rid,parents) AND protection < 2")
+      $message .=  ( $mysqli->query("UPDATE reps SET protection = ${rep['protection']} WHERE FIND_IN_SET($rid,parents)")
+                  && $mysqli->query("UPDATE docs SET protection = ${rep['protection']} WHERE FIND_IN_SET($rid,parents) AND protection < 2")
       ) ? " La visibilité du répertoire <em>${rep['nom']}</em> a bien été propagée à tout son contenu (sous-répertoires et documents)." : " La visibilité du répertoire <em>${rep['nom']}</em> a bien été propagée à tout son contenu (sous-répertoires et documents). Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
 
     if ( !strlen($message) )
@@ -133,7 +144,8 @@
   elseif ( isset($_REQUEST['cree']) && ( strlen($_REQUEST['nom']) ) )  {
     $nom = $mysqli->real_escape_string($_REQUEST['nom']);
     $protection = isset($_REQUEST['protection']) ? 1 : 0;
-    $message = ( $mysqli->query("INSERT INTO reps SET parent = $rid, parents = '${parents[$rid]},$rid', nom = '$nom', matiere = (SELECT r.matiere FROM reps AS r WHERE r.id = $rid), nbrep = 0, nbdoc_v = 0, nbdoc_nv = 0, protection = $protection")
+    $menu = isset($_REQUEST['menu']) ? 1 : 0;
+    $message = ( $mysqli->query("INSERT INTO reps SET parent = $rid, parents = '${parents[$rid]},$rid', nom = '$nom', matiere = (SELECT r.matiere FROM reps AS r WHERE r.id = $rid), nbrep = 0, nbdoc_v = 0, nbdoc_nv = 0, protection = $protection, menu = $menu")
               && $mysqli->query("UPDATE reps SET nbrep = (nbrep + 1) WHERE id = $rid")
               && $mysqli->query('ALTER TABLE reps ORDER BY parents,nom')
     ) ? 'Le répertoire <em>'.stripslashes($nom).'</em> a bien été créé.' : 'Le répertoire <em>'.stripslashes($nom).'</em> n\'a pas pu être créé. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
@@ -171,26 +183,13 @@
   sauvegarde_mysql('reps');
   sauvegarde_mysql('docs');
 
-  // Fonction MySQL pour l'ordre "naturel" (1,2,10,11 et non 1,10,11,2)
-  $mysqli->query('DROP FUNCTION IF EXISTS ZPAD');
-  $mysqli->query('CREATE FUNCTION ZPAD(s VARCHAR(100))
-  RETURNS VARCHAR(100)
-BEGIN
-  DECLARE i INT DEFAULT 1;
-  DECLARE n INT DEFAULT 1;
-  WHILE i <= LENGTH(s) DO
-    IF FIND_IN_SET(SUBSTRING(s,i,1),"0,1,2,3,4,5,6,7,8,9") THEN
-      SET n = i + 1;
-      WHILE FIND_IN_SET(SUBSTRING(s,n,1),"0,1,2,3,4,5,6,7,8,9") DO
-        SET n = n + 1;
-      END WHILE;
-      SET s = CONCAT(LEFT(s,i-1),REPEAT("0",10-n+i),RIGHT(s,CHAR_LENGTH(s)+1-i));
-      SET i = i + 10;
-    END IF;
-    SET i = i + 1;
-  END WHILE;
-  RETURN s;
-END');
+  // Fonction PHP pour le stockage dans la base MySQL de l'ordre "naturel" (1,2,10,11 et non 1,10,11,2)
+  // Remplace tout nombre par un nombre égal mais écrit sur 10 chiffres, complété par des zéros à gauche
+  function zpad($s) {
+    return preg_replace_callback('/(\d+)/', function($m){
+      return(str_pad($m[1],10,'0',STR_PAD_LEFT)); }
+    , $s);
+  }
 
   // Traitement d'une modification d'un document
   if ( isset($_REQUEST['modifie_doc']) && ( $id ) )  {
@@ -201,10 +200,10 @@
 
       // Modification du nom
       setlocale(LC_CTYPE, "fr_FR.UTF-8");
-      $nom = basename(str_replace($doc['ext'],'',$_REQUEST['nom']));
+      $nom = basename(str_replace($doc['ext'],'',str_replace('/','-',$_REQUEST['nom'])));
       if ( $nom != $doc['nom'] )  {
         // real_escape_string seulement pour la requête SQL
-        if ( $mysqli->query('UPDATE docs SET nom = \''.$mysqli->real_escape_string($nom)."', nom_nat = ZPAD(nom) WHERE id = $id") )  {
+        if ( $mysqli->query('UPDATE docs SET nom = \''.$mysqli->real_escape_string($nom).'\', nom_nat = \''.zpad($mysqli->real_escape_string($nom))."' WHERE id = $id") )  {
           exec('mv documents/'.escapeshellarg("${doc['lien']}/${doc['nom']}${doc['ext']}").' documents/'.escapeshellarg("${doc['lien']}/$nom${doc['ext']}"));
           $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
           $message = " Le nom du document <em>$nom</em> a bien été modifié.";
@@ -323,7 +322,7 @@
     $nom = $_FILES['fichier']['name'];
     $ext = ( strpos($nom,'.') ) ? strrchr($nom,'.') : '';
     setlocale(LC_CTYPE, "fr_FR.UTF-8");
-    $nom = basename(str_replace($ext,'', ( strlen($_REQUEST['nom']) ) ? $_REQUEST['nom'] : $nom ));
+    $nom = basename(str_replace('/','-',str_replace($ext,'', ( strlen($_REQUEST['nom']) ) ? $_REQUEST['nom'] : $nom )));
     $protection = ( in_array($_REQUEST['protection'],array(0,1,2)) ) ? $_REQUEST['protection'] : 0;
     // Création du répertoire particulier
     $lien = substr(sha1(mt_rand()),0,15);
@@ -341,8 +340,9 @@
     if ( move_uploaded_file($_FILES['fichier']['tmp_name'],"documents/$lien/$nom$ext") )  {
       // Écriture MySQL
       if ( $mysqli->query("INSERT INTO docs SET parent = $rid, parents = '${r['parents']},$rid',
-                           matiere = ${r['matiere']}, nom = '".$mysqli->real_escape_string($nom)."',
-                           nom_nat = ZPAD(nom), upload = DATE(NOW()), taille = '$taille', lien = '$lien',
+                           matiere = ${r['matiere']}, nom = '".$mysqli->real_escape_string($nom).'\',
+                           nom_nat = \''.zpad($mysqli->real_escape_string($nom))."', upload = DATE(NOW()),
+                           taille = '$taille', lien = '$lien',
                            ext='".$mysqli->real_escape_string($ext)."', protection = $protection") )  {
         $id = $mysqli->insert_id;
         $mysqli->query('ALTER TABLE docs ORDER BY parents,nom_nat');
@@ -399,18 +399,26 @@
 }
 
 // Récupération des données, vérification de la protection, répertoires parents
-$resultat = $mysqli->query('SELECT r.nom, r.parent, r.parents, r.nbrep + r.nbdoc_v'.( ($admin) ? ' + r.nbdoc_nv' : '' )." AS nb, r.protection, m.cle, m.nom AS mat
+$resultat = $mysqli->query('SELECT r.nom, r.parent, r.parents, r.nbrep + r.nbdoc_v'.( ($admin) ? ' + r.nbdoc_nv' : '' )." AS nb,
+                            r.protection, r.menu, m.cle, m.nom AS mat
                             FROM reps AS r LEFT JOIN matieres AS m ON r.matiere = m.id
                             WHERE r.id = $rid");
 if ( $resultat->num_rows )  {
   $rep = $resultat->fetch_assoc();
   $resultat->free();
 
-  $p = ( is_null($rep['cle']) ) ? 'docs' : "docs?${rep['cle']}";
-  if ( $admin )
+  if ( $admin )  {
     $t = "Gestion des documents - ${rep['nom']}";
-  else
-    $t = ( is_null($rep['cle']) ) ? 'Documents à télécharger' : "Documents à télécharger - ${rep['mat']}";
+    $p = ( is_null($rep['cle']) ) ? "docs$urladmin2" : "docs?${rep['cle']}$urladmin";
+  }
+  elseif ( is_null($rep['cle']) )  {
+    $t = 'Documents à télécharger';
+    $p = 'docs';
+  }
+  else  {
+    $t = "Documents à télécharger - ${rep['mat']}";
+    $p = "docs?${rep['cle']}";
+  }
 
   // Demander l'identification si le répertoire est protégé et l'utilisateur non connecté
   if ( $rep['protection'] && !$lecteur && !$admin )
@@ -429,6 +437,11 @@
   
   <div class="item" id="parents">$parents
   </div>
+  
+  <div id="ordre">
+    <span>Ordre alphabétique&nbsp;<a href="?rep=$rid&amp;ordre=alpha"><img src="icones/down.png" alt="croissant"></a>&nbsp;<a href="?rep=$rid&amp;ordre=alpha-r"><img src="icones/up.png" alt="décroissant"></a></span>
+    <span>Ordre chronologique&nbsp;<a href="?rep=$rid&amp;ordre=chrono"><img src="icones/down.png" alt="croissant"></a>&nbsp;<a href="?rep=$rid&amp;ordre=chrono-r"><img src="icones/up.png" alt="décroissant"></a></span>
+  </div>
 
 FIN;
 
@@ -469,7 +482,23 @@
       }
 
       // Documents
-      $resultat = $mysqli->query("SELECT id, nom, taille, DATE_FORMAT(upload,'%d/%m/%Y') AS upload, LOWER(ext) AS ext, protection FROM docs WHERE parent = $rid AND (protection < 2 OR ".var_export($admin,true).')');
+      $ordre = '';
+      if ( isset($_REQUEST['ordre']) )
+        switch ( $_REQUEST['ordre'] )  {
+          case 'alpha':
+            $ordre = ' ORDER BY nom_nat ASC';
+            break;
+          case 'alpha-r':
+            $ordre = ' ORDER BY nom_nat DESC';
+            break;
+          case 'chrono':
+            $ordre = ' ORDER BY docs.upload ASC';
+            break;
+          case 'chrono-r':
+            $ordre = ' ORDER BY docs.upload DESC';
+        }
+      $protection = ( $admin ) ? '' : ' AND protection < 2';
+      $resultat = $mysqli->query("SELECT id, nom, taille, DATE_FORMAT(upload,'%d/%m/%Y') AS upload, LOWER(ext) AS ext, protection FROM docs WHERE parent = $rid$protection$ordre");
       if ( $resultat->num_rows )  {
         $icones = $GLOBALS['icones'];
         while ( $r = $resultat->fetch_assoc() )  {
@@ -525,7 +554,7 @@
 }
 else  {
   // Haut de page, menu et message
-  $p = 'docs';
+  $p = ( $admin ) ? "docs$urladmin2" : 'docs';
   $t = 'Documents à télécharger';
   include('haut.php');
   echo "\n  <h3 class=\"warning\">Ce répertoire n'existe pas.</h3>\n\n";
@@ -563,10 +592,14 @@
 
   <div class="item aide">
     <h3>Aide et explications</h3>
-    <p>Vous pouvez ici modifier le répertoire <?php echo $rep['nom']; ?> ainsi que l'ensemble des documents contenus dans les sous-répertoires. Les répertoires s'ouvrent en cliquant sur leur icone. Les documents sont modifiables en cliquant sur leur nom ou leur icone.</p>
+    <p>Vous pouvez ici modifier le répertoire <?php echo $rep['nom']; ?> ainsi que l'ensemble des documents contenus dans les sous-répertoires.</p>
+    <p>Les répertoires se déplient en cliquant sur leur icone, sont à leur tour modifiables en cliquant sur leur nom. Les documents sont modifiables en cliquant sur leur nom ou leur icone.</p>
     <p>Les liens vers les répertoires et les documents ne sont jamais modifiés par un déplacement ou un changement de nom.</p>
-    <p>Le lien dans le menu vers la page de téléchargement est généré automatiquement, seulement si des documents sont disponibles.</p>
-    <h4>Répertoire <?php echo $rep['nom']; ?></h4>
+    <p>Le lien dans le menu vers le répertoire de premier niveau est généré automatiquement, seulement si des documents sont disponibles.</p>
+    <h4>Préférences du répertoire</h4>
+    <p>Seul le répertoire <?php echo $rep['nom']; ?> est modifiable ici. Pour modifier le nom ou déplacer un autre répertoire, il faut afficher sa propre page en cliquant sur son nom.</p>    
+    <p>Il est possible de déplacer le répertoire <?php echo $rep['nom']; ?> en modifiant son répertoire parent.</p>
+    <p>La case à cocher <em>Affichage du répertoire dans le menu</em> permet d'afficher un lien direct dans le menu (partie publique et interface d'administration) vers la page correspondant au répertoire.</p>
     <p>La case à cocher <em>Demande d'identification pour l'affichage du contenu</em> permet de restreindre la visibilité du répertoire aux visiteurs qui se sont identifiés. Dans ce cas, après <a href="utilisateurs">avoir créé un compte pour les élèves ici</a>, ces informations seront accessibles aux élèves auxquels vous aurez donné l'identifiant et le mot de passe choisis.</p>
     <p>La case à cocher <em>Propager le choix ci-dessus à chaque document/sous-répertoire</em> permet de faire suivre le choix précédent à l'ensemble du contenu du répertoire. Si elle est décochée, aucune modification supplémentaire n'a lieu. Si elle est cochée, une action sera effectuée même si la précédente case n'a pas changé d'état.</p>
     <p>Seuls les répertoires vides peuvent être supprimés. Le répertoire <em>Général</em> et les répertoires à la racine de chaque matière ne peuvent être renommés, déplacés ou supprimés.</p>
@@ -575,7 +608,7 @@
     <p>Vous pouvez choisir la visibilité du document parmi trois possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: document accessible de tout visiteur</li>
-      <li><em>Visible après identification</em>&nbsp; document accessible uniquement après identification, par exemple pour que seuls vos élèves les voient. Il faut alors <a href="utilisateurs">créer un utilisateur de type élève</a>.</li>
+      <li><em>Visible après identification</em>&nbsp;: document accessible uniquement après identification, par exemple pour que seuls vos élèves les voient. Il faut alors <a href="utilisateurs">créer un utilisateur de type élève</a>.</li>
       <li><em>Non visible</em>&nbsp;: le document n'est pas encore visible en ligne. Cela peut être utile si vous souhaitez le mettre à disposition ultérieurement. C'est complètement sûr&nbsp;: vous pouvez mettre comme cela le prochain sujet de devoir ou même le corrigé.</li>
     </ul>
     <p>La taille du fichier envoyé est limitée à <?php echo $taille; ?>. Tout document est modifiable et déplaçable, sans que cela ne modifie le lien vers le document.</p>
@@ -588,7 +621,7 @@
     <p>Vous pouvez choisir la visibilité du document parmi trois possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: document accessible de tout visiteur</li>
-      <li><em>Visible après identification</em>&nbsp; document accessible uniquement après identification, par exemple pour que seuls vos élèves les voient. Il faut alors <a href="utilisateurs">créer un utilisateur de type élève</a>.</li>
+      <li><em>Visible après identification</em>&nbsp;: document accessible uniquement après identification, par exemple pour que seuls vos élèves les voient. Il faut alors <a href="utilisateurs">créer un utilisateur de type élève</a>.</li>
       <li><em>Non visible</em>&nbsp;: le document n'est pas encore visible en ligne. Cela peut être utile si vous souhaitez le mettre à disposition ultérieurement. C'est complètement sûr&nbsp;: vous pouvez mettre comme cela le prochain sujet de devoir ou même le corrigé.</li>
     </ul>
   </div>
@@ -604,6 +637,7 @@
 <?php echo str_replace("\"${rep['parent']}\"","\"${rep['parent']}\" selected",$select_reps); ?>
       </select>
     </p>
+    <p class="ligne"><label for="menurep">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" id="menurep" name="menu" value="1"<?php echo ( $rep['menu'] ) ? ' checked' : ''; echo $disabled; ?>></p>
     <p class="ligne"><label for="protecrep">Demande d'identification pour l'affichage du contenu&nbsp;: </label><input type="checkbox" id="protecrep" name="protection" value="1"<?php echo ( $rep['protection'] ) ? ' checked' : ''; ?>></p>
     <p class="ligne"><label for="propagation">Propager le choix ci-dessus à chaque document/sous-répertoire&nbsp;: </label><input type="checkbox" id="propagation" name="propagation" value="1"></p><?php echo $indication;?>
   </form>
@@ -627,6 +661,7 @@
     <input class="bouton" type="submit" name="cree" value="Créer">
     <h3>Créer un sous-répertoire</h3>
     <p class="ligne"><label for="nomssrep">Nom&nbsp;: </label><input type="text" id="nomssrep" name="nom" value="" size="50"></p>
+    <p class="ligne"><label for="menussrep">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" id="menussrep" name="menu" value="1"></p>
     <p class="ligne"><label for="protecssrep">Demande d'identification pour l'affichage du contenu&nbsp;: </label><input type="checkbox" id="protecssrep" name="protection" value="1"<?php echo ( $protection ) ? ' checked' : ''; ?>></p>
   </form>
   </div>
@@ -657,7 +692,6 @@
   });
   $('p.rep<?php echo $lock; ?> img').attr('src',function(i,val){return val.replace('rep-open','rep');}).parent().removeClass('open');
   $('div.rep .fic,div.rep div.rep').hide();
-//  $('#parents').after('<p>Vous pouvez ouvrir ou fermer des répertoires en cliquant sur leur icone.</p>');
 });
   </script>
   
@@ -666,38 +700,4 @@
 
 // Bas de page
 include('bas.php');
-
-
-exit();
-?>
-
-
-  <script type="text/javascript">
-$( function() {
-<?php
-  if ( $admin )  {
 ?>
-  $('.fic span').replaceWith(function() { return '<a href="">'+$(this).html()+'</a>'; });
-  $('.fic a').click( function () {
-    $(this).parent().find('form,hr').toggle();
-    $(this).parent().toggleClass('admin');
-    return false;
-  }).click();
-});
-<?php
-  }
-?>
-  $('p.rep<?php echo $lock; ?> img').css('cursor','pointer').click( function () {
-    var p = $(this).parent();
-    p.toggleClass('open');
-    p.parent().children('.fic:not(form,hr),div.rep').toggle();
-    $(this).attr('src',function(i,val){ return val.replace(p.is('.open')?'rep':'rep-open',p.is('.open')?'rep-open':'rep'); });
-    
-  });
-  $('p.rep<?php echo $lock; ?> img').attr('src',function(i,val){return val.replace('rep-open','rep');}).parent().removeClass('open');
-  //$('div.rep .fic:not(form,hr),div.rep div.rep').hide();
-  $('#parents').after('<p>Vous pouvez ouvrir ou fermer des répertoires en cliquant sur leur icone.</p>');
-});
-  </script>
-
-<?php
diff -urN cahier-de-prepa3.1.1/haut.php cahier-de-prepa3.2.0/haut.php
--- cahier-de-prepa3.1.1/haut.php	2013-10-24 16:06:41.277840487 +0200
+++ cahier-de-prepa3.2.0/haut.php	2013-12-30 00:41:13.253421098 +0100
@@ -17,13 +17,13 @@
   <script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
 <?php
 if ( $lecteur )
-  echo "  <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Nom du flux\" href=\"http://cahier-de-prepa.fr/$site/documents/".sha1($GLOBALS['base'])."/rss.xml\">\n";
+  echo "  <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Flux RSS\" href=\"http://cahier-de-prepa.fr/$site/documents/".sha1($GLOBALS['base'])."/rss.xml\">\n";
 else  {
   $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE matieres = \'0\'');
   if ( $resultat->num_rows )
     $resultat->free();
   else
-    echo "  <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Nom du flux\" href=\"http://cahier-de-prepa.fr/$site/documents/".sha1($GLOBALS['base'])."/rss.xml\">\n";
+    echo "  <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Flux RSS\" href=\"http://cahier-de-prepa.fr/$site/documents/".sha1($GLOBALS['base'])."/rss.xml\">\n";
 }
 if ( $admin )
 echo <<< FIN
@@ -55,74 +55,76 @@
 if ( $admin )  {
   
   // Début : déconnexion, accueil, documents toutes matières
-  $actuel = array();
-  $actuel['accueil'] = ( $p == 'accueil_admin' ) ? ' id="actuel"' : '';
-  $actuel['prefs'] = ( $p == 'prefs' ) ? ' id="actuel"' : '';
-  $lien = str_replace('&amp;','?',$urladmin);
-  $actuel['docs'] = ( $p == 'docs' ) ? ' id="actuel"' : '';
-  echo <<<FIN
+  $menu = <<<FIN
     <div>
       <form id="deconnexion" action="" method="post"><input type="submit" name="deconnexion" value="Se déconnecter"></form>
-      <a${actuel['accueil']} href=".$lien">Accueil</a>
-      <a${actuel['prefs']} href="prefs$lien">Préférences</a>
-      <a${actuel['docs']} href="docs$lien">Documents (toutes matières)</a>
-    </div>
-
+      <a href=".$urladmin2">Accueil</a>
+      <a href="prefs$urladmin2">Préférences</a>
+      <a href="docs$urladmin2">Documents (toutes matières)</a>
 FIN;
+  $resultat = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = 0 AND menu = 1");
+  if ( $resultat->num_rows )  {
+    while ( $r = $resultat->fetch_assoc() )
+      $menu .= "\n        <a class=\"menurep\" href=\"docs?rep=${r['id']}$urladmin\">${r['nom']}</a>";        
+    $resultat->free();
+  }
+  $menu .= "\n    </div>\n";
 
   // Matières à afficher dans le menu
-  $resultat = $mysqli->query("SELECT id, cle, nom, colles, cdt FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') ORDER BY FIND_IN_SET(id,'${_SESSION['matieres']}')");
+  $resultat = $mysqli->query("SELECT id, cle, nom, colles, cdt, docs FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') ORDER BY FIND_IN_SET(id,'${_SESSION['matieres']}')");
   $matieres = array();
   while ( $r = $resultat->fetch_assoc() )  {
-    // Stockage utilisé dans admin.php, prefs.php
+    // Stockage utilisé dans admin.php, prefs.php, pages.php
     $matieres[] = $r;
     // Pour le menu
-    $actuel['colles'] = ( $p == "colles?${r['cle']}" ) ? ' id="actuel"' : '';
-    $actuel['cdt'] = ( $p == "cdt?${r['cle']}" ) ? ' id="actuel"' : '';
-    $actuel['docs'] = ( $p == "docs?${r['cle']}" ) ? ' id="actuel"' : '';
-    echo <<<FIN
+    $menu .= <<<FIN
     <div>
       <h3>Matière <em>${r['nom']}</em></h3>
-      <a${actuel['colles']} href="colles?${r['cle']}$urladmin">Programme de colles</a>
-      <a${actuel['cdt']} href="cdt?${r['cle']}$urladmin">Cahier de texte</a>
-      <a${actuel['docs']} href="docs?${r['cle']}$urladmin">Documents</a>
-    </div>
-
-FIN;
+      <a href="colles?${r['cle']}$urladmin">Programme de colles</a>
+      <a href="cdt?${r['cle']}$urladmin">Cahier de texte</a>
+      <a href="docs?${r['cle']}$urladmin">Documents</a>
+FIN;
+    if ( $r['docs'] )  {
+      $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1");
+      if ( $resultat_doc->num_rows )  {
+        while ( $d = $resultat_doc->fetch_assoc() )
+          $menu .= "\n        <a class=\"menurep\" href=\"docs?rep=${d['id']}$urladmin\">${d['nom']}</a>";        
+        $resultat_doc->free();
+      }
+    }
+    $menu .= "\n    </div>\n";
   }
   $resultat->free();
 
   // Pages d'informations
-  $resultat = $mysqli->query('SELECT cle, nom FROM pages');
-  $aff = '';
-  while ( $r = $resultat->fetch_assoc() )
-    $aff .= "\n      <a ".( ( $p == $r['cle'] ) ? 'id="actuel" ' : '' )."href=\".?${r['cle']}$urladmin\">${r['nom']}</a>";
-  $resultat->free();
-  echo <<<FIN
+  $menu .= <<<FIN
     <div>
-      <h3>Pages d'informations</h3>$aff
-    </div>
-
+      <h3>Pages d'informations</h3>
 FIN;
+  $resultat = $mysqli->query("SELECT CONCAT_WS('/',m.cle,p.cle) AS cle, CONCAT_WS('/',m.nom,p.nom) AS nom
+                              FROM pages AS p LEFT JOIN matieres AS m ON p.mat = m.id
+                              WHERE FIND_IN_SET(p.mat,'0,${_SESSION['matieres']}')
+                              ORDER BY FIND_IN_SET(p.mat,'0,${_SESSION['matieres']}'), p.ordre");
+  while ( $r = $resultat->fetch_assoc() )
+    $menu .= "\n      <a href=\".?${r['cle']}$urladmin\">${r['nom']}</a>";
+  $resultat->free();
   
-  // Paramètres du site
-  $aff = '';
-  $liens = array(
-    "utilisateurs" => "Les utilisateurs",
-    "matieres" => "Les matières",
-    "pages" => "Les pages du site",
-    "semaines" => "Les semaines du planning annuel");
-  foreach ( $liens as $a => $l )
-    $aff .= "\n      <a ".( ( $p == $a ) ? 'id="actuel" ' : '' )."href=\"$a\">$l</a>";
-  echo <<<FIN
+  // Paramètres du site et lien vers la partie publique
+  $menu .= <<<FIN
+
+    </div>
     <div>
-      <h3>Paramètres du site</h3>$aff
+      <h3>Paramètres du site</h3>
+      <a href="utilisateurs$urladmin2">Les utilisateurs</a>
+      <a href="matieres$urladmin2">Les matières</a>
+      <a href="pages$urladmin2">Les pages du site</a>
+      <a href="semaines$urladmin2">Les semaines du planning annuel</a>
     </div>
     <div>
       <a href="http://$site/">Voir le site public (pensez à revenir vous déconnecter...)</a>
     </div>
 FIN;
-
+  
 }
 else  {
   // Menu de la partie publique : pages d'informations, page de
@@ -131,45 +133,64 @@
   // Rappel : $p doit être déjà définie (clé correspondant à la page)
 
   // Récupération et affichage des pages
-  $resultat = $mysqli->query('SELECT cle, nom FROM pages');
-  $aff = '';
+  $menu = '    <div>';
+  $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0');
   while ( $r = $resultat->fetch_assoc() )
-    $aff .= "\n      <a ".( ( $p == $r['cle'] ) ? 'id="actuel" ' : '' )."href=\".?${r['cle']}\">${r['nom']}</a>";
+    $menu .= "\n      <a href=\".?${r['cle']}\">${r['nom']}</a>";
   $resultat->free();
   // Page de téléchargement
-  $aff .= "\n      <a ".( ( $p == 'docs' ) ? 'id="actuel" ' : '' )."href=\"docs\">Documents à télécharger</a>";
-  echo <<<FIN
-    <div>$aff
-    </div>
-
-FIN;
+  $menu .= "\n      <a href=\"docs\">Documents à télécharger</a>";
+  $resultat = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = 0 AND menu = 1");
+  if ( $resultat->num_rows )  {
+    while ( $r = $resultat->fetch_assoc() )
+      $menu .= "\n        <a class=\"menurep\" href=\"docs?rep=${r['id']}\">${r['nom']}</a>";        
+    $resultat->free();
+  }
+  $menu .= "\n    </div>";
 
   // Récupération et affichage des matières
-  $resultat = $mysqli->query('SELECT cle, nom, MOD(colles,2) AS colles, MOD(cdt,2) AS cdt, docs
-                              FROM matieres WHERE MOD(colles,2)+MOD(cdt,2)+docs');
+  $resultat = $mysqli->query('SELECT m.id, m.cle, m.nom, MOD(m.colles,2) AS colles, MOD(m.cdt,2) AS cdt, m.docs,
+                              GROUP_CONCAT(CONCAT(m.cle,\'/\',p.cle) SEPARATOR \'//\') AS pcle,
+                              GROUP_CONCAT(p.nom SEPARATOR \'//\') AS pnom
+                              FROM matieres AS m LEFT JOIN pages AS p ON p.mat = m.id
+                              WHERE MOD(m.colles,2)+MOD(m.cdt,2)+m.docs OR p.nom IS NOT NULL GROUP BY m.id ORDER BY m.ordre, p.ordre');
   if ( $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )  {
-      $aff = '';
+      $menu .= "\n    <div>\n      <h3>${r['nom']}</h3>";
+      if ( !is_null($r['pcle']) )  {
+        $pcle = explode('//',$r['pcle']);
+        $pnom = explode('//',$r['pnom']);
+        $nom = $pnom[0];
+        foreach ( $pcle as $cle )  {
+          $menu .= "\n      <a href=\".?$cle\">$nom</a>";
+          $nom = next($pnom);
+        }
+      }
       if ( $r['colles'] )
-        $aff .= "\n      <a ".( ( $p == "colles?${r['cle']}" ) ? 'id="actuel" ' : '' )."href=\"colles?${r['cle']}\">Programme de colles</a>";
+        $menu .= "\n      <a href=\"colles?${r['cle']}\">Programme de colles</a>";
       if ( $r['cdt'] )
-        $aff .= "\n      <a ".( ( $p == "cdt?${r['cle']}" ) ? 'id="actuel" ' : '' )."href=\"cdt?${r['cle']}\">Cahier de texte</a>";
-      if ( $r['docs'] )
-        $aff .= "\n      <a ".( ( $p == "docs?${r['cle']}" ) ? 'id="actuel" ' : '' )."href=\"docs?${r['cle']}\">Documents à télécharger</a>";
-      echo <<<FIN
-    <div>
-      <h3>${r['nom']}</h3>$aff
-    </div>
-
-FIN;
+        $menu .= "\n      <a href=\"cdt?${r['cle']}\">Cahier de texte</a>";
+      if ( $r['docs'] )  {
+        $menu .= "\n      <a href=\"docs?${r['cle']}\">Documents à télécharger</a>";
+        $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1");
+        if ( $resultat_doc->num_rows )  {
+          while ( $d = $resultat_doc->fetch_assoc() )
+            $menu .= "\n        <a class=\"menurep\" href=\"docs?rep=${d['id']}\">${d['nom']}</a>";        
+          $resultat_doc->free();
+        }
+      }
+      $menu .= "\n    </div>";
     }
     $resultat->free();
   }
   
   // Lien vers l'interface d'administration
   $proto = ( $https ) ? 'https://' : 'http://';
-  echo "    <div>\n      <a href=\"".( ( strlen($siteadmin) ) ? $proto.$siteadmin : "$proto$site/?admin" )."\">Administration du site</a>\n    </div>";
+  $menu .= "\n    <div>\n      <a href=\"".( ( strlen($siteadmin) ) ? $proto.$siteadmin : "$proto$site/?admin" )."\">Administration du site</a>\n    </div>";
 }
+
+// Affichage du menu
+echo str_replace("a href=\"$p\"","a id=\"actuel\" href=\"$p\"",$menu);
 ?>
 
   </div>
Les fichiers binaires cahier-de-prepa3.1.1/icones/down.png et cahier-de-prepa3.2.0/icones/down.png sont différents
Les fichiers binaires cahier-de-prepa3.1.1/icones/up.png et cahier-de-prepa3.2.0/icones/up.png sont différents
diff -urN cahier-de-prepa3.1.1/index.php cahier-de-prepa3.2.0/index.php
--- cahier-de-prepa3.1.1/index.php	2013-10-24 12:04:12.585374927 +0200
+++ cahier-de-prepa3.2.0/index.php	2013-12-29 00:08:46.926594005 +0100
@@ -5,7 +5,9 @@
 
 // Recherche de la page concernée
 $mysqli = premiere_connexion();
-$resultat = $mysqli->query('SELECT id, cle, titre, nom, bandeau, protection FROM pages');
+$resultat = $mysqli->query('SELECT p.id, CONCAT_WS(\'/\',m.cle,p.cle) AS cle, p.mat,
+                                   p.titre, p.nom, p.bandeau, p.protection, p.ordre
+                            FROM pages AS p LEFT JOIN matieres AS m ON p.mat = m.id');
 if ( $resultat->num_rows )  {
   if ( !empty($_REQUEST) )  {
     // Si l'argument est donné sous la forme page=cle (pour admin.php, en POST)
@@ -123,7 +125,7 @@
       // Positionnement "caché" (n'apparaît pas sur la partie publique)
       elseif ( isset($_REQUEST['cache']) )  {
         if ( $mysqli->query("UPDATE infos SET cache = 1 WHERE id = $id") )  {
-          $message = 'L\'information n\'est plus diffusé&nbsp;: elle n\'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion.';
+          $message = 'L\'information n\'est plus diffusée&nbsp;: elle n\'apparaît plus sur la partie publique mais est toujours disponible ici pour modification ou diffusion.';
           // Suppression de l'éventuelle information récente
           recent($mysqli,1,$id);
         }
@@ -156,13 +158,27 @@
       $cle = $mysqli->real_escape_string($_REQUEST['cle']);
       $bandeau = $mysqli->real_escape_string($_REQUEST['bandeau']);
       $protection = ( isset($_REQUEST['protection']) ) ? 1 : 0;
-      // Envoi des données
-      $message = ( $mysqli->query("UPDATE pages SET nom = '$nom', titre = '$titre', cle = '$cle',
-                                   bandeau = '$bandeau', protection = $protection WHERE id = $pid")
-      ) ? 'Les données de la page ont bien été modifiées.' : 'Les données de la page n\'ont pas pu être modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
+      $mat = ( is_numeric($_REQUEST['mat']) ) ? $_REQUEST['mat'] : 0;
+      // Si matière identique
+      if ( $mat == $page['mat'] )
+        $message = ( $mysqli->query("UPDATE pages SET cle = '$cle', nom = '$nom', titre = '$titre',
+                                     bandeau = '$bandeau', protection = $protection WHERE id = $pid")
+        ) ? 'Les données de la page ont bien été modifiées.' : 'Les données de la page n\'ont pas pu être modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
+      else  {
+        $resultat = $mysqli->query("SELECT IFNULL(MAX(ordre)+1,1) AS max FROM pages WHERE mat = $mat");
+        $m = $resultat->fetch_assoc();
+        $resultat->free();
+        $message = ( $mysqli->query("UPDATE pages SET cle = '$cle', nom = '$nom', mat = $mat, titre = '$titre',
+                                     ordre = ${m['max']}, bandeau = '$bandeau', protection = $protection WHERE id = $pid")
+                  && $mysqli->query("UPDATE pages SET ordre = (ordre-1) WHERE mat = ${page['mat']} AND ordre > ${page['ordre']}")
+                  && $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre')
+        ) ? 'Les données de la page ont bien été modifiées.' : 'Les données de la page n\'ont pas pu être modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
+      }
       
       // Mise à jour des données de la page
-      $resultat = $mysqli->query("SELECT cle, titre, nom, bandeau, protection FROM pages WHERE id = $pid");
+      $resultat = $mysqli->query("SELECT CONCAT_WS('/',m.cle,p.cle) AS cle, p.mat,
+                                         p.titre, p.nom, p.bandeau, p.protection, p.ordre
+                                  FROM pages AS p LEFT JOIN matieres AS m ON p.mat = m.id WHERE p.id = $pid");
       $page = $resultat->fetch_assoc();
       $resultat->free();
     }
@@ -177,7 +193,7 @@
 //////////////
 //// HTML ////
 //////////////
-$p = $page['cle'];
+$p = ".?${page['cle']}$urladmin";
 $t = $page['titre'];
 
 // Interface d'administration
@@ -210,16 +226,29 @@
   
 <?php
 
+  // Select sur les matières
+  $select_matieres = '<option value="O">Pas de matière associée</option>';
+  $resultat = $mysqli->query("SELECT id, nom FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}')");
+  while ( $r = $resultat->fetch_assoc() )
+    $select_matieres .= "<option value=\"${r['id']}\">${r['nom']}</option>";
+  $resultat->free();
+  $select_matieres = str_replace("\"${page['mat']}\"","\"${page['mat']}\" selected",$select_matieres);  
+  $disabled = ( $page['ordre']+$page['mat'] == 1 ) ? ' disabled' : '';
+
   // Formulaire de modification des données de la page et formulaire d'ajout d'information
   $protection = ( $page['protection'] ) ? ' checked' : '';
+  $page['cle'] = basename($page['cle']);
   echo <<<FIN
   <div class="item admin">
-  <form action="?$p$urladmin" method="post">
+  <form action="$p" method="post">
     <input class="bouton" type="submit" name="modifie_page" value="Valider">
     <h3>Modifier les préférences de la page</h3>
     <p class="ligne"><label for="titre">Titre&nbsp;: </label><input type="text" id="titre" name="titre" value="${page['titre']}" size="80"></p>
     <p class="ligne"><label for="nom">Nom dans le menu&nbsp;: </label><input type="text" id="nom" name="nom" value="${page['nom']}" size="50"></p>
     <p class="ligne"><label for="cle">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle" name="cle" value="${page['cle']}" size="30"></p>
+    <p class="ligne"><label for="mat">Matière associée&nbsp;: </label>
+      <select id="mat" name="mat"$disabled>$select_matieres</select>
+    </p>
     <p class="ligne"><label for="bandeau">Texte de début&nbsp;:</label></p>
     <textarea id="bandeau" name="bandeau" rows="2" cols="100">${page['bandeau']}</textarea>
     <p class="ligne"><label for="protection">Demande d'identification pour l'affichage de la page&nbsp;: </label><input type="checkbox" id="protection" name="protection" value="1"$protection></p>
@@ -227,7 +256,7 @@
   </div>
 
   <div class="item admin">
-  <form action="?$p$urladmin" method="post">
+  <form action="$p" method="post">
     <input class="bouton" type="submit" name="modifie" value="Valider" title="Valider les modifications de la page">
     <h3>Ajouter une nouvelle information</h3>
     <p class="transparent"><input class="ligne" type="text" name="titre" size=50 maxlength=65533 value="Titre de l'information"></p>
@@ -258,7 +287,7 @@
       echo <<<FIN
 
   <div class="item admin$cache_classe">
-  <form action="?$p$urladmin" method="post">
+  <form action="$p" method="post">
     <h3>Information n°${r['ordre']}&nbsp;: ${r['titre']}$diff</h3>
     <p class="boutons">
       <input type="submit" name="modifie" value="Valider" title="Valider les modifications sur le titre ou le texte">$monte$descend$cache
diff -urN cahier-de-prepa3.1.1/installation.php cahier-de-prepa3.2.0/installation.php
--- cahier-de-prepa3.1.1/installation.php	2013-11-03 16:39:52.781667522 +0100
+++ cahier-de-prepa3.2.0/installation.php	2013-12-26 22:34:19.660883030 +0100
@@ -141,6 +141,7 @@
   `id` tinyint(2) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `ordre` tinyint(2) unsigned NOT NULL,
   `cle` varchar(50) NOT NULL,
+  `mat` tinyint(2) NOT NULL,
   `nom` varchar(50) NOT NULL,
   `titre` text NOT NULL,
   `bandeau` text NOT NULL,
@@ -229,6 +230,7 @@
   `nbdoc_v` tinyint(2) unsigned NOT NULL,
   `nbdoc_nv` tinyint(2) unsigned NOT NULL,
   `protection` tinyint(1) unsigned NOT NULL,
+  `menu` tinyint(1) unsigned NOT NULL,
   KEY `parent` (`parent`),
   KEY `matiere` (`matiere`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
diff -urN cahier-de-prepa3.1.1/MAJSQL.sql cahier-de-prepa3.2.0/MAJSQL.sql
--- cahier-de-prepa3.1.1/MAJSQL.sql	2013-11-03 16:35:22.777658882 +0100
+++ cahier-de-prepa3.2.0/MAJSQL.sql	2013-12-26 22:35:06.148884518 +0100
@@ -108,3 +108,12 @@
 -- 
 
 ALTER TABLE recents CHANGE lien lien VARCHAR( 30 ) NOT NULL;
+
+-- 
+-- Voilà les modifications à effectuer sur chaque base pour passer de Cahier de
+-- Prépa 3.1.1 à Cahier de Prépa 3.2.0.
+-- 
+
+ALTER TABLE pages ADD mat TINYINT( 2 ) UNSIGNED NOT NULL AFTER cle;
+ALTER TABLE reps ADD menu TINYINT( 1 ) UNSIGNED NOT NULL;
+
diff -urN cahier-de-prepa3.1.1/matieres.php cahier-de-prepa3.2.0/matieres.php
--- cahier-de-prepa3.1.1/matieres.php	2013-10-21 01:02:05.843809234 +0200
+++ cahier-de-prepa3.2.0/matieres.php	2013-12-27 11:04:18.894323011 +0100
@@ -99,6 +99,7 @@
                     && $mysqli->query("DELETE FROM `cdt-types` WHERE matiere = $id")
                     && $mysqli->query("DELETE FROM `cdt-seances` WHERE matiere = $id")
                     && $mysqli->query("DELETE FROM reps WHERE matiere = $id")
+                    && $mysqli->query("UPDATE pages SET mat = 0 WHERE mat = $id")
           ) ? "La matière <em>$nom</em> a bien été supprimée." : "La matière <em>$nom</em> n'a pas pu être supprimée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
       }
     }
@@ -111,7 +112,7 @@
 // HTML //
 //////////
 // Haut de page, menu et message
-$p = 'matieres';
+$p = "matieres$urladmin2";
 $t = 'Modifications des matieres';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
diff -urN cahier-de-prepa3.1.1/pages.php cahier-de-prepa3.2.0/pages.php
--- cahier-de-prepa3.1.1/pages.php	2013-08-21 01:21:08.725539702 +0200
+++ cahier-de-prepa3.2.0/pages.php	2013-12-29 00:06:42.026590008 +0100
@@ -14,12 +14,10 @@
   
   // Vérification que l'identifiant est valide. Défaut : id=0 (nouvelle page)
   if ( $id )  {
-    $resultat = $mysqli->query("SELECT id, nom, ordre, (SELECT MAX(p.ordre) FROM pages AS p) AS max FROM pages WHERE id = $id");
+    $resultat = $mysqli->query("SELECT id, nom, ordre, mat, (SELECT MAX(p.ordre) FROM pages AS p WHERE p.mat = pages.mat) AS max FROM pages WHERE id = $id");
     if ( $resultat->num_rows )  {
       $r = $resultat->fetch_assoc();
       $resultat->free();
-      $nom = $r['nom'];
-      $ordre = $r['ordre'];
     }
     else
       $id = 0;
@@ -39,43 +37,58 @@
       $cle = $mysqli->real_escape_string($_REQUEST['cle']);
       $nom = $mysqli->real_escape_string($_REQUEST['nom']);
       $protection = ( isset($_REQUEST['protection']) ) ? 1 : 0;
+      $mat = ( is_numeric($_REQUEST['mat']) ) ? $_REQUEST['mat'] : 0;
       // Si identifiant numérique non nul, modification d'une page existante
-      if ( $id )
-        $message = ( $mysqli->query("UPDATE pages SET cle = '$cle', nom = '$nom', titre = '$titre',
-                                     bandeau = '$bandeau', protection = $protection WHERE id = $id")
-        ) ? 'La page <em>'.stripslashes($nom).'</em> a bien été modifiée.' : "La page <em>${r['nom']}</em> n'a pas pu être modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+      if ( $id )  {
+        // Si matière identique
+        if ( $mat == $r['mat'] )
+          $message = ( $mysqli->query("UPDATE pages SET cle = '$cle', nom = '$nom', titre = '$titre',
+                                       bandeau = '$bandeau', protection = $protection WHERE id = $id")
+          ) ? 'La page <em>'.stripslashes($nom).'</em> a bien été modifiée.' : "La page <em>${r['nom']}</em> n'a pas pu être modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+        else  {
+          $resultat = $mysqli->query("SELECT IFNULL(MAX(ordre)+1,1) AS max FROM pages WHERE mat = $mat");
+          $m = $resultat->fetch_assoc();
+          $resultat->free();
+          $message = ( $mysqli->query("UPDATE pages SET cle = '$cle', nom = '$nom', mat = $mat, titre = '$titre',
+                                       ordre = ${m['max']}, bandeau = '$bandeau', protection = $protection WHERE id = $id")
+                    && $mysqli->query("UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > ${r['ordre']}")
+                    && $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre')
+          ) ? 'La page <em>'.stripslashes($nom).'</em> a bien été modifiée.' : "La page <em>${r['nom']}</em> n'a pas pu être modifiée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+        }
+      }
       // Si id = 0, ajout d'une nouvelle page
       else
-        $message = ( $mysqli->query("INSERT INTO pages SET cle = '$cle', nom = '$nom', titre = '$titre',
-                                     bandeau = '$bandeau', protection = $protection, ordre = ((SELECT MAX(p.ordre) FROM pages AS p)+1)")
-                  && $mysqli->query('ALTER TABLE pages ORDER BY ordre')
+        $message = ( $mysqli->query("INSERT INTO pages SET cle = '$cle', nom = '$nom', mat = $mat, titre = '$titre',
+                                     bandeau = '$bandeau', protection = $protection, ordre = (SELECT IFNULL(MAX(ordre)+1,1) FROM pages AS p WHERE p.mat = $mat)")
+                  && $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre')
         ) ? 'La page «&nbsp'.stripslashes($nom).'</em> a bien été ajoutée.' : 'La page <em>'.stripslashes($nom).'</em> n\'a pas pu être ajoutée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
     }
   }
 
   elseif ( $id )  {
+    $ordre = $r['ordre'];
 
     // Sauvegarde de la table contenant les données
     sauvegarde_mysql('pages');
 
     // Déplacement vers le haut
     if ( isset($_REQUEST['monte']) && ( $ordre > 1 ) )
-      $message = ( $mysqli->query("UPDATE pages SET ordre = (2*$ordre-1-ordre) WHERE ordre = $ordre OR ordre = ($ordre-1)")
-                && $mysqli->query('ALTER TABLE pages ORDER BY ordre')
-      ) ? "La page <em>$nom</em> a bien été montée d'une place." : "La page <em>$nom</em> n'a pas pu être déplacée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+      $message = ( $mysqli->query("UPDATE pages SET ordre = (2*$ordre-1-ordre) WHERE mat = ${r['mat']} AND ( ordre = $ordre OR ordre = ($ordre-1) )")
+                && $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre')
+      ) ? "La page <em>${r['nom']}</em> a bien été montée d'une place." : "La page <em>${r['nom']}</em> n'a pas pu être déplacée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
 
     // Déplacement vers le bas
     elseif ( isset($_REQUEST['descend']) && ( $ordre < $r['max'] ) )
-      $message = ( $mysqli->query("UPDATE pages SET ordre = (2*$ordre+1-ordre) WHERE ordre = $ordre OR ordre = ($ordre+1)")
-                && $mysqli->query('ALTER TABLE pages ORDER BY ordre')
-      ) ? "La page <em>$nom</em> a bien été descendue d'une place." : "La page <em>$nom</em> n'a pas pu être déplacée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+      $message = ( $mysqli->query("UPDATE pages SET ordre = (2*$ordre+1-ordre) WHERE mat = ${r['mat']} AND ( ordre = $ordre OR ordre = ($ordre+1) )")
+                && $mysqli->query('ALTER TABLE pages ORDER BY mat,ordre')
+      ) ? "La page <em>${r['nom']}</em> a bien été descendue d'une place." : "La page <em>${r['nom']}</em> n'a pas pu être déplacée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
 
-    // Suppression
-    elseif ( isset($_REQUEST['supprime']) && ( $r['max'] > 1 ) )
+    // Suppression : possible uniquement hors page d'accueil, page n°1 sans matière associée (mat=0)
+    elseif ( isset($_REQUEST['supprime']) && ( $r['max']+$r['mat'] > 1 ) )
       $message = ( $mysqli->query("DELETE FROM pages WHERE id = $id")
                 && $mysqli->query("DELETE FROM infos WHERE page = $id")
-                && $mysqli->query("UPDATE pages SET ordre = (ordre-1) WHERE ordre > $ordre")
-      ) ? "La page <em>$nom</em> a bien été supprimée, ainsi que les informations qu'elle comportait." : "La page <em>$nom</em> n'a pas pu être supprimée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+                && $mysqli->query("UPDATE pages SET ordre = (ordre-1) WHERE mat = ${r['mat']} AND ordre > $ordre")
+      ) ? "La page <em>${r['nom']}</em> a bien été supprimée, ainsi que les informations qu'elle comportait." : "La page <em>${r['nom']}</em> n'a pas pu être supprimée. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
 
   }
   $mysqli->close();
@@ -85,7 +98,7 @@
 // HTML //
 //////////
 // Haut de page, menu et message
-$p = 'pages';
+$p = "pages$urladmin2";
 $t = 'Modifications des pages d\'informations';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
@@ -95,7 +108,8 @@
 
   <div class="item aide">
     <h3>Aide et explications</h3>
-    <p>Vous pouvez ci-dessous ajouter une page d'information ou modifier les pages existantes ou leur ordre d'apparition dans le menu. Supprimer une page supprime automatiquement les informations qui y sont.</p>
+    <p>Vous pouvez ci-dessous ajouter une page d'information ou modifier les pages existantes ou leur ordre d'apparition dans le menu. Les pages non associées à une matière apparaîssent en début de menu (sur la partie publique), une page associée à une matière donnée apparaît au sein de cette matière.</p>
+    <p>Supprimer une page supprime automatiquement les informations qui y sont.</p>
     <h4>Préférences associées à chaque page</h4>
     <ul>
       <li>Le <em>titre</em> sera affiché en haut de page et dans la barre de titre du navigateur. Par exemple, «&nbsp;À propos de l'ADS et du TIPE&nbsp;».</li>
@@ -107,6 +121,12 @@
   </div>
 
 <?php
+// Select sur les matières
+// La variable $matieres est définie dans haut.php
+$select_matieres = '<option value="O">Pas de matière associée</option>';
+foreach ( $matieres as $m )
+  $select_matieres .= "<option value=\"${m['id']}\">${m['nom']}</option>";
+
 // Fonction d'affichage
 function affichage($r)  {
   // Si l'identifiant est 0, c'est une nouvelle page 
@@ -116,24 +136,31 @@
     $valide = "\n      <input type=\"submit\" name=\"modifie\" value=\"Valider\" title=\"Valider les modifications\">";
     $monte = ( $r['ordre'] > 1 ) ? "\n      <input type=\"submit\" name=\"monte\" value=\"&uarr;\" title=\"Remonter la page dans l'ordre d'apparition\">" : '';
     $descend = ( $r['ordre'] < $GLOBALS['max'] ) ? "\n      <input type=\"submit\" name=\"descend\" value=\"&darr;\" title=\"Descendre la page dans l'ordre d'apparition\">" : '';
-    $suppr = ( $GLOBALS['max'] > 1 ) ? "\n      <input type=\"submit\" name=\"supprime\" value=\"Supprimer\" title=\"Supprimer la page\">" : '';
+    $suppr = ( $GLOBALS['max']+$r['mat'] > 1 ) ? "\n      <input type=\"submit\" name=\"supprime\" value=\"Supprimer\" title=\"Supprimer la page\">" : '';
+    $disabled = ( $r['ordre']+$r['mat'] == 1 ) ? ' disabled' : '';
   }
   else  {
     $debut = 'Nouvelle page';
     $valide1 = "\n    <input class=\"bouton\" type=\"submit\" name=\"modifie\" value=\"Valider\" title=\"Valider les modifications\">";
-    $valide = $monte = $descend = $suppr = '';
+    $valide = $monte = $descend = $suppr = $disabled = '';
   }
+  // Identifiant unique pour les champs du formulaire
+  $fid = "${r['mat']}$id";
+  // Affichage du formulaire
   echo <<<FIN
   <div class="item admin">
   <form action="" method="post">$valide1
     <h3>$debut</h3>
     <p class="boutons">$valide$monte$descend$suppr
     </p>
-    <p class="ligne"><label for="titre$id">Titre&nbsp;: </label><input type="text" id="titre$id" name="titre" value="${r['titre']}" size="80"></p>
-    <p class="ligne"><label for="nom$id">Nom dans le menu&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50"></p>
-    <p class="ligne"><label for="cle$id">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$id" name="cle" value="${r['cle']}" size="30"></p>
-    <p class="ligne"><label for="bandeau$id">Texte de début&nbsp;:</label></p>
-    <textarea id="bandeau$id" name="bandeau" rows="2" cols="100">${r['bandeau']}</textarea>
+    <p class="ligne"><label for="titre$fid">Titre&nbsp;: </label><input type="text" id="titre$fid" name="titre" value="${r['titre']}" size="80"></p>
+    <p class="ligne"><label for="nom$fid">Nom dans le menu&nbsp;: </label><input type="text" id="nom$fid" name="nom" value="${r['nom']}" size="50"></p>
+    <p class="ligne"><label for="cle$fid">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$fid" name="cle" value="${r['cle']}" size="30"></p>
+    <p class="ligne"><label for="mat$fid">Matière associée&nbsp;: </label>
+      <select id="mat$fid" name="mat"$disabled>${GLOBALS['select_mat']}</select>
+    </p>
+    <p class="ligne"><label for="bandeau$fid">Texte de début&nbsp;:</label></p>
+    <textarea id="bandeau$fid" name="bandeau" rows="2" cols="100">${r['bandeau']}</textarea>
     <p class="ligne"><label for="protection">Demande d'identification pour l'affichage de la page&nbsp;: </label><input type="checkbox" id="protection" name="protection" value="1"${r['protection']}></p>
     <input type="hidden" name="id" value="$id">
   </form>
@@ -143,16 +170,24 @@
 FIN;
 }
 
-// Formulaire vide pour une nouvelle page et aide générale
-affichage(array('id' => 0, 'cle' => 'cle_de_la_page', 'nom' => 'Nom de la page', 'titre' => 'Titre de la page', 'bandeau' => 'Texte (éventuel) marqué en haut de la page', 'protection' => ''));
-
-// Affichage des pages existantes
-$resultat = $mysqli->query('SELECT id,ordre,cle,nom,titre,bandeau,IF(protection=1,\' checked\',\'\') AS protection FROM pages');
-$max = $resultat->num_rows;
+// Pour chaque matière
+$matieres = array(-1=>array('id'=>0,'nom'=>'Menu général'))+$matieres;
+foreach ( $matieres as $m )  {
+  echo "<h2>${m['nom']}</h2>\n";
+  $select_mat = str_replace("\"${m['id']}\"","\"${m['id']}\" selected",$select_matieres);  
+
+  // Formulaire vide pour une nouvelle page et aide générale
+  affichage(array('id' => 0, 'cle' => 'cle_de_la_page', 'mat' => $m['id'], 'nom' => 'Nom de la page', 'titre' => 'Titre de la page', 'bandeau' => 'Texte (éventuel) marqué en haut de la page', 'protection' => ''));
+
+  // Affichage des pages existantes
+  $resultat = $mysqli->query("SELECT id,ordre,cle,nom,mat,titre,bandeau,IF(protection=1,' checked','') AS protection FROM pages WHERE mat = ${m['id']}");
+  if ( $max = $resultat->num_rows )  {
+    while ( $r = $resultat->fetch_assoc() )
+      affichage($r);
+    $resultat->free();
+  }
+}
 $mysqli->close();
-while ( $r = $resultat->fetch_assoc() )
-  affichage($r);
-$resultat->free();
 
 // Bas de page
 include('bas.php');
diff -urN cahier-de-prepa3.1.1/prefs.php cahier-de-prepa3.2.0/prefs.php
--- cahier-de-prepa3.1.1/prefs.php	2013-08-21 01:34:46.401565867 +0200
+++ cahier-de-prepa3.2.0/prefs.php	2013-12-25 23:25:26.174216348 +0100
@@ -94,7 +94,7 @@
 //// HTML ////
 //////////////
 // Haut de page, menu et message
-$p = 'prefs';
+$p = "prefs$urladmin2";
 $t = 'Préférences';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
diff -urN cahier-de-prepa3.1.1/rss.php cahier-de-prepa3.2.0/rss.php
--- cahier-de-prepa3.1.1/rss.php	2013-08-23 17:48:29.200965025 +0200
+++ cahier-de-prepa3.2.0/rss.php	2013-12-25 00:05:26.639528353 +0100
@@ -26,10 +26,22 @@
   
 ?>
 
-  <h3>Le flux RSS est disponible à l'adresse</h3>
-  <p><a href="documents/<?php echo sha1($GLOBALS['base']); ?>/rss.xml">http://<?php echo "$site/documents/".sha1($GLOBALS['base']).'/rss.xml'; ?></a></p>
+  <div class="item">
+    <h3>Le flux RSS est disponible à l'adresse</h3>
+    <p><a href="documents/<?php echo sha1($GLOBALS['base']); ?>/rss.xml">http://<?php echo "$site/documents/".sha1($GLOBALS['base']).'/rss.xml'; ?></a></p>
+  </div>
 
 <?php
+
+// Contenu des informations récentes
+  $resultat = $mysqli->query("SELECT titre, DATE_FORMAT(heure,'%d/%m/%y') AS date, lien, texte FROM recents");
+  $mysqli->close();
+  if ( $resultat->num_rows )  {
+    while ( $r = $resultat->fetch_assoc() )
+      echo "\n  <div class=\"item recents\">\n    <h3><a href=\"${r['lien']}\">${r['titre']}</a> (${r['date']})</h3>\n${r['texte']}\n  </div>\n\n";
+    $resultat->free();
+  }
+
 // Bas de page
 include('bas.php');
 ?>
diff -urN cahier-de-prepa3.1.1/semaines.php cahier-de-prepa3.2.0/semaines.php
--- cahier-de-prepa3.1.1/semaines.php	2013-08-22 17:21:01.054147474 +0200
+++ cahier-de-prepa3.2.0/semaines.php	2013-12-25 23:25:09.274215807 +0100
@@ -68,7 +68,7 @@
 // HTML //
 //////////
 // Haut de page, menu et message
-$p = 'semaines';
+$p = "semaines$urladmin2";
 $t = 'Modifications des semaines du planning annuel';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
diff -urN cahier-de-prepa3.1.1/utilisateurs.php cahier-de-prepa3.2.0/utilisateurs.php
--- cahier-de-prepa3.1.1/utilisateurs.php	2013-08-24 01:17:05.361826346 +0200
+++ cahier-de-prepa3.2.0/utilisateurs.php	2013-12-27 14:44:39.506746072 +0100
@@ -76,7 +76,7 @@
 // HTML //
 //////////
 // Haut de page, menu et message
-$p = 'utilisateurs';
+$p = "utilisateurs$urladmin2";
 $t = 'Modifications des utilisateurs';
 $mysqli = new mysqli($serveur,$base,$mdp,$base);
 $mysqli->set_charset('utf8');
@@ -148,20 +148,12 @@
   </div>
 
 <?php
-// Récupération des utilisateurs (et fabrication du select pour l'affichage)
-$resultat = $mysqli->query('SELECT u.nom, GROUP_CONCAT(m.nom SEPARATOR \'</em>, <em>\') AS mats FROM utilisateurs AS u JOIN matieres AS m ON FIND_IN_SET(m.id,u.matieres) WHERE u.matieres GROUP BY u.nom ORDER BY u.nom');
-$utilisateurs = '';
-while ( $r = $resultat->fetch_assoc() )
-  $utilisateurs .= "    <li><em>${r['nom']}</em>, associé aux matières <em>${r['mats']}</em></li>\n";
-$resultat->free();
-
 // Récupération des utilisateurs
-
 $resultat = $mysqli->query('SELECT u.id, u.nom, GROUP_CONCAT(m.nom SEPARATOR \'</em>, <em>\') AS mats FROM utilisateurs AS u LEFT JOIN matieres AS m ON FIND_IN_SET(m.id,u.matieres) GROUP BY u.nom ORDER BY !u.matieres,u.nom,m.id');
 while ( $r = $resultat->fetch_assoc() )  {
   $id = $r['id'];
   if ( $r['mats'] )  {
-    $r['mats'] = "\n    <p>Utilisateur de type professeur, associé aux matières <em>${r['mats']}</em></p>";
+    $r['mats'] = ( strpos($r['mats'],'<em>') ) ? "\n    <p>Utilisateur de type professeur, associé aux matières <em>${r['mats']}</em></p>" : "\n    <p>Utilisateur de type professeur, associé à la matière <em>${r['mats']}</em></p>" ;
     $mdp = "\n    <p class=\"ligne\"><label for=\"mdp0_$id\">Mot de passe actuel&nbsp;: </label><input type=\"password\" id=\"mdp0_$id\" name=\"mdp0\" value=\"\"></p>";
   }
   else  {
