Déplacement un élément d'une liste vers une autre

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 déc. 2005, 02:38

lors de la validation du formulaire tu va retrouver un tableau d'éléments par liste si tu as un nom différent pour chaque liste (ce qui est logique).

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

26 déc. 2005, 10:18

Je comprend le principe mais je vois pas comment l'appliquer.

Voici mon code ci-dessous. Tout marche bien jusqu'au submit (les noms se mettent et s'enlevent dans chacune des divisions). Mais au submit, la boucle ne reconnait aucun des $_POST... Hors, si je veux récupérer un tableau qui vient d'un $_POST, faut bien que j'initialise une variable qui prendra la valeur de ce $_POST non?:
<?php
if(isset($_POST['envoyer'])) {
$nb_division=5;
$i=2;
	while($i<$nb_division+2) {
$liste=sprintf("'liste%s'",$i);
$valeur=$_POST[$liste];	
	$test=count($valeur);
	echo $test;
	$i++;
	}

/*
foreach ($liste as $choix)
{
echo $choix;
}
$nb_division=5;
$i=2;
while($i<$nb_division+2) {
$nom_select=sprintf("'liste%s'",$i);
$nb_liste=$_POST[$nom_select];
$test=count($nb_liste);
echo $test;
$i++;
}
*/
}
mysql_select_db($database_pronofootball, $pronofootball);
$query_Recordset1 = "SELECT * FROM pronofootball_utilisateur";
$Recordset1 = mysql_query($query_Recordset1, $pronofootball) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>
<HTML>
<HEAD>
<TITLE>Tout JavaScript.com - Info Bulle DHTML</TITLE>
<SCRIPT LANGUAGE="JavaScript">
//D'autres scripts sur http://www.toutjavascript.com
//Si vous utilisez ce script, merci de m'avertir !  < [email protected] >
	function Deplacer(l1,l2) {
		if (l1.options.selectedIndex>=0) {
			o=new Option(l1.options[l1.options.selectedIndex].text,l1.options[l1.options.selectedIndex].value);
			l2.options[l2.options.length]=o;
			l1.options[l1.options.selectedIndex]=null;
		}else{
			alert("Aucune activité sélectionnée");
		}
	}
</SCRIPT>
</HEAD>

<BODY>
<FORM action="" method="post" name="formulaire">

	<TABLE>
	<TR>
	<TD align="center">Activités proposées<BR>
	<SELECT align=top name="liste1" size=6  style="width:120px">
	  <?php
do {  
?>

	  <option value="<?php echo $row_Recordset1['utilisateur_id']?>"><?php echo $row_Recordset1['utilisateur_pseudo']?></option>
	  <?php
} while ($row_Recordset1 = mysql_fetch_assoc($Recordset1));
  $rows = mysql_num_rows($Recordset1);
  if($rows > 0) {
      mysql_data_seek($Recordset1, 0);
	  $row_Recordset1 = mysql_fetch_assoc($Recordset1);
  }
?>
	</SELECT>
	</TD>
	<TD align="center">
	<table>
	<?php
	 $nb_division=5;
	$i=2;
	while($i<$nb_division+2) { ?>
	<tr>
	<td><INPUT type="button" value="Ajouter >>>" onClick="Deplacer(this.form.liste1,this.form.deux<?php echo $i; ?>)">
	<BR><BR>
	<INPUT type="button" value="<<< Enlever" onClick="Deplacer(this.form.deux<?php echo $i; ?>,this.form.liste1)">
	</TD>
	<TD align="center">Activités retenues<BR>
	<SELECT name="liste<?php echo $i; ?>" size=6 multiple id="deux<?php echo $i; ?>" style="width:120px" align=top>
		<OPTION value="10">----------------------</OPTION>
	</SELECT>
	</TD>
	</TR>
	<?php $i++;} ?>
	</table>
</TD>
</TR>
<tr>
<td colspan="2"><input name="envoyer" type="submit"></td>
</tr>
</TABLE>
</FORM>
</BODY>
</HTML>
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 01:07

Mais au submit, la boucle ne reconnait aucun des $_POST...
Certainement logique puisque la variable POST ne contient que les éléments séléctionnés !

Il faut donc séléctionner tous les éléments des différentes listes avant de valider le formulaire:

Pour cela une fonction Javscript peut faire l'affaire:
function select_all()
{
	for(j=2;j<=6;j++) // boucle permettant de parcourir les listes
	{
		var num_liste='liste'+j;		
	
		var lg = document.getElementById(num_liste).length;	//longueur de la liste traitée	
		for(i=0;i<lg;i++)
			document.getElementById(num_liste).options[i].selected= true;		//séléction des éléments de la liste
		
		document.getElementById(num_liste).name +="[]"; // ajout des [] pour permettre au php de récupérer la liste sous forme d'array
														 //ne pas mettre directement "liste2[]" sinon la 1ere fonction Deplacer() ne fonctionnera plus ainsi.
		
	}		
	
	formulaire.submit(); // validation du formulaire.
} 
1. permettre aux listes la multi-séléction avec l'attribut "multiple"

2.ajouter un id a chaque liste sous la forme: id="liste2", id="liste3", ...

3.attribut name sans crochets: name="liste2", name="liste3", ...

Ce qui donne pour la liste 2:
<SELECT id="liste2" name="liste2" multiple>
Ensuite tu récupère les listes avec $_POST['liste2'], $_POST['liste3'].[/quote]

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

27 déc. 2005, 22:31

ok j'ai compris le principe de l'envoi mais quand je veux faire la récupération je fais
if(isset($_POST['envoyer'])) {
$nb_division=5;
$i=2;
	while($i<$nb_division+2) {
$liste=sprintf("'liste%s'",$i);
$valeur=$_POST[$liste];	
	$test=count($valeur);
	echo $test;
	$i++;
	}
}
j'ai faux? c'est comme ca que je fais passer les valeurs du $_POST...
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:18

Ce sont des listes multiple tu récupère donc un tableau.

la fonction count() retourne le nombre d'éléments du tableau POST

il est donc préférable d'utiliser une boucle foreach() par exemple:
foreach ($_POST[$liste] as $v) 
{
   echo "valeur liste ".$liste." = ".$v." <br />";
}

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:24

tu me corrige stp: ca donne donc :
if(isset($_POST['envoyer'])) {
	$nb_division=5;
	$i=2;
	while($i<$nb_division+2) {
	$liste=sprintf("'liste%s'",$i);
			foreach ($_POST[$liste] as $v) 
			{ 
			   echo "valeur liste ".$liste." = ".$v." <br />"; 
			}
	$i++;
	}
}
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:31

ça me semble correct as tu testé le retour ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:32

euh oui et en fait ca marche pas. Mais attends je crois que j'ai trouvé. Je suis en train de taper le code et je le met dès qu'il est fini.
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:37

une erreur ici:
$liste=sprintf("'liste%s'",$i); 
la variable $i est un entier donc:
$liste=sprintf("'liste%d'",$i); 
avec un "%d"

perso je préfère concaténer comme ça:
$liste="liste".$i; 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:39

avec:
if(isset($_POST['envoyer'])) {
	$nb_division=5;
	$i=2;
	while($i<$nb_division+2) {
	$liste="'liste%s'".$i;
			foreach ($_POST[$liste] as $v) 
			{ 
			   echo "valeur liste ".$liste." = ".$v." <br />"; 
			}
	$i++;
	}
}
ca me retourne:

Invalid argument supplied for foreach() pour la ligne:
			foreach ($_POST[$liste] as $v) 
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:41

j'ai modifié mon erreur mais ca me fait le meme retour d'erreur:
if(isset($_POST['envoyer'])) {
	$nb_division=5;
	$i=2;
	while($i<$nb_division+2) {
	$liste="liste".$i;
			foreach ($_POST[$liste] as $v) 
			{ 
			   echo "valeur liste ".$liste." = ".$v." <br />"; 
			}
	$i++;
	}
}
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:47

j'ai modifié mon erreur mais ca me fait le meme retour d'erreur:
quel est ce retour ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:48

bon pas de panique, en fait ca met un message d'erreur que quand aucune valeur n'est selectionnée. j'ai donc rajouté une condition, bon ca fait un peu usine a gaz mais ca m'a permis de comprendre.

Merci encore mille fois...
if(isset($_POST['envoyer'])) {
	$nb_division=5;
	$i=2;
	while($i<$nb_division+2) {
	$liste="liste".$i;
			if(isset($_POST[$liste])) {
			foreach ($_POST[$liste] as $v) 
			{ 
			   echo "valeur liste ".$liste." = ".$v." <br />"; 
			} }
	$i++;
	}
}
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Eléphant du PHP | 122 Messages

27 déc. 2005, 23:49

je vais optimiser mon code plus tard, j'ai l'impression que j'ai pas mal de marge!!! merci encore... je vais maintenant bien analyser la partie de javascript pour tenter de la comprendre.
---
Commencer c'est essayer...
Et essayer, c'est parfois finir...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 déc. 2005, 23:56

n'hésite pas à revenir en cas de doute :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute