Page 1 sur 1

Retirer d'un menu déroulant une sélection

Posté : 16 août 2012, 10:15
par larsvangeil
Bonjour à tous et à toutes,

Nouveau sur le forum, je viens vous solliciter sur un problème que je rencontre actuellement. Je suis en stage dans une entreprise et je dois faire un planning dynamique pour organiser les emplois du temps des salariés selon des conditions bien spécifiques.

Voilà le principe de fonctionnement

imaginons que j'ai 5 postes à pourvoir dans une même tranche horaire et que j'ai 10 agents

1er poste, je sélectionne l'agent 5
au 2nd poste, l'agent 5 n'est plus disponible et je retire l'agent 8
au 3ème poste, l'agent 5 & 8 ne sont plus dispos, etc...
les deux premiers postes fonctionnent bien mais dès qu'il s'agit de cumuler, ça bloque et je ne vois pas trop pourquoi (je suis relativement néophyte dans le domaine, il y a peut être des subtilités qui m'échappent encore)
Egalement, je souhaite afficher en dessous le nom et prénom de la personne sélectionnée pour être sur que le DRH soit sûr de son choix, toutefois, si ça marche lors de la première sélection, lors de la deuxième, le nom de la première sélection disparaît et c'est le second qui apparaît.

Voilà si vous avez des solutions ou des astuces je suis preneur, je vous remercie par avance
<form method="POST" action="" target="" >
	<select name="agent">
		<?
			mysql_connect("localhost",USER,PASS);
			mysql_select_db(BASE);
			$inscription='SELECT id_agent,nom,prenom FROM agents
				JOIN indisponibilites on indisponibilites.id_agent_=agents.id_agent
				JOIN autoriser on autoriser.id_agent_=agents.id_agent
				JOIN amplitudes on amplitudes.id_agent_=agents.id_agent
				WHERE "2012-09-03" NOT BETWEEN congesdeb AND congesfin
				AND dateindispo NOT LIKE "2012-09-03"
				AND debutindispo NOT LIKE "12:00:00"
				AND finindispo NOT LIKE "13:00:00"
				AND id_poste_=6
				AND lunamdeb BETWEEN "12:00:00" AND "13:00:00"
				GROUP BY nom ASC';
				$id=mysql_query($inscription);
				$i=0;
				while($resultat=mysql_fetch_row($id))
				{
					echo '<option value="'/.$resultat[0].'">'.$resultat[1].' - '.$resultat[2].'</option>
					$i++;
				}
		?>
	</select>
	<input type="submit" value="Valider" />
</form>
<?
	// ici pour afficher la sélection du menu mais celle ci disparaît dès qu'on valide la sélection dans le deuxième menu
	if(isset($_POST['agent'])){
		$agent=mysql_real_escape_string($_POST['agent']);
		$affiche='SELECT nom,prenom FROM agents WHERE id_agent="'.$agent.'"';
		$id=mysql_query($affiche);
		$i=0;
		while($resultat=mysql_fetch_row($id))
		{
			echo $resultat[0].' - '.$resultat[1];
		}
	}
?>

<form method="POST" action="" target="" >
	<select name="agent1>
		<?
			if (isset($_POST['agent'])){
			$agent=mysql_real_escape_string($_POST['agent']);
			$pret1='SELECT id_agent,nom,prenom FROM agents
				JOIN indisponibilites on indisponibilites.id_agent_=agents.id_agent
				JOIN autoriser on autoriser.id_agent_=agents.id_agent
				JOIN amplitudes on amplitudes.id_agent_=agents.id_agent
				WHERE "2012-09-03" NOT BETWEEN congesdeb AND congesfin
				AND dateindispo NOT LIKE "2012-09-03"
				AND debutindispo NOT LIKE "12:00:00"
				AND finindispo NOT LIKE "13:00:00"
				AND id_poste_=7
				AND lunamdeb BETWEEN "12:00:00" AND "13:00:00"
				AND id_agent NOT LIKE "'.$agent.'"
				GROUP BY nom ASC';
				$id=mysql_query($pret1);
				$i=0;
				while($resultat=mysql_fetch_row($id))
				{
					echo '<option value="'/.$resultat[0].'">'.$resultat[1].' - '.$resultat[2].'</option>
					$i++;
				}
				}
		?>
	</select>
	<input type="submit" value="Valider" />
</form>
<?
	// même résultat que le premier affichage
	if(isset($_POST['agent1])){
		$agent1=mysql_real_escape_string($_POST['agent1');
		$affiche='SELECT nom,prenom FROM agents WHERE id_agent="'.$agent1.'"';
		$id=mysql_query($affiche);
		$i=0;
		while($resultat=mysql_fetch_row($id))
		{
			echo $resultat[0].' - '.$resultat[1];
		}
	}
?>

<form method="POST" action="" target="" >
	<select name="agent2>
		<?
			if (isset($_POST['agent']) & isset($_POST['agent1'])){
			$agent=mysql_real_escape_string($_POST['agent']);
			$agent1=mysql_real_escape_string($_POST['agent1']);
			$totale='SELECT id_agent,nom,prenom FROM agents
				JOIN indisponibilites on indisponibilites.id_agent_=agents.id_agent
				JOIN autoriser on autoriser.id_agent_=agents.id_agent
				JOIN amplitudes on amplitudes.id_agent_=agents.id_agent
				WHERE "2012-09-03" NOT BETWEEN congesdeb AND congesfin
				AND dateindispo NOT LIKE "2012-09-03"
				AND debutindispo NOT LIKE "12:00:00"
				AND finindispo NOT LIKE "13:00:00"
				AND id_poste_=7
				AND lunamdeb BETWEEN "12:00:00" AND "13:00:00"
				AND id_agent NOT IN ("'.$agent.'","'.$agent1.'")
				GROUP BY nom ASC';
				$id=mysql_query($totale);
				$i=0;
				while($resultat=mysql_fetch_row($id))
				{
					echo '<option value="'/.$resultat[0].'">'.$resultat[1].' - '.$resultat[2].'</option>
					$i++;
				}
				}
		?>
	</select>
	<input type="submit" value="Valider" />
</form>


Re: Retirer d'un menu déroulant une sélection

Posté : 16 août 2012, 10:45
par moogli
salut,


si ton code est un simple copier collé : il te manque une quote tu devrait avoir un message d'erreur (if(isset($_POST['agent1])){ ). si tu n'a pas de message d'erreur revoie ton niveau de report d'erreur pour qu'il soit à E_ALL (obligatoire en DEV !).

je t'invite aussi à ne pas utiliser les shorts tags (simplemetn parce que ce n'est pas la conf par défaut de php), ainsi qu'une extension plus récente et maintenue pour la connexion à mysql (extension mysqli ou PDO).

ensuite, coté fonctionnement, tu effectue un reset entre chaque selection ?
tu souhaite que cela ce fasse sans rechargement de la page ?

Dans le 1er cas il te faut prévoir ce que tu a fait mais dynamiquement (parce que la c'est limité en nombre d'agent); Cela va donc tourner autour d'une requête SQL bien ficelée. En gros lorsque tu affiche le formulaire la requête va chercher les agents dispos pour le poste à cette heure (pour la durée de la tache) lorsque tu fait le d'un agent pour le poste, celui ne devient plus dispo donc à l'affichage suivant il ne doit pas être retourné par la requête => plus de soucis.

Dans le second cas il te faut utiliser javascript (et pourquoi un framework JS tel JQuery, prototype etc etc)) pour ajouter le contenue aux liste déroulante des poste restant (sur l'événement onchange des select tu active une fonction JS qui fera le travail);

@+

Re: Retirer d'un menu déroulant une sélection

Posté : 16 août 2012, 11:33
par larsvangeil
salut moogli,

ah ouups, effectivement, petite erreur dans le copier coller car j'ai vérifié et je n'ai pas l'erreur ^^

Sinon effectivement, je comptais passer en PDO mais dès que tout serait opérationnel car je m'y connais pas encore assez et je préfère déjà terminer avec mes connaissances et savoir que tout fonctionne avant de passer à l'étape supérieur comme le PDO et faire du travail propre à partir de quelque chose que je connais et dont je sais que ça fonctionne correctement (méthode de vieux quoi ^^ :D )

En fait je souhaite que cela se fasse sans recharger la page car il en réalité 55 agents à gérer pour 12 postes sur 10 tranches horaires, et que les disponibilités de tous change en fonction de leurs vacances, réunions de dernière minute etc etc
Donc dès qu'il y a une modif dans une des tables, ça se répercute dans le menu déroulant.

Sinon je vais chercher du côté JS, tu me conseillerais quoi comme base de travail dans ce genre de cas (car là je suis plutôt autodidacte, mon école ne m'ayant pas enseigné le principe de base du JS

Re: Retirer d'un menu déroulant une sélection

Posté : 16 août 2012, 17:46
par AB
Sinon effectivement, je comptais passer en PDO mais dès que tout serait opérationnel car je m'y connais pas encore assez et je préfère déjà terminer avec mes connaissances et savoir que tout fonctionne avant de passer à l'étape supérieur comme le PDO et faire du travail propre à partir de quelque chose que je connais et dont je sais que ça fonctionne correctement (méthode de vieux quoi ^^ :D )
Dans ce cas utilises mysqli. En mode procédural, c'est quasiment identique à la syntaxe mysql, il faut juste passer l'identifiant de connexion dans plus de fonctions comme "mysqli_real_escape_string" par exemple, mais c'est à peu près la seule différence au niveau de l'écriture du code. Par contre niveau fonctionnalités cela ouvre accès aux requêtes préparées (et a peu près les même fonctionnalités que pdo). Au moins tu auras du code à jour sans avoir besoin d'y revenir plus tard.

Pour "jquery", une recherche dans google sur ce terme te mènera à la bonne page. Idem pour "tuto javascript".
Il est conseillé d'avoir une expérience en javascript avant d'utiliser jquery. Dans tous les cas il faut une bonne connaissance des css.
On parle actuellement beaucoup de jquery car c'est la lib la plus utilisée, l'avantage c'est que tu trouveras donc plus de ressources et d'aide en utilisant cette lib.