Location: PHPKode > projects > EmploiNet : a timetable web manager > EmploiNet/v0.8.0/Administration/assurer.php3
<?

/* --- 
Date : 22/08/2003
Correction F. Nolot : de grosses modifications ont été faites sur la partie "grille" pour corriger les nombreux bugs.
Il ne semble plus exister de bugs
Il ne reste à optimiser les requêtes */

include("../BarreDeMenu.php3");

include("../Session/security.php");

// Entete
buildHeader("R&eacute;partition des enseignements");

// Verification de la session
$autorisation_list[0]=0; // Administrateur
$autorisation_list[1]=3; // Gestionnaire
$user_type = validateSession($id_session);
if ($user_type == -1 || !security($id_session,$autorisation_list)) print("Accès refusé");
else
{
  // Barre de menu
  buildMenuBar($id_session,$user_type,"assurer.php3",false);
  // Ouverture de la connexion
  $connection = openConnection($databaseName);

  // Variables globales
  // matiere
  $G_id_matiere;
  $G_nom_matiere;
  $G_nb_matieres;
  // type de seance
  $G_id_type_seance;
  $G_libelle_type_seance;
  $G_nb_types_seance;
  $G_duree_type_seance; // duree associee a un type de seance pour une matiere (tableau a 2 entrees)

  // professeur
  $G_id_professeur;
  $G_nb_professeurs;
	
  $n = count($id_promotion); // nombre de promotions selectionnees

  // Traitement des evenements Promotion et Groupe
  switch ($choice)
    {
    case -1: // changement de promotion
      {
	unset($id_matiere);
	unset($nom_matiere);
	unset($id_last_professeur);
	unset($id_professeur);
	unset($G_nb_professeurs);
	unset($duree);
	$id_groupe = -1;
	break;
      }
    case -2: // changement de groupe
      {
	unset($id_matiere);
	unset($nom_matiere);
	unset($id_last_professeur);
	unset($id_professeur);
	unset($G_nb_professeurs);
	unset($duree);
	if ($id_groupe != -1)
	  {
	    $result2 = mysql_query("SELECT * FROM associer WHERE id_groupe=$id_groupe[0]");
	    $n = mysql_num_rows($result2); 
	    for ($i=0;$i<$n;$i++)
	      {
		$une_promotion = mysql_fetch_array($result2);
		$id_promotion[$i] = $une_promotion["id_promotion"];
	      }
	  }	 
	break; 
      }
    }
	
  // Si une promotion ou un groupe est selectionne
  if ($n > 0)
    {	
      // Chargement des types de seance			
      $result = mysql_query("SELECT * FROM typeseance ORDER BY id_type_seance");
      $G_nb_types_seance = mysql_num_rows($result);
      for ($i = 0;$i < $G_nb_types_seance;$i++)
	{
	  $a_record = mysql_fetch_array($result);
	  $G_id_type_seance[$i] = $a_record["id_type_seance"];
	  $G_libelle_type_seance[$i] = $a_record["type"];
	}
      // Si un groupe est selectionne
      if ($id_groupe != -1) $result = mysql_query("SELECT matiere.id_matiere,matiere.nom FROM matiere,suivipargroupe WHERE suivipargroupe.id_groupe = $id_groupe AND suivipargroupe.id_matiere = matiere.id_matiere"); 		
      // Si une promotion est selectionnee
      else $result = mysql_query("SELECT matiere.id_matiere,matiere.nom FROM matiere,suiviparpromotion WHERE suiviparpromotion.id_promotion = $id_promotion[0] AND suiviparpromotion.id_matiere = matiere.id_matiere"); 
      $G_nb_matieres = mysql_num_rows($result);
		
      if ($choice >= 0 ) // une modification a ete apporte
	{
	  // recopie des valeurs de la grille dans les variables globales
	  for ($i=0;$i<$nb_lignes;$i++)
	    {
	      $G_id_matiere[$i] = $id_matiere[$i];
	      $G_nom_matiere[$i] = $nom_matiere[$i];
	      $G_id_last_professeur[$i] = $id_last_professeur[$i];
	      $G_id_professeur[$i] = $id_professeur[$i];
	      $G_nb_professeurs[$i] = 0;

	      for ($j = 0;$j < $G_nb_types_seance;$j++)
		$G_duree_type_seance[$j][$i] = $duree[$i*($G_nb_types_seance+3)+$j+3];
	    }
	}
      else // aucune modif -> chargement des valeurs depuis la base de donnees
	{
	  $a = 0; // indice de ligne
	  for ($i = 0;$i < $G_nb_matieres;$i++) // matiere par matiere
	    {
	      $une_matiere = mysql_fetch_array($result);
	      $result2 = mysql_query("SELECT id_professeur,nom FROM professeur ORDER BY nom");
	      $nb_prof = mysql_num_rows($result2); // nombre de profs
	      $found = false;
	      /* --- F. Nolot : on doit pouvoir améliorer cette partie en faisant directement la requête : select tous les prof dans la table assurer qui
enseigne cette matière dans la promo et groupe sélectionnés. Plus de for sur tous les prof à faire */
	      for ($j = 0;$j < $nb_prof;$j++) // prof par prof
		{
		  $un_prof = mysql_fetch_array($result2);
		  if ($id_groupe[0]!=-1) $result3 = mysql_query("SELECT nb_heures FROM assurer WHERE id_groupe=".$id_groupe." AND id_matiere=".$une_matiere["id_matiere"]." AND id_professeur=".$un_prof["id_professeur"]); 
		  else $result3 = mysql_query("SELECT nb_heures FROM assurer WHERE id_matiere=".$une_matiere["id_matiere"]." AND id_professeur=".$un_prof["id_professeur"]); 

		  // un prof donne assure-t-il des heures d'un cours donne ?
		  if ($result3 != 0 && mysql_num_rows($result3) > 0) 
		    {
		      $G_id_matiere[$a] = $une_matiere["id_matiere"];
		      $G_nom_matiere[$a] = $une_matiere["nom"];
		      $G_id_professeur[$a] = $un_prof["id_professeur"];
		      $G_nb_professeurs[$a] = 0;

		      // pour chaque type de seance
		      for ($m = 0;$m < $G_nb_types_seance;$m++) 
			{ 
			  $result4 = mysql_query("SELECT nb_heures FROM assurer WHERE id_matiere=$G_id_matiere[$a] AND id_professeur=$G_id_professeur[$a] AND id_type_seance=$G_id_type_seance[$m]"); 
			  if ($result4 != 0 && mysql_num_rows($result4) > 0) 
			    {
			      $a_record = mysql_fetch_array($result4);
			      $G_duree_type_seance[$m][$a] = $a_record["nb_heures"];
			    }
			  else $G_duree_type_seance[$m][$a] = 0;
			  $found = true;
			}
		      $a++;
		    }
		}
				
	      if (!$found)
		{
		  $G_id_matiere[$a] = $une_matiere["id_matiere"];
		  $G_nom_matiere[$a] = $une_matiere["nom"];
		  if ($id_professeur[$a] > 0) $G_id_professeur[$a] = $id_professeur[$a];
		  else $G_id_professeur[$a] = -1;
		  $G_nb_professeurs[$a] = 0;

		  for ($m = 0;$m < $G_nb_types_seance;$m++)
		    $G_duree_type_seance[$m][$a] = 0;
		  $a++;
		}
	    }
	  $nb_lignes = $a;
	}

      /*******************************************************************************/	
      /************************ Traitement des modifications *************************/
      /*******************************************************************************/	
      if ($choice >= 0)
	{
	  // determination de la cellule modifiee	
	  $i = floor($choice / ($G_nb_types_seance + 3)); // indice matiere + professeur
	  $j = $choice - ($i * ($G_nb_types_seance + 3)); // indice type seance
	  $ligne_plus=$i;
	  switch ($j)
	    {
	    case 0 : // changement de professeur
	      {
		if ($id_last_professeur[$i] != $id_professeur[$i])
		  mysql_query("DELETE FROM assurer WHERE id_matiere=$id_matiere[$i] AND id_professeur=$id_last_professeur[$i]"); 
		$G_id_professeur[$i] = $id_professeur[$i];
		break;
	      }
	    case 1 : // ajout d'une ligne
	      {
		$G_nb_professeurs[$i] = 1;
		break;
	      }
	    case 2 : // suppression d'une ligne
	      {
		$G_nb_professeurs[$i] = -1;
		break;
	      }
	    default :
	      {
		if ($id_professeur[$i] != -1) // Il faut qu'un prof soit selectionne
		  {
		    $request = "DELETE FROM assurer WHERE id_matiere=".$id_matiere[$i]." AND id_professeur=".$id_professeur[$i]." AND id_type_seance=".($G_id_type_seance[$j-3])." AND id_groupe=".$id_groupe;
		    mysql_query($request); 
		    if ($duree[$choice] > 0)
		      {
			$request = "INSERT INTO assurer VALUES (".$id_professeur[$i].",".$id_matiere[$i].",".$G_id_type_seance[$j-3].",".$duree[$choice].",".$id_groupe.")";
			mysql_query($request); 
			$G_duree_type_seance[$j-3][$i] = $duree[$choice]; 
		      }
		    else $G_duree_type_seance[$j-3][$i] = 0;
		  }
		else $G_duree_type_seance[$j-3][$i] = 0;
		break;
	      }
	    }
	}
    }

  /*******************************************************************************/	
  /****************************** Formulaire *************************************/
  /*******************************************************************************/	

  print("<form name=\"form1\" action=\"assurer.php3\" method=post>\n");
  print("  <table align=center border=0 cellspacing=0 cellpading=0 width=700 bgcolor=\"#C0C000\">\n");
  print("  <tr>\n");
  print("    <td>\n");
  print("      <input type=\"hidden\" name=\"login\" value=\"$login\">\n");
  print("      <input type=\"hidden\" name=\"choice\" value=\"-1\">\n");
  print("      <input type=\"hidden\" name=\"id_session\" value=\"$id_session\">\n");
  print("      <input type=\"hidden\" name=\"user_type\" value=\"$user_type\">\n");
  print("      <input type=\"hidden\" name=\"user_id\" value=\"$user_id\">\n");
  print("      <input type=\"hidden\" name=\"display\" value=\"$display\">\n");

  // Liste des promotions	

  print("        <tr>\n");
  print("          <td valign=top width=100 nowrap><font size=3><i>Promotion :</i></font></td>\n");
  print("          <td width=250>\n");
  $result = mysql_query("SELECT id_promotion,diplome.libelle as L1,promotion.libelle as L2 FROM promotion,diplome WHERE promotion.id_diplome=diplome.id_diplome ORDER BY diplome.libelle");
  $index_max = mysql_num_rows($result); 
  print("          <select tabindex=\"-1\" multiple name=\"id_promotion[]\" size=\"5\" width=\"200\" OnChange=\"choice.value=-1; submit();\">\n");
  for ($i=0;$i<$index_max;$i++)
    {
      $a_record = mysql_fetch_array($result);
      $found = false;
      $j = 0;
      while (!$found && $j<$n)
	{		
	  if ($id_promotion[$j] == $a_record["id_promotion"])
	    $found = true;
	  else
	    $j++;
	}
      if ($found)
	print("          <option selected value=".$a_record["id_promotion"]." >");
      else
	print("          <option value=".$a_record["id_promotion"].">");
      print($a_record["L1"]." ".$a_record["L2"]);
      print("</option>\n");
    }
  print("          </select>\n");
  print("          </td>\n");
	
  // Liste des groupes associes a la promotion selectionnee
  print("          <td valign=top width=\"100\" nowrap><font size=\"3\"><i>Groupe :</i></font></td>\n");
  print("          <td valign=top width=\"250\">\n");
  print("          <select tabindex=\"-1\" name=\"id_groupe\" size=\"1\" width=\"200\" OnChange=\"choice.value = -2; submit();\">\n");
  if ($n > 0)
    {
      $from = "groupe,associer as t0";
      $where = "t0.id_promotion = ".$id_promotion[0]." ";
      for ($i=1;$i<$n;$i++)
	{
	  $where = $where."AND t$i.id_promotion = ".$id_promotion[$i]." ";
	  $from = $from.",associer as t$i";
	}
      for ($i=1;$i<$n;$i++)
	$where = $where."AND t".($i-1).".id_groupe = t".$i.".id_groupe ";
      $request = "SELECT groupe.id_groupe,groupe.nom,groupe.id_type_groupe FROM ".$from." WHERE ".$where." AND groupe.id_groupe = t0.id_groupe ORDER BY nom";
      $result = mysql_query($request);
      $index_max = mysql_num_rows($result); 
      $found = false;
      for ($i=0;$i<$index_max;$i++)
	{
	  $a_record = mysql_fetch_array($result);
	  if ($id_groupe == $a_record["id_groupe"])
	    {
	      print("          <option selected value=".$a_record["id_groupe"]." >");
	      $found = true;
	    }
	  else
	    print("          <option value=".$a_record["id_groupe"].">");
	  print($a_record["nom"]);
	  print("</option>\n");
	}
      if (!$found) print("<option selected value=\"-1\" ></option>\n");
      else print("<option value=\"-1\"></option>\n");
    }
  print("          </select>\n");
  print("          </td>\n");
  print("        </tr>\n");
  print("       </table><BR>\n");
	
  /*******************************************************************************/	
  /******************************** Grille ***************************************/
  /*******************************************************************************/	

  if ($n > 0 && $nb_lignes > 0)
    {
      print("  <table align=\"center\" border=\"0\" cellspacing=\"0\" cellpading=\"0\" width=\"700\" bgcolor=\"#C0C000\">\n");
      print("        <tr>\n");
      print("          <td colspan=\"4\">\n");
      print("            <table border=\"1\" align=\"center\" width=\"100%\">\n");
      print("              <tr valign=\"BOTTOM\">\n");
      print("                <td colspan=\"3\"><font size=\"3\"><i>Mati&egrave;re</i></font></td>\n");
      print("                <td><font size=\"3\"><i>Professeur</i></font></td>\n");
      for ($i = 0;$i < $G_nb_types_seance;$i++)
	print("                <td><font size=3><i>".$G_libelle_type_seance[$i]."</i></font></td>\n");
      print("              </tr>\n");
      $a = 0;
      $i=0;
      $sub=false; // boolean pour la supression d'une ligne
      while ($i<$nb_lignes)
	{
	  print ("              <tr valign=\"BOTTOM\">\n");
	  $prem=true;
	  // Determination du nombre de lignes correspondant a une même matiere
	  $nb_prof=1; // pour compter les nombres de lignes d'une matière
	  if ( ($i>0 && $G_id_matiere[$i-1] != $G_id_matiere[$i] ) || ($i == 0) ) {
	    $j=$i;
	    while ($G_id_matiere[$j+1] == $G_id_matiere[$j] ) // à faire uniquement pour le premier prof de cette matiere
	      { $nb_prof++;
	      $j++;
	      }
	    $nb_lig=$nb_prof;
	    if ($ligne_plus >= $i && $ligne_plus <= $i-1+$nb_prof) 
	      { 
		if ( $G_nb_professeurs[$ligne_plus] == -1) { // Detection de l'appuie sur le bouton '-'
		  $G_nb_professeurs[$ligne_plus]=0; // pour que les boucles suivantes fonctionnent correctement
		  if ( $nb_prof > 1 ) { // Suppression d'un prof uniquement si plusieurs profs enseignent cette matsière
		    $nb_lig=$nb_prof-1;
		    $sub=true;
		  }
		}
		if ($G_nb_professeurs[$ligne_plus] == 1 ) $nb_lig=$nb_prof+1;
	      }
	  }
	  if ($nb_lig == 1) print("                <td valign=\"middle\" nowrap><font size=3><i>$G_nom_matiere[$i]</i></font></TD>\n");
	  else print("                <td valign=\"middle\" nowrap rowspan=\"".($nb_lig)."\"><font size=3><i>$G_nom_matiere[$i]</i></font></TD>\n");
	  $j=0;
	  while ($j<$nb_prof) {
	    if ( ($sub && $a != $ligne_plus )  || (!$sub) ) {
	      $prembis=true;
	      for ($tmp=0; $tmp < $G_nb_professeurs[($i+$j)]+1; $tmp++) { // quand on appuie sur '+', on doit afficher une fois de plus
		if	(!$prem)
		  print ("              <tr valign=\"BOTTOM\">\n");
		$prem=false;
		print("				 <input type=hidden name=\"nom_matiere[".($a)."]\" value=\"".$G_nom_matiere[($i+$j)]."\">\n");
		print("				 <input type=hidden name=\"id_matiere[".($a)."]\" value=\"".$G_id_matiere[($i+$j)]."\">\n");
		print("                <TD><input tabindex=-1 type=button value=\" + \" OnClick=\"choice.value=".(($a)*($G_nb_types_seance+3)+1)."; submit();\"></td>\n");
		print("                <TD><input tabindex=-1 type=button value=\" - \" OnClick=\"choice.value=".(($a)*($G_nb_types_seance+3)+2)."; submit();\"></td>\n");
		print("                <td>\n");

		// Si c'est la ligne qui est ajoute alors le professeur n'est pas connu
		// A faire une seule fois et lors de la deuxième passe
		if ($G_nb_professeurs[$i+$j] == 1 && !$prembis) print("				 	<input type=hidden name=\"id_last_professeur[".($a)."]\" value=\"-1\">\n");
		else print("				 	<input type=hidden name=\"id_last_professeur[".($a)."]\" value=\"".$G_id_professeur[($i+$j)]."\">\n");
		print("				 	<select tabindex=\"-1\" name=\"id_professeur[".($a)."]\" size=\"1\" width=\"200\" OnChange=\"choice.value=".(($a)*($G_nb_types_seance+3))."; submit();\">\n");
		// Si le prof est inconnu ou si c'est la ligne qui est ajoute alors le professeur n'est pas connu
		if ( $G_id_professeur[$i+$j] == -1 || ( !$prembis && $G_nb_professeurs[$i+$j] == 1 ) ) print("                     <option selected value = \"-1\"></option>\n");
		$result = mysql_query("SELECT * FROM professeur ORDER BY nom");
		$nb_prof2 = mysql_num_rows($result);
		for ($k=0;$k<$nb_prof2;$k++)
		  {
		    $un_prof = mysql_fetch_array($result);
		    if ( $un_prof["id_professeur"] == $G_id_professeur[$i+$j] && ( $G_nb_professeurs[$i+$j] != 1 || $prembis ))
		      print("                     <option selected ");
		    else print("                     <option ");
		    print("value=".$un_prof["id_professeur"].">".$un_prof["nom"]." ".$un_prof["prenom"]."</option>\n");
		  }
		print("				 	</select>\n");
		print("				 </td>\n");
		if ($G_nb_professeurs[$i+$j] == 1 && !$prembis)
		  {
		    for ($k = 0;$k < $G_nb_types_seance;$k++)
		      print("                <td><input tabindex=".(($a)*$G_nb_types_seance+$k)." name=\"duree[".(($a)*($G_nb_types_seance+3)+$k+3)."]\" size=8 OnChange=\"choice.value=".(($a)*($G_nb_types_seance+3)+$k+3)."; submit();\" value=\"0\"></td>\n");
		  }
		else
		  {
		    for ($k = 0;$k < $G_nb_types_seance;$k++)
		      print("                <td><input tabindex=".($a*$G_nb_types_seance+$k)." name=\"duree[".(($a)*($G_nb_types_seance+3)+$k+3)."]\" size=8 OnChange=\"choice.value=".(($a)*($G_nb_types_seance+3)+$k+3)."; submit();\" value=\"".($G_duree_type_seance[$k][$i+$j])."\"></td>\n");
		  }
		print("              </tr>\n");
		$a++;
		$prembis=false;
	      }
	    } else { 
	      if ($nb_prof>1) mysql_query("DELETE FROM assurer WHERE id_matiere=$id_matiere[$a] AND id_professeur=$id_professeur[$a]");
	      $sub=false;
	    }
	    $j++;
	  }
	  $i=$i+$nb_prof;
	}
      $nb_lignes = $a;
      print("             </table>\n");
      print("          </td>\n");
      print("        </tr>\n");
    }	

  print("  </table>\n");
  print("	 <input type=hidden name=\"nb_lignes\" value=$nb_lignes>\n");
  print("</form>\n");
}

buildEndOfPage();

?>    

Return current item: EmploiNet : a timetable web manager