Php / Ajax

Résolu/Fermé
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008 - 28 avril 2008 à 11:33
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008 - 20 mai 2008 à 15:54
Bonjour,
J'ai posté ce sujet dans le forum webmastering mais sans résultat...

C'est la première fois que j'utilise Ajax et avec les tutos et cours que j'ai trouvé je n'arrive pas a faire ce que je veux.
SUr une page internet j'ai un lien qui permet d'ajouter des lignes.(javascript), dans une ligne, j'ai deux champs et 2 checkbox. Dans le premier champ, l'auteur doit ecrire son nom. Lorsqu'il a renseigné son nom et qu'il clik sur la 2ème checkbox, je voudrais que le deuxième champ se remplisse automatiquement en allant chercher les infos dans la base de données. Etant donné que je ne prévois pas a l'avance combien j'aurais de ligne, je ne sais pas comment faire. Voici qq bouts de code :

function create_champ(i) {
var i2 = i + 1;

document.getElementById('leschamps_'+i).innerHTML = '<br /><input type="text" size="25" name="auth_'+i+' "></span>';
document.getElementById('leschamps_'+i).innerHTML += '<input type="radio" id="radio_20" name="radios_'+i+'"><label for="radio_20">Auteur extérieur</label><input type="radio" id="radio_10" name="radios_'+i+'" > <label for="radio_10">Auteur INAC : </label><span id="unit_'+i+'"><input type="text" size="25" name="unit" value="unit_'+i+'"></span>';
document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un auteur</a></span>' : '';
}


Code qui remplit ma première ligne :
<input type="texte" size="25" name="auth_1" value="<?php echo $nomprenom; ?>"/>

<input type="radio" id="radio_20" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');"> <label for="radio_20">Auteur extérieur</label>
<input type="radio" id="radio_10" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');" CHECKED> <label for="radio_10">Auteur INAC : </label>
<span id="unit_1"> <input type="text" size="25" name="unit" value="<?php echo $subdir ?>"></span>
<span id="leschamps_2"><a href="javascript:create_champ(2)">Ajouter un auteur</a></span>

La fonction GereControle me permet de masquer un champ.

Est-ce que qqun peut m'aider pour le code AJAX ou me donner les étapes a suivre...
A voir également:

11 réponses

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
29 avril 2008 à 16:28
Merci, autant pour moi je n'avais pas vu que tu m'avais déjà donné le corps de ta fonction afficher un peu plus haut ^^

Voici un bout de code qui devrait fonctionner :
<script language="javascript">
function callScript ( scriptName, args ){
	
	var xhr_object = null; 
	     
	if(window.XMLHttpRequest) // Firefox 
	   xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // Internet Explorer 
	   xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
     return; 
	} 
	 
	xhr_object.open("POST", scriptName, true);
	     
	xhr_object.onreadystatechange = function() { 
	   if(xhr_object.readyState == 4) {
			//alert(xhr_object.responseText); // DEBUG MODE
			//document.write(xhr_object.responseText);
			//eval(xhr_object.responseText);
                        afficher (xhr_object.responseText); 
		 }
		
		//alert(xhr_object.readyState);
		return xhr_object.readyState;
	} 
	 
	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	
	xhr_object.send(args);

}
function afficher(txtdocument)
{
 if ( document.getElementById('auth_2') )
     document.getElementById('auth_2').innerHTML = txtdocument;
 else
   alert('le champ auth_2 n est pas reconnu');
}

function updateFieldValue ( ){
var nom = document.getElementById('auth_2').value;
var data="nom=" + nom;
var filename = "mon.php";
// --- Call script with parameters
callScript(filename,data);
}
</script>


Tu remplace ton code javascript du haut par ces fonctions, il ne te reste plus qu'à appeler la fonction 'updateFieldValue' là où tu souhaite de la manière suivante :
<script language="javascript">
updateFieldValue();
</script>



Par contre, une autre chose dont je n'avais pas fait attention, et il est probable que ton script ne fonctionne pas en partie pour ça, c'est que d'un coté tu récupère la valeur du champ 'auth_2' comme si ce dernier est une champ de type input text :
var nom = document.getElementById('auth_2').value;

Et d'un autre coté, dans ta fonction afficher, tu essayes de remplir sa valeur comme s'il s'agissait un conteneur tel qu'une <DIV> :
document.getElementById('auth_2').innerHTML = txtdocument;


Attention ! Pour un champ input text, l'instruction 'innerHTML' ne fonctionne pas. Un warning jaune devrait apparaître d'ailleurs à l'exécution de ton script dans la console d'erreur de firefox. Mais comme tu as une autre erreur avant cette instruction tu ne l'as verra pas ;)

Je l'ai laissé tel quel dans le code ci-dessus au cas où j'ai mal compris, mais si ton champ 'ath_2' est bien de type 'input text' il faudra changer 'innerHTML' par 'value' dans la fonction afficher.

Si tu as des problèmes pour mettre le code donné dans ta page, donne moi tout le code de ta page et je te redonnerai fonctionnel.
1
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 08:20
Salut,
Désolée mais j'avais un pbm de connexion internet dc j'pouvais pas bosser. J'me penche sur le sujet aujourd'hui, je vais essayer de me débrouiller toute seule mais j'te tiens quand meme au courant. Merci beaucoup pour ton aide, c'est vraiment super sympas, et c'est grace a toi que je commence a comprendre le fonctionnement d'AJAX dc Merci, merci, merci!!!!
A+
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 12:33
Super, tout marche très bien!!

Merci kij pour ton aide qui ma été bien précieuse,

Une dernière chose est-ce que mon fichier php peut renvoyer deux données dans deux input text? Ou est-ce que je dois reprendre toute la procédure pour chaque cas?

Car mon premier input se remplit correctement mais je voudrais qu'a la suite de cela le 2ème input puisse aussi se remplir automatiquement a l'aide d'un clik sur une checkbox???Mais j'ai l'impression que l'on ne peut renvoyer qu'un seul echo...

Merci d'avance!
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
28 avril 2008 à 13:24
Bonjour,

De mémoire il y a un sujet de moins de 3 semaines qui porte sur le même problème que toi, à savoir mettre à jour un champ en allant récupérer la valeur dans une base de données, tout ça en ajax pour que ce soit dynamique.
Par contre je n'ai pas retrouvé le sujet donc il faudrait que tu fasse une recherche avec mot clé.

Sinon, tu peux toujours trouver des tutos sur le net concernant l'Ajax, ou regarde des discussion portant sur le sujet, comme celle-ci :
http://www.commentcamarche.net/forum/affich 5552245 xmlhttprequest et compatibilite navigateurs

Bon courage.
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
28 avril 2008 à 13:35
Merci, je vais regarder si je trouves qqch. J'ai déja essayé un code mais je bloque sur la page php. Voici le code que j'ai fait :

<script language="Javascript">
var xhr = null;
var filename = "nom.php";
var nom = f.elements["auth_2"].value;
function extraire()
{
if (window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
alert ("xhr est un " + xhr);
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject ("Microsoft.XMLHTTP");
alert ("xhr est un ActiveXObject" );
}
else
{
alert ("Votre navigateur n'est pas compatible avec AJAX...");
}


if (nom != "")
{
filename +="?" + data;
data = null;
}

xhr.open ("GET", "filename", false);

xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 )
{
var txtdocument = xhr.responseText;
afficher( txtdocument);
}
//xhr.send(data);
}
}//]]>
</script>

Mais il ne me donne aucun résultat...
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
28 avril 2008 à 14:23
Les informations envoyées via GET ou POST ne se construisent pas directement dans le nom du fichier à appeler.
Il faut que tu mettes ça dans le fameux 'data' qui est utilisé lors de l'envoi des paramètres via cette instruction :
xhr.send(data);

De plus, l'instruction : xhr.send(data); est celle qui permet de "lancer" l'appel à ton script PHP, donc si tu commente cette partie là c'est normal que rien ne se passe
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
28 avril 2008 à 15:26
Tout d'abord merci pour tes conseils, je débute et ce n'est pas évident quant on a pas l'expérience...

J'ai essayé ce que tu m'as dit en mettant la syntaxe suivante :

data =f.elements["auth_2"].value;

et mon data n'est plus en commentaire, mais le code s'arrete après le test du navigateur. Cela vient peut etre de ma fonction afficher :

function afficher(txtdocument)
{
var target = document.getElementById("auth_2");
target.innerHTML = txtdocument;
}

Je ne comprends pas comment le paramètre de mon input est récupéré et comment il est mis a jour. J'ai lu beaucoup de tutos mais je ne trouves pas vraiment d'exemples concrets. Peut tu m'expliquer simplement comment on récupèr le paramètre ds le fichier php et comment celui ci est ensuite renvoyé.
Si tu ne peux pas, j'te souhaite quand meme une bonne journée!!
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
28 avril 2008 à 16:16
Plusieur chose ne vont toujours pas dans ton script.
Par exemple cette ligne :
xhr.open ("GET", "filename", false);

Le deuxième paramètre est sensé être le chemin d'acces au fichier PHP a exécuter. Hors dans ton cas qu'est ce que tu passe ? La chaine de caractère "filename", et non pas la valeur de la variable filename.
Si tu as firefox, tu peux aller dans Outils->console d'erreur et tu verra certainement un point d'exclamation rouge te disant que le script 'filename' n'a pas été trouvé.

Bref, en gras, voici la syntaxe qu'il te faut pour ton script (a compléter par tes soins) :

<script language="Javascript">
var xhr = null;
var filename = "nom.php";
function extraire()
{
if (window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
alert ("xhr est un " + xhr);
}
else if (window.ActiveXObject)
{
xhr = new ActiveXObject ("Microsoft.XMLHTTP");
alert ("xhr est un ActiveXObject" );
}
else
{
alert ("Votre navigateur n'est pas compatible avec AJAX...");
}


// --- Fill data parameters
var nom = document.getElementById("auth_2").value;
data = "name="+nom;  // --- Un exemple, a toi de mettre ce qu'il te faut comme paramètres

xhr.open ("GET", filename, false);

xhr.onreadystatechange = function ()
{
if (xhr.readyState == 4 )
{
 alert("tout est ok");
//var txtdocument = xhr.responseText;
//afficher( txtdocument);
}
xhr.send(data);
}
}
</script> 


Voilà, je n'ai pas vérifié mais ça devrait fonctionner.
Le but est que tu ai une popup qui s'afficher avec le message "tout est ok". Une fois que ce sera bon, tu pourra passer à la suite, à savoir afficher du code javascript dans le script PHP appelé, de manière à ce qu'il soit exécuté par l'objet XHR.

0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
28 avril 2008 à 16:19
Je vais essayer tout ca ce soir. Merci beaucoup pour ton aide!!!
A +
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
29 avril 2008 à 11:37
Re,
J'ai essayé tout ce que tu m'as dit, mais je n'arrive toujours pas a récupérer ma valeur 'auth_2'

J'ai la fonction suivante qui me permet d'ajouter un champ :
function create_champ(i) {

var i2 = i + 1;

document.getElementById('leschamps_'+i).innerHTML = '<br /><input type="text" size="25" name="auth_'+i+' " ><span id="auth_'+i+'"></span>';document.getElementById('leschamps_'+i).innerHTML += 'input type="radio" id="radio_20" name="radios_'+i+'"> <label for="radio_20">Auteur extérieur</label><input type="radio" id="radio_10" name="radios_'+i+'" > <label for="radio_10">Auteur INT : </label><span id="unit_'+i+'"><input type="text" size="25" name="unit" value="unit_'+i+'"></span>';
document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un auteur</a></span>' : '';
}

Cette fonction marche, mais il doit y avoir un probleme au niveau de l'id de mon auth_i car j'ai fait le test sur un champ en dur (qui est la en permanence) et la j'arrive a récupérer ma valeur.
Est-ce que ca vient du fait que le champ est créé seulement lorsque l'auteur clique sur 1 lien? Mais il me semble justement qu'Ajax est la pour la partie dynamique et je pense que ma syntaxe en gras est correcte...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
29 avril 2008 à 11:47
Bonjour, ta syntaxe est correcte cependant je ne vois pas à quoi te sert le <span></span> ?
Tu le mets en dehors de ton champ input, en référencant avec l'identifiant 'auth_i' (i vaut la valeur entière ça aucun problème normalement)

Puisque tu as nommé ton champ input de la même manière que ton span, j'imagine que tu veux récupérer ce qu'il y a dans le champ input non ?
Dans ce cas c'est sur le champ input qu'il faut mettre l'attribut id='...' et supprimer les balises span.

Enfin, personnellement je n'utilise jamais ces balises donc je ne sais pas vraiment à quoi elle servent, mais si tu en as vraiment besoin peux-tu m'expliquer à quoi elles servent, ou du moins ce que tu veux en faire ?

Si tu transforme ainsi :
document.getElementById('leschamps_'+i).innerHTML = '<br /><input type="text" size="25" id="auth_'+i+'" name="auth_'+i+' " />';


Tu devrais pouvoir récupérer ta valeur via un :
document.getElementById('auth_1');
document.getElementById('auth_2');

0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
29 avril 2008 à 11:58
En fait j'me suis un peu mélangée les pinceaux a cause de la balise span c'était juste pour le style au départ. Mais cette fois j'arrive a récupérer ma variable!! Merci !!!C'est super meme si ce n'est que le début des étapes...
Par contre j'ai encore une question, pourquoi lorsque je tape mon code (j'travail sur dreamweaver) les evenements onreadystatechange et send ne sont pas reconnus?

Exemple :
xhr.open ("GET", filename, true); (le open est en bleu dc c'est tout bon)
mais
xhr.onreadystatechange = function () (le onreadystatechange est tjs en noir, dc je suppose que c'est pour cela qu'ensuite ma fonction ne vas pas plus loin...)
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
29 avril 2008 à 13:31
Re,

Je ne connais pas dream, mais le fait qu'il ne colore pas la syntaxe ne veut pas dire que le script ne fonctionne pas.
open est un nom de commande relativement connu et exploité dans les différents langages, ce qui n'est pas le cas pour le mot clé 'onreadystatechange'.

Pour ma part, voici la fonction que j'utilise à chaque fois lorsque je veux faire appeler un script :
function callScript ( scriptName, args ){
	
	var xhr_object = null; 
	     
	if(window.XMLHttpRequest) // Firefox 
	   xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // Internet Explorer 
	   xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
	else { // XMLHttpRequest non supporté par le navigateur 
	   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
     return; 
	} 
	 
	xhr_object.open("POST", scriptName, true);
	     
	xhr_object.onreadystatechange = function() { 
	   if(xhr_object.readyState == 4) {
			//alert(xhr_object.responseText); // DEBUG MODE
			//document.write(xhr_object.responseText);
			eval(xhr_object.responseText);
		 }
		
		//alert(xhr_object.readyState);
		return xhr_object.readyState;
	} 
	 
	xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	
	xhr_object.send(args);

}


Où args est la chaine de caractère représentant les paramètres que je passe au script appellé.
C'est le même code que toi donc le tien devrait fonctionner aussi.

Il faut donc plutôt chercher ailleurs : du coté de ton script.
Les questions à se poser sont les suivantes :
- est ce que mon script est correctement appelé ? (chemin d'accès ok)
- est ce qu'il est exécuté ? Pour cela il suffit de mettre une instruction de ce type dans ton script php (sans rien d'autre c'est juste pour tester) :
  echo "coucou";
  

Et de commenter la ligne
eval(xhr_object.responseText); 

de mon code, puis décommenter la ligne
//alert(xhr_object.responseText); // DEBUG MODE


Pour information, la commande 'eval' permet d'évaleur une chaine de caractère comme du code.
Dans mes scripts PHp j'ai pour habitude d'écrire sur la sortie du code javascript, qui est donc interprété via cette commande 'eval', ce qui permet de mettre à jour les éléments de ma page courante.

Reprenons, effectue ces deux petites choses pour savoir si le script est bien trouvé et exécuté.
Un autre moyen de le savoir est d'exécuter ta page sous firefox en vérifiant si une alerte d'erreur apparait dans la console d'erreur de FF (accessible via Outils-> console d'erreur, onglet erreurs)
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
29 avril 2008 à 14:56
Bon j'en suis tjs au meme point pourtant j'ai essayé ce que tu m'as dit.
Apparament mon code s'arrete après la ligne en gras car il m'affiche ('good") mais je ne parviens pas a l'alerte Tout est ok.

nom = document.getElementById('auth_2').value;
data="nom=" + nom;
filename +="?" + data;
alert ("valeur récupérée " + data);

xhr.open ("GET", filename, true);
alert("good");
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4 && xhr.status == 200 )
{
alert("Tout est OK");
var txtdocument = (xhr.responseText);
afficher (txtdocument);
}
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send (data);
}
}

mon script php s'appelle nom.php :
<?php

echo ("données recues");

?>

Je ne peux pas le faire plus simple...

Je fais un petit résumé pour voir si j'ai bien compris :
xhr.onreadystatechange = function() // sert a indiquer que la requete a changé dc ds mon cas la donnée data
if (xhr.readyState == 4 && xhr.status == 200 ) // si l'état et le statut son bon
{
alert("Tout est OK");
var txtdocument = (xhr.responseText);// ca c'est la réponse qui vient de mon script php
afficher (txtdocument); //fonction qui me permet d'afficher la valeur récupérée
}
Tu vois c'est un peu flou tout ca... Pourtant le chemin d'acces est correct
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
29 avril 2008 à 15:14
Non ton code n'est pas bon, je n'avais pas fais attention mais regarde / compare plus attentivement avec celui que je t'ai donné plus haut.

Tu t'apercevra que ton instruction send data est compris dans ton onreadystatechange.

Onreadystatechange = new function.... te permets de définir QUOI faire lorsque le status de l'objet XHR change au cours du temps. Le status peut être parmi les suivants : instanciate, initialized, ..., finished. (grossomodo, ce n'est pas les termes exacts mais je n'ai pas la doc sous les yeux)

Hors, puisque ton instruction send data, qui elle va réellement exécuter ton objet XHR, est à l'intérieur de ta fonction, tu vois que ça ne peut pas aller (?)

Il faut donc que :
- tu sortes ces deux instructions de ta fonction onreadystatechange :
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send (data); 


- Tu peux à mon avis supprimer la partie suivante dans ton test :
&& xhr.status == 200 


Avec tout ça tu devrais enfin voir quelque chose fonctionner, du moins je l'espère pour toi :)


PS: par ailleurs j'aimerais bien voir le code de ta fonction afficher si c'est possible
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
29 avril 2008 à 15:20
Tout d'abord merci pour ta patience,
j'ai bien compris ce que tu m'as dit je vais essayer de suite. En attendant voila ma fonction afficher :

function afficher(txtdocument)
{
var target = document.getElementById('auth_2');
target.innerHTML = txtdocument;
}
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
29 avril 2008 à 15:38
Effectivement, le code avance un peu plus depuis que j'ai enlevé

&& xhr.status == 200

j'obtiens maintenant l'alerte "tout est ok" mais la donnée de mon input ne change tjs pas.
serait -il possible que tu me fasses juste un tout petit exemple simple et commenté pour que je comprennes correctement le fonctionnement entre mon js et ma page php. car c'est la première fois que j'utilise AJAX et les tutos que je trouvent sont trop élaborés et ca me perd encore plus... Et ca a l'air sympas quand on le maitrise alors j'aimerais au moins comprendre les bases correctement

Merci d'avance... et félicitation pour tes connaissances!
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
5 mai 2008 à 13:28
Salut,

Cela dépend : est ce que c'est le même évênement qui doit déclencher le remplissage des deux inputs ? Si oui alors tu peux effectivement faire ça dans le même fichier PHP à condition de changer quelques petits trucs pour faciliter le travail :

- remettre comme je fais habituellement dans la fonction javascript 'callScript', à savoir commenter l'appel à ta fonction afficher, et décommenter cette ligne :
//eval(xhr_object.responseText);


- modifier quelque peu ton code dans le script PHP de manière à écrire directement le code javascript chargé de raffraichir dans les 'echo'.

Ce n'est pas simple à expliquer clairement mais disons que si tu veux raffraichir un élément directement depuis ton fichier PHP (après avoir bien modifié le javascript comme dis ci-dessus), il suffit de mettre le code javascript directemetn dans ton echo php.

Par exemple au lieu de faire appel à ta fonction afficher dans l'objet XHR, tu écrira directement dans le PHP de la façon suivante :
echo "var input1 = document.getElementById('auth_2');";
echo 'input1.value = ".$value2.";";   // --- $value2 est la valeur récupérée par ta requête SQL 1
echo "var input2 = document.getElementById('auth_3');";
echo 'input1.value = ".$value3.";";   // --- $value3 est la valeur récupérée par ta requête SQL 2


Voilà un exemple, ce code javascript qui est renvoyé sur la sortie standard de ton script PHP, est récupée dans la fonction callScript et directement interprétée via l'instruction 'eval' :
eval(xhr_object.responseText);


Si tu as du mal donne moi le code entier de ton fichier PHP et je le modifierai pour te montrer la syntaxe exact.


PS : dans le cas où ce n'est pas le même évènement qui déclenche le remplissage du deuxième input, il faudra bien sur créer un deuxième script PHP qui fera le traitement approprié pour remplir ce deuxième input, et l'appeler via la fonction callScript en lui passant le chemin vers ce nouveau script php, ainsi que ses paramètres.

PS bis : dans tous les cas il est préférable de faire comme je dis dans ce post : écrire directement le code javascript interprétable dans ton script PHP. Cela te donne plus de souplesse pour effectuer les changements que tu souhaite voir opérer dans ta page.
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 14:30
oulala, ce n'est pas simple...

Je vais essasyer de t'expliquer correctement ce que je veux faire et je te donnerai mon code php

Lorsque un auteur clique sur le lien ajouter un auteur, une nouvelle ligne apparait :
Cette ligne se compose ainsi : (dsl je ne peux pas faire de copies d'écran) mais je pense que tu vas comprendre:

inputtype1 checkboxexterne checkboxinterne inputtype2

inputtype1 : la personne entre son nom, grace a mon code php et a ton aide, lorsque je clik sur le bouton actualiser, mon fichier php recherche le nom et le prenom dans un annuaire spécial. Par exemple si je rentre Dupont et que je clik sur actualiser, mon input va m'inscrire Maelle Dupont

inputtype2 : cet inputType correspond au service de la personne entrée ds inputtype1, je voudrais que cette input se remplisse si la personne coche la checkboxinterne. Le service est trouvé grace a mon code php.

Voila le code php qui me permet de trouver le nom et prénom de la personne

<?php



function Mes_contacts($id_u, $id_f1, $id_f2)
{
$requete ="SELECT uid FROM tbl_kifekoi_byunit WHERE id_unit='$id_u' AND (id_fonction='$id_f1' OR id_fonction='$id_f2')";
$result = mysql_query($requete,$w10) or die(mysql_error()); //ça merde ici
$row= mysql_fetch_assoc($result);
$return=$row['uid'];
return $return;
}

if($news->_ldap->KiTesToi2()) //si on a trouvé l'uid
{ //début crochet 3
$uid=$news->_ldap->KiTesToi2();
}

$auth_2= $ldap->KiTesToi2();
// $auth contient le id trouvé dans l'annuaire sous forme pnom

$requete ="SELECT * FROM CONSULT_LOGO WHERE nom='$auth_2'";
//echo $requete; // pour le debug
$result = mysql_query($requete,$w10) or die(mysql_error());
$row= mysql_fetch_assoc($result);


if (empty($auth_2)) // {
echo "<br /><br />Vous n'avez pas saisi votre nom ?!
<a href=\"javascript:history.back()\">
Retournez à la page précédente</a> et indiquez votre nom...<br />
ou le choix est multiple... cochez le bouton qui convient et cliquez sur <i>Entrer</i>.";
}
else
{ //début crochet 4
$requete ="SELECT * FROM CONSULT_LOGO WHERE nom='$auth_2'";
//echo $requete; // pour le debug
$result = mysql_query($requete,$w10) or die(mysql_error());
$row= mysql_fetch_assoc($result);
$infoauth=$ldap->searchFromUid($auth_2);
$news->_ldap->KiTesToi2();
$nomprenom=$infoauth[0][cn][0];
echo $nomprenom;
}
?>

Je n'ai encore pas fait le code pour rechercher le service, si tu peux juste me montrer la syntaxe pour le 2ème input.. Ensuite je n'aurai plus qu'a lui donné la valeur de ma fonction... Je t'ai mis en gras la fonction qui me renvoie bien la bonne valeur ds mon inputtype1 (ce que l'on a fais jusqu'a présent)

J'espère que tu as tout compris car ce n'est vraiment pas simple a expliquer...
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 15:50
Lorsque j'utilise cette syntaxe :

echo "var input1 = document.getElementById('auth_2');";
echo 'input1.value = ".$nomprenom.";';

$nomprenom s'inscrit dans mon input, je n'arrive pas a récuperer la valeur de ma fonction, alors que ca fonctionnait avec ma fonction afficher.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 15:57
Regarde le post 21.

Sinon que veux tu dire par récupérer la valeur de ta fonction ? Si tout s'écrit dans ton champ input c'est bon, je ne vois pas ce que tu veux faire de plus pour le moment.
Ta fonction javascript 'afficher' ne doit plus être appelée, elle ne sert plus à rien désormais.
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
5 mai 2008 à 15:55
Re, désolé j'étais en longue réunion :s

Donc, si j'ai bien suivi... ton nom est Dupont ! :D C'est pas courant dis donc :D

Plus sérieusement, il faut :
1) que tu commente / décommente la partie de code comme ci-dessous dans la fonction javascript 'callScript' :
   eval(xhr_object.responseText);
   //afficher (xhr_object.responseText); 


2) Dans ton script PHP, effectues les modifications suivantes (en gras) :
<?php



function Mes_contacts($id_u, $id_f1, $id_f2)
{
$requete ="SELECT uid FROM tbl_kifekoi_byunit WHERE id_unit='$id_u' AND (id_fonction='$id_f1' OR id_fonction='$id_f2')";
$result = mysql_query($requete,$w10) or die(mysql_error()); //ça merde ici
$row= mysql_fetch_assoc($result);
$return=$row['uid'];
return $return;
}

if($news->_ldap->KiTesToi2()) //si on a trouvé l'uid
{ //début crochet 3
$uid=$news->_ldap->KiTesToi2();
}

$auth_2= $ldap->KiTesToi2();
// $auth contient le id trouvé dans l'annuaire sous forme pnom

$requete ="SELECT * FROM CONSULT_LOGO WHERE nom='$auth_2'";
//echo $requete; // pour le debug
$result = mysql_query($requete,$w10) or die(mysql_error());
$row= mysql_fetch_assoc($result);

$affichage = "";

if (empty($auth_2)) // {
$affichage = "<br /><br />Vous n'avez pas saisi votre nom ?!
<a href=\"javascript:history.back()\">
Retournez à la page précédente</a> et indiquez votre nom...<br />
ou le choix est multiple... cochez le bouton qui convient et cliquez sur <i>Entrer</i>.";
}
else
{ //début crochet 4
$requete ="SELECT * FROM CONSULT_LOGO WHERE nom='$auth_2'";
//echo $requete; // pour le debug
$result = mysql_query($requete,$w10) or die(mysql_error());
$row= mysql_fetch_assoc($result);
$infoauth=$ldap->searchFromUid($auth_2);
$news->_ldap->KiTesToi2();
$affichage =$infoauth[0][cn][0];
}

// --- Javascript code to update interface
echo "document.getElementById('auth_2').innerHTML = '".$affichage ."';";
//echo "document.getElementById('auth_2').value = '".$affichage ."';";  // en fonction du type de champ

?> 


Voilà, normalement ça devrait faire la même chose qu'auparavant.

Pour ce qui est par contre de l'action déclenchée par la checkbox, il me faut impérativement le code PHP de cette partie de ton formulaire pour pouvoir t'aider (afin de connaitre les identifiants des champs, etc.)
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
5 mai 2008 à 20:02
Alors tout d'abord, ce que je voulais dire dans le post 20 c'est que $nomprenom s'affiche dans mon input, mais $nomprenom est une fonction et je voudrais que ce soit sa valeur qui soit affichée ds l'input, c'est a dire dupont maelle lol

Lorsque j'utilisait ta fonction afficher, cela me retournait bien la bonne valeur, dcc mon code php est bon, mais étant donné que le remplissage des inputs dépend du meme évenement, j'ai modifié mon code comme tu me l'as dit, je pense que ce doit etre un probleme de syntaxe, regarde, j'ai ajouté ces lignes ds mon .php :

echo "var input1 = document.getElementById ('auth_2');";
echo "'input1.value = ".$nomprenom.";";

Je n'arrive pas a comprendre pourquoi, je n'arrive pas à récupérer les valeurs de ma fonction?!?
Une fois que cela est bon je pense pouvoir me débrouiller pr le reste.

Voici quand meme le code de la partie du formulaire qui est créé lorsque l'auteur clique sur le lien

function create_champ(i) {

var i2 = i + 1;

document.getElementById('leschamps_'+i).innerHTML = <br /><input type="text" size="25" name="auth_'+i+'">
document.getElementById('leschamps_'+i).innerHTML += <input type="radio" id="radio_20" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');"> <label for="radio_20">Auteur extérieur</label>
;
<input type="radio" id="radio_10" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');" CHECKED> <label for="radio_10">Auteur INAC : </label>
<span id="unit_1"> <input type="text" size="25" name="unit" value="<?php echo $subdir; ?>"></span>;
document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un auteur</a></span>' : '';
}

Gerecontrrole est une fonction qui sert a caché le champ s'il n'est pas coché.

VOici maintenant (au cas ou) la partie du formulaire en html (si tu veux te rendre compte de ce que ca donne):
<h3>Auteurs : </h3>

<input type="texte" size="25" name="auth_1" value="<?php echo $nomprenom; ?>"/>;
<input type="radio" id="radio_20" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');"> <label for="radio_20">Auteur extérieur</label>;
<input type="radio" id="radio_10" name="radios_1" onClick="GereControle('radio_10', 'unit_1', '1');" CHECKED> <label for="radio_10">Auteur INAC : </label>
<span id="unit_1"> <input type="text" size="25" name="unit" value="<?php echo $subdir; ?>"></span>;
<span id="leschamps_2"><a href="javascript:create_champ(2)">Ajouter un auteur</a></span>

Voila, par contre je ne serais pas la pendant 10 jours, ddc j'espère que l'on pourra se recontacter et voir tt ca à mon retour.

Dans tout les cas, tu m'as déja beaucoup aidé et bien permis d'avancer... Merci beaucoup!! a+
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
6 mai 2008 à 10:31
Salut,

Pour ce qui est de ton code il y a bien des erreurs de syntaxe (en gras) :
echo "var input1 = document.getElementById ('auth_2');";
echo "'input1.value = ".$nomprenom.";";


Et il manque des guillemets simples autour de la valeur de $nomprenom. Voilà ce que tu devrais avoir :
echo "var input1 = document.getElementById ('auth_2');";
echo "input1.value = '".$nomprenom."';";


Pour ce qui est du reste on verra ça à ton retour.
Bonnes vacances ^^
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
19 mai 2008 à 14:13
Ca y est les vac sont finies.

Effectivement, avec la bonne syntaxe tout marche correctement. J'arrive maintenant a réactualiser mes 2 input en cliquant sur ma checkbox.

Mais j'ai un dernier problème. L'utilisateur peut ajouter autant de lignes qu'il désire. Lorsque dans le code j'utilise auth_2, tout vas bien, cependant, j'aimerais remplacer mon 2 par i.

Comment dois-je faire pour que mon i prenne la valeur 2 pour la deuxième ligne par exemple et ainsi de suite... Est-ce que je peux mettre un paramètre dans ma fonction updateFieldValue()?

Voila comment est appelée ma fonction en gras :
function create_champ(i) {

var i2 = i + 1;

document.getElementById('leschamps_'+i).innerHTML = '<br /><input type="text" size="25" name="auth_'+i+' " id="auth_'+i+'">';
document.getElementById('leschamps_'+i).innerHTML += '<input type="radio" id="radio_20" name="radios_'+i+'"> <label for="radio_20">Auteur extérieur</label;<input type="radio" id="radio_10" name="radios_'+i+'"onClick="updateFieldValue()" > <label for="radio_10">Auteur INAC : </label><input type="text" size="25" name="unit_'+i+'" id="unit_'+i+'';
document.getElementById('leschamps_'+i).innerHTML += (i <= 10) ? '<span id="leschamps_'+i2+'"><a href="javascript:create_champ('+i2+')">Ajouter un auteur</a></span>' : '';
}
</script>

J'espère que tu pourras m'aider.
Merci d'avance...
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
20 mai 2008 à 13:08
Salut :)

Et bien oui, pour cela il te suffit juste de mettre un paramètre à la fonction javascript 'updateFieldValue()', que ce paramètre soit pris en compte dans la fonction et passées au script PHP lorsqu'il est appelé, puis modifier ton script PHP pour qu'il récupère ce paramètre, et mette à jour non plus la div 'auth_2' mais 'auth_'.$param


Je pense que tu es en mesure de faire les modifications toi même, si tu as soucis je reste à ta disposition.
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
20 mai 2008 à 14:12
Peut tu m'expliquer le fonctionnement de la fonction updatefieldvalue(), je ne compprends pas la partie en gras :

function updateFieldValue (i)
{

var name = document.getElementById('auth_'+i).value;
var data="nom=" + name ;var filename = "nom.php";
// --- Call script with parameters
callScript(filename,data);

}

A quoi me sert "nom", c'est le nom du fichier?
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857 > Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008
20 mai 2008 à 14:41
La fonction updateFieldValue a pour but d'être facilement appelée depuis le formulaire (un seul paramètre) et de faire appel au script PHP de mise à jour. En complément, elle configure les paramètres à envoyer au script (ici uniquement le paramètre 'nom' que tu récupère dans ton script PHP via : $_POST["nom"].

la variable 'data' représente ici les paramètres donné au script PHP, sous forme de chaine de caractère. Son écriture est la même que lorsque tu envois des paramètres dans une url via la méthode GET d'un formulaire, tu as généralement une url de la forme suivante :
htpp://www.monsite.com?name=toto&id=3&blabla=bidule


Tout ce qui se situe après le '?' représente les arguments passé en paramètre de la page (url) que tu appelle.
Et bien un script PHP, via les objets XHR, s'appelle de la même manière. C'est donc pour cela que tu as besoin de construire la chaine de caractère qui représentera tous les paramètres que tu veux faire passer au script.

Dans ton exemple, tu n'as qu'un seul paramètre, donc tu as :
var data="nom=" + name ;

Si tu avais eu un second paramètre à envoyer, nommé toto par exemple tu aurais fais ainsi :
var data="nom=" + name + "&toto=" + totoValue ;

'totoValue' étant ici une variable représentant une valeur, ce n'est qu'un exemple.
0
Maelle85 Messages postés 40 Date d'inscription lundi 7 avril 2008 Statut Membre Dernière intervention 3 juin 2008 > kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013
20 mai 2008 à 15:54
Merci beaucoup pour tout!!!

Tout fonctionne correctement!!

Juste une petite modif de syntaxe pour ceux que ca peut interesser :
echo "var input1 = document.getElementById('auth_'+'$i');";

Et merci pour toutes les explications, au début je navais pas très bien compris le fonctionnement, mais cette fois c'est tout bon!!

Peut etre à une prochaine et merci pour tout ce que tu m'as appris!!!
0