Quick links: Content - sections - sub sections
EN FR
Quick Search Advanced search
 
Page

  [Opened] mise à jour formulaire javascript

Posted by christophec on 06/26/2007 09:33

Bonjour,

J'essai de convertir une appli existante classique en utilisant JELIX: J'ai un problème avec un formulaire de modification.

le premier champ du formulaire de modification commence par:

  ......
  <select name="nom" onchange="'updatePrenomMatricule()" />
	<option value=" ">-Choisir un matricule- </option>
	{foreach $listuser as $recuser}
		<option value="{$recuser->login}">{$recuser->login}</option>	
	{/foreach}
  </select>
  ........

je souhaite remplir les champs suivants en fonction du choix de la liste par un appel à javascript:

  var url = "../../Fonctions/PrenomMatricule.php?param=";
 
 function handleHttpResponse() {
    if (http.readyState == 4) {
        if (http.responseText.indexOf('invalid') == -1) {
            var xmlDocument = http.responseXML;
            var prenom = xmlDocument.getElementsByTagName('prenom').item(0).firstChild.data;
            var matricule = xmlDocument.getElementsByTagName('matricule').item(0).firstChild.data;
            var centre = xmlDocument.getElementsByTagName('centre').item(0).firstChild.data;
            document.getElementById('prenom').value = prenom;
            document.getElementById('matricule').value = matricule;
            document.getElementById('centre').value = centre;
            isWorking = false;
        }
    }
 }
 var isWorking = false;
  
 function updatePrenomMatricule() {
    if (!isWorking && http) {
        var nomValue = document.getElementById("nom").value;
        http.open("GET", url + escape(nomValue), true);
        http.onreadystatechange = handleHttpResponse;
        isWorking = true;
        http.send(null);
    }
 }

la première ligne du script java: var url = "../../Fonctions/PrenomMatricule.php?param="; appelle un fichier php PrénonMatricule qui renvoie les paramètres à javascript.

detail du fichier PrénonMatricule.php

 <?php
 include('../includes/mysql_connect.inc.php');

 $nomcode = $_GET['param'];
 $query = "SELECT prenom,matricule,centre,date FROM users WHERE nom = '$nomcode'";
 $result = mysql_query($query);
 $count = mysql_num_rows($result);
 		
 if ($count > 0) {
	$prenom = utf8_encode(stripslashes(mysql_result($result,0,'prenom')));
	$matricule = utf8_encode(stripslashes(mysql_result($result,0,'matricule')));
	$centre = utf8_encode(stripslashes(mysql_result($result,0,'centre')));
	$date = mysql_result($result,0,'date');
	$liste = explode("-",$date);
	$jour = $liste[0];
	$mois = $liste[1];
	$annee = $liste[2];
	$date=$annee."/";
	$date.=$mois."/";
	$date.=$jour;
	}
	 
 if (isset($prenom) && isset($matricule) && isset($centre) && isset($date)) { 
	$return_value = $prenom . "," . $matricule . "," .$centre . "," .$date; 
	$return_value = '<?xml version="1.0"  standalone="yes"?><nom><prenom>'.$prenom.'</prenom><matricule>'.$matricule.'</matricule><centre>'.$centre.'</centre><date>'.$date.'</date></nom>';
 }else{
	$return_value = "invalid".",".$_GET['param'];
 }
 
 header('Content-Type: text/xml');
 echo $return_value;
 ?>

j'espère être suffisamment clair, comment pourrai-je utiliser JELIX pour mon formulaire de modif. Peut-être existe t'il un autre solution!!! d'avance merci.

 

  [Opened] Re: mise à jour formulaire javascript

Reply #1 Posted by bballizlife on 06/26/2007 10:27

Si tu souhaite passer ton application sous Jelix, ce que je te conseillerais d'abord :

  • mets le code applicatif de PrenomMatricule.php dans une classe qui sera donc dans tonmodule/classes/PrenomMatricule.class.php par exemple et adapte le code pour utiliser jDb ou plus simplement les DAO.
  • utilise une action d'un controller à laquelle tu passeras les paramètres nécessaires. C'est dans cette action que tu feras appel à ta méthode de classe de "PrenomMatricule" qui te renverras les bonnes informations (ton xml je suppose).
  • dans cette action de controller tu récupères une réponse Xml, tu affecte le contenu de la réponse avec ton xml créé par ta classe et tu renvois le tout.

Dans ton formulaire, ton javascript fera lui appel, non pas à PrenomMatricule.php mais à l'action du controller à laquelle tu passe les bons paramètres.

Là déjà ça sera plus propre vis-à-vis de Jelix. Reste ensuite à faire fonctionner le javascript mais si l'application fonctionnait déjà, il n'y a pas de raison ;)


N'importe comment c'est dans la doc

  [Opened] Re: mise à jour formulaire javascript

Reply #2 Posted by bballizlife on 06/26/2007 15:06

Je m'arrête déjà après ta fonction choixuser(). Là tu as 2 erreurs :

  • tu ne génère pas de xml puisque tu récupère un objet via $user->finduser().
  • tu affecte ton objet (mais qui devrait être du xml) à la propriété return_value. Lis la document sur la réponse XML, ce n'est pas ça.

Je n'ai pas encore lu le JS, mais essais déjà de voir ce que ça donne en corrigeant ces points.


N'importe comment c'est dans la doc

  [Opened] Re: mise à jour formulaire javascript

Reply #3 Posted by christophec on 06/26/2007 15:31

pour la fonction choix user:

 function choixuser() {
	$rep = $this->getResponse('xml');
	$user = jclasses::getService("login~user");
	$rep->$return_value = '<nom>'.$user->nom.'</nom><centre>'.$user->centre.'</centre><profil>'.$user->profil.'</profil>';
	return $rep;
 }

Je pense que c'est mieux. merci de l'aide !!

  [Opened] Re: mise à jour formulaire javascript

Reply #4 Posted by bballizlife on 06/26/2007 16:08

C'est mieux car tu génère maintenant du XML mais ça serait mieux si tu avais lu comment générer une réponse XML sans template ;)


N'importe comment c'est dans la doc

  [Opened] Re: mise à jour formulaire javascript

Reply #5 Posted by christophec on 06/27/2007 10:47

Bonjour,

j'ai modifié mon code afin de procéder par étape :

  • javascript
 var url = "{jurl 'login~user_finduser'?param=}";
 
 function handleHttpResponse() {
	if (http.readyState == 4) {
	if (http.responseText.indexOf('invalid') == -1) {*/
	var Document = http.responseXML;
	var nom = xmlDocument.getElementsByTagName('nom').item(0).firstChild.data;
	var centre = xmlDocument.getElementsByTagName('centre').item(0).firstChild.data;
	var profil = xmlDocument.getElementsByTagName('profil').item(0).firstChild.data;
	document.getElementById("nom").value = nom;;
	document.getElementById("centre").value = centre;
	document.getElementById("profil").value = profil;
	}
	}
	}
	
 var isWorking = false;
	
 function updateUser() {
	if (!isWorking && http) {
	var nomValue = document.getElementById("matricule").value;
	http.open("POST", url + escape(nomValue), true);
	http.onreadystatechange = handleHttpResponse;
	isWorking = true;
	http.send(null);
	}
 }
  • mon contrôleur finduser:
 function finduser() {
		$rep = $this->getResponse('xml');
		$rep->content = '<matricule> <nom>non</nom> <centre>centre</centre> <profil>profil</profil> </matricule>';
		
		return $rep;
	}

Si je comprend la fonction udateuser active le contrôleur finduser, ensuite la réponse devrait être reçue par handleHttpResponse qui rempli les champ de mon formulaire.

Le formulaire ne se rempli pas mais je n'ai aucune erreur qui remonte par le navigateur.

  [Opened] Re: mise à jour formulaire javascript

Reply #6 Posted by christophec on 06/27/2007 15:35

Voilà le code de test corrigé sans le POST enfin j'espère !!

  • javascript
 {literal}
 function handleHttpResponse() {
	if (http.readyState == 4) {
		Document = http.responseText.split(",");
		document.getElementById("nom").value = Document[0];
		document.getElementById("centre").value = Document[1];
		document.getElementById("profil").value = Document[2];
	}
 }
 		
 function findUser() {
	var nomValue = document.getElementById("matricule").value;
	{/literal}
	var url = {urljsstring 'login~user_finduser'};
	{literal}
	http.open(url, true);
	http.onreadystatechange = handleHttpResponse;
	http.send(null);
 }

 function getHTTPObject() {
 var xmlhttp;
 if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
 try {
 xmlhttp = new XMLHttpRequest();
 xmlhttp.overrideMimeType("text/xml");
 } catch (e) {
 xmlhttp = false;
 }
 }
 return xmlhttp;
 }
 var http = getHTTPObject();
 {literal}
  • mon action finduser
 function finduser() {
	$rep = $this->getResponse('txt');
	$rep->content = 'findusernom,findusercentre';
	return $rep;
 }

avec les balise {literal} {/literal} la console d'erreurs répond :
unterminated regular expression literal

sans les balise literal :
missing:after property id: var url = {urljsstring 'login~user_finduser'};
mon contrôleur se nome bien userctrl

  [Opened] Re: mise à jour formulaire javascript

Reply #7 Posted by christophec on 06/27/2007 16:26

J'ai réussi à faire fonctionner le script en l'intégrant directement dans le Tpl qui contient le formulaire de modif: moduserform.tpl (1er msg de la discution).

Celà ne marche pas en chargeant le fichier finduser.js dans l'action qui créé le formulaire de modif
$rep->addJSLink('./java/UpdateUser.js');(1er msg de la discution).

est-ce normal?
encore merci pour l'aide.

  [Opened] Re: mise à jour formulaire javascript

Reply #8 Posted by bballizlife on 06/27/2007 16:47

Si ton code fonctionne bien, je pense que tu dois écrire un mauvais chemin vers ton fichier Updateuser.js et qu'il n'est donc pas chargé.

Pourquoi ./java ?


N'importe comment c'est dans la doc

  [Opened] Re: mise à jour formulaire javascript

Reply #9 Posted by christophec on 06/27/2007 17:01

le fichier se charge car si je remplace :

 var url = {urljsstring 'login~user_finduser'};%%%

par

 var url = "finduserphp";%%%

et que je créé une réponse dans le fichier finduser.php,aucun problème. il semble que l'interprétation de

 var url = {urljsstring 'login~user_finduser'};%%%

en utilisant :

 $rep->addJSLink('./java/UpdateUser.js');

ne fonctionne pas.

Mais je me trompe peut-être!!!

 
Page
  1. mise à jour formulaire javascript