Connaitre un nombre d'input générés dynamiquement

Eléphanteau du PHP | 10 Messages

10 févr. 2011, 13:24

Bonjour tout le monde,

Je rencontre un petit problème, j'ai crée un formulaire qui fait appel à une autre page PHP pour générer un XML suite au remplissage de ce dernier. Le problème est qu'à l’intérieur de ce formulaire j'ai utilisé une fonction javascript me permettant de générer grâce à un bouton des input nécessaires à l'Upload de un ou plusieurs fichier. le problème qui se pose se trouve dans la génération de mon xml, j'ai un noeud <photos> qui contient "n" noeuds <photo>. Ces derniers sont créés dans une boucle qui pour le moment à un maximum fixe. Est-il possible de compter le nombre d'input généré par l'utilisateur pour créer le nombre de noeud voulus ?

Merci!!

PS: Tant que je suis ici! :), j'ai aussi un problème avec l'encodage de mon fichier xml généré, même en mettant utf-8 ou le bon iso, je me retrouve toujours avec des caractères non reconnus à l'ouverture de mon xml. Une idée? Merci :)

ViPHP
xTG
ViPHP | 7331 Messages

10 févr. 2011, 14:55

Une boucle sur le tableau $_POST te fournira les inputs. ;)

Pour ton XML le fichier est-il enregistré en utf8 (s'il a été créé à la main) ?
Ton serveur est-il en utf8 ?
Le header de ta page traitant et affichant le xml est-il en utf8 ?

;)

Eléphanteau du PHP | 10 Messages

10 févr. 2011, 15:05

Je n'ai pas bien saisi pour la boucle sur le tableau $_POST :?

Pour le XML, il est entièrement généré via php => $file = new DOMDocument('1.0', 'utf-8');
Pour le serveur, je suis en local, sous apache, des réglages sont nécessaires ?
Le header de ma page est bien en utf8, enfin je crois => <meta http-equiv="content-type" content="text/html; charset=utf-8" />

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 févr. 2011, 15:19

foreach($_POST as $inputName => $inputValue) {
//ce que tu veut
}

ça permet de gérer la chose sans savoir ce que contient $_POST

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

10 févr. 2011, 16:09

C'est encore moi, désolé mais je sèche là :?

En fait j'ai beaucoup d'input dans mon formulaire, je voudrais en tester qu'une partie, comme j’effectue un test pour lui dire de prendre les input qui ont seulement l'ID "pic" ?

Auriez vous une réponse pour mon problème d'encodage ? Merci

Code : Tout sélectionner

foreach($_POST as $inputName => $inputValue) {if ($_POST['id'] == pic){ // Création des noeuds photo $photo = $file->createElement("photo");//On crée un élément photo $photo = $photos->appendChild($photo);//On ajoute cet élément aux photos $varphoto= $file->createTextNode($_FILES['photo_'.($i+1)]['tmp_name']); $varphoto = $photo->appendChild($varphoto); // Création des noeuds comment $comment = $file->createElement("comment");//On crée un élément comment $comment = $photos->appendChild($comment);//On ajoute cet élément aux photos $varcomment= $file->createTextNode($_POST['desphotos'.$i]); $varcomment = $comment->appendChild($varcomment); $i++; }}

ViPHP
xTG
ViPHP | 7331 Messages

10 févr. 2011, 16:16

Pour le charset c'est dans le php.ini :
AddDefaultCharset UTF-8
Souvent de base il est en iso-8859-1.

Graouf c'est quoi ce $i qui se balade dans la boucle ! On utilise une boucle foreach() justement pour ne pas en mettre...
Sinon on aurait utilisé une boucle while !

Pour détecter les inputs tu peux utiliser une expression régulière sur $inputName, mais je trouve cela lourd pour ma part (pas pour autant que j'ai pas tord, c'est juste une question d'habitude de traitement après)...
J'ai pour habitude de toujours nommer mes champs qui seront à traiter de façon dynamique de cette façon : nom_id avec id un chiffre ou bien un identifiant unique.
De ce fait au traitement :
foreach($_POST as $inputName => $inputValue)
{
  $tab = explode("_",$inputName);
  if( $tab[0] == "nom" )
  {

  }
}

Eléphanteau du PHP | 10 Messages

10 févr. 2011, 16:57

Je sais bien que l'utilisation du foreach ne nécessite pas de compteur mais le faut d'utiliser un foreach au lieu d'un for m'a perturbé, j'ai pas encore tout modifier dans mon javascript pour générer les bonne choses. Le problème aujourd'hui je crois, c'est que je comprends de moins en moins au fur est a mesure que je code. je récapitule du début avec mon code cette fois ça.

Voici une partie de mon index:
<form method="post" class="form" action="new.php" enctype="multipart/form-data" >  
		<fieldset id="main">
			<legend>Ajout danimation</legend>
			<label>Titre : <input type="text" name="titre" /></label><br/>
			<label><TEXTAREA rows="7" cols="44" name="description">Tapez ici votre description</TEXTAREA></label>
			<fieldset id="upload">
				<legend>Choix des images</legend>
				<input id="pic" type="file" name="photo_1" onchange="aff(this)"/><br />
				<span id="leschampsa_4"><a href="javascript:create_champa(4)">Ajouter un champs</a></span>
			</fieldset>
mon script php qui génère mon xml:
// Ouverture du fichier
    $file = new DOMDocument();
	
	// Création du fichier en mémoire 
    $file = new DOMDocument('1.0', 'utf-8');
	$file->formatOutput = TRUE;
	
    // Création du noeud racine
    $root = $file->createElement("global"); //On crée l élément racine
    $root = $file->appendChild($root); //On insère la racine dans le document
    
    // Création du noeud channel 
    $photos = $file->createElement("photos");//On crée un élément photos
    $photos = $root->appendChild($photos);//On ajoute cet élément à la racine
    $i=0;
	foreach($_POST as $inputName => $inputValue)
	{
		$tab = explode($inputName);
		if( $tab[0] == "pic" )
		{
			// Création des noeuds photo 
			$photo = $file->createElement("photo");//On crée un élément photo
			$photo = $photos->appendChild($photo);//On ajoute cet élément aux photos
			$varphoto= $file->createTextNode($_FILES['photo_'.($i+1)]['tmp_name']);
			$varphoto = $photo->appendChild($varphoto);

			// Création des noeuds photo 
			$comment = $file->createElement("comment");//On crée un élément comment
			$comment = $photos->appendChild($comment);//On ajoute cet élément aux photos
			$varcomment= $file->createTextNode($_POST['desphotos'.$i]);
			$varcomment = $comment->appendChild($varcomment);
			$i++;
		}
	}
et mon java script:

Code : Tout sélectionner

countinputs=0 maxinputs=4 function aff(obj){ nameok=false; var saisie=obj.value.replace(/.*\\(.+\.(gif|jpg|jpeg|png))$/i,'$1'); nameok= saisie.match(/^.+\.(gif|jpg|jpeg|png)$/i); if(!nameok){alert('pas bon le fichier'); obj.value='';} } function create_champa(i) { var i2 = i + 1; document.getElementById('leschampsa_'+i).innerHTML = '<input id="pic" type="file" name="photo_'+i+'" onchange="aff(this)"></span>'; document.getElementById('leschampsa_'+i).innerHTML += (i <= 6) ? '<br /><span id="leschampsa_'+i2+'"><a href="javascript:create_champa('+i2+')">Ajouter un champs</a></span>' : ''; }
je repasserais plus tard car la je sature :? Mon code est pleins d'erreur. dsl

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

10 févr. 2011, 17:53

Si je comprend bien ce que tu veut c'est faire l'upload de tous les champs de type file generer par ton JS ?

Si oui la solution est "simple"
- il faut donner le meme nom au input avec la notation tableuau par exemple name="file[]".
- la validation se fait avec un foreach sur le tableau $_FILES

Je te conseil de regarder dans la doc comment faire. 'est bien expliqué. Tu peut aussi regarder la classe de AB sur le forum des contributions.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

11 févr. 2011, 11:22

Bonjour, ce n'est pas exactement ce que je désire faire, cela dit la classe de AB est vraiment géniale, elle va me servir! :)

Je cherche à récupérer l'adresse de destination des fichiers uploadé pour pouvoir le mettre dans un xml qui sera lu par du flash. Ne faut-il pas que je j'utilise $_FILES['fichier'][tmp_name] ??

j'ai essayé de mettre name="file[]" mais j'ai le droit à "Notice: Undefined index: file[] in..." donc je sais plus comment faire :'(

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 févr. 2011, 14:43

Ok

Alors tu ne peut pas utiliser tmp_name car le fichier temporaire est voué a disparaitre ;)

Par contre utilise la classe pour l'upload et, de memoire, tu recupere les noms finaux des fichiers apres upload que tu pourras mettre dansntonnxml ;)

Pour le message d'erreur faudrais le code et le message complet pour que l'on puisse t'aider ;)

@+
Il en faut peu pour être heureux ......