IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ext JS / Sencha Discussion :

récupération de données dans une base avec JSON


Sujet :

Ext JS / Sencha

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut récupération de données dans une base avec JSON
    Bonjour,

    Je voudrais récupérer des données dans une base de données pour initialiser un formulaire.

    côté javascript, dans mon fichier appli.js, j'ai une fonction qui lance une requête ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function dbInfos() {
    	Ext.Ajax.request({
    		url: 'scripts/dbDates.php',
    		success: function(response, opts) {
    			var obj = Ext.decode(response.responseText); // ou Ext.util.JSON.decode(response.responseText), c'est pareil
    			Ext.MessageBox.alert(obj);
    		},
    		failure: function(response, opts) {
    			Ext.MessageBox.alert('reponse', 'requete echouée');
    		}
    	});
    }
    mon script dbDates.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php 
     
            // recupération des données dans la base
     
            $base = pgsqlDBconnect(MAREL_SERVER, MAREL_PORT, MAREL_BASE, MAREL_USER, MAREL_PASSWORD);
            $sql = 'SELECT MIN(MES_DATE) AS DD, MAX(MES_DATE) AS DF'. 
                    ' FROM MESURES';
            
            $res = pg_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.pg_last_error());
     
            $t = array();
            
            while ($data = pg_fetch_array($res)) {
                    $t[] = array('dd'=>$data['dd'], 'df'=>$data['df']);
            }
                    
            pg_free_result($res);
            pgsqlDBdisconnect($base);
            echo json_encode($t);
    ?>
    ce script fonctionne, puisque quand je le lance seul, il renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [{"dd":"2000-07-19 15:33:16","df":"2011-03-14 04:55:03"}]
    ce qui semble être un objet json correct.

    mais quand j'appelle ma fonction dbInfos (clic d'un bouton sur ma page), firebug me renvoie l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    missing ) in parenthetical
    dans le fichier ext-all.js, ligne 8

    si c'est un bug dans la librairie ext, je ne me vois pas aller modifier ça, sinon, qu'est ce qui cloche ?

    Merci,
    Nico

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    Bon, j'ai avancé, ça marche (enfin presque...)

    mon script dbDates.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php 
     
            // recupération des données dans la base
            $base = pg_connect("host='localhost' port=5432 dbname='MAREL' user='obsadmin' password='obsadmin'");
     
            $sql = 'SELECT MIN(MES_DATE) AS DD, MAX(MES_DATE) AS DF'. 
                    ' FROM MESURES';
     
            $res = pg_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.pg_last_error());
     
            $sql2 = 'SELECT PARAM_LIBELLE  AS P FROM PARAMETRES';
     
            $res2 = pg_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.pg_last_error());
     
            $dd = array(); $df = array(); $p = array();
            
            while ($data = pg_fetch_array($res)) {
                    $dd[] = $data['dd'];
                    $df[] = $data['df'];
            }
     
            while ($data2 = pg_fetch_array($res2)) {
                    $t2[] = trim($data2['p']);
            }
            
            $tt = array('dd'=>$dd, 'df'=>$df, 'parametres'=>$t2);
     
            pg_free_result($res);
            pg_free_result($res2);
            pg_close($base);
     
            echo json_encode($tt);
     
    ?>
    le json renvoyé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"dd":["2000-07-19 15:33:16"],"df":["2011-03-15 04:47:17"],"parametres":["Temp\u00e9rature de l'air sec","Humidit\u00e9 relative","Temp\u00e9rature","Salinit\u00e9","Oxyg\u00e8ne dissous","Rayonnement photosynth\u00e9tiquement actif","Chlorophylle a","Turbidit\u00e9","pH"]}
    ensuite, j'initialise mon formulaire, notamment une combo box avec les items du tableau 'paramètres'

    voici mon fichier appli.js:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    var DBSTART;
    var DBEND;
    var DBPARAMETRES = new Array();
     
     
     
    function dbInfos2() {
    	Ext.Ajax.request({
    		url: 'scripts/dbDates.php',
    		success: function(response, opts) {
    			var infos = Ext.util.JSON.decode(response.responseText); //, c'est pareil
    			var dd = infos['dd'][0].substr(0,10);
    			dd = dd.replace(/-/g, '/');
    			DBSTART = new Date(dd);
    			var df = infos['df'][0].substr(0,10);
    			df = df.replace(/-/g, '/');
    			DBEND = new Date(df);
    			for (var i = 0; i < infos['parametres'].length; i++){
    	    			DBPARAMETRES[i] = infos['parametres'][i];
    			}
    //			Ext.MessageBox.alert(DBPARAMETRES.length);
    		},
    		failure: function(response, opts) {
    			Ext.MessageBox.alert('reponse', 'requete echouée');
    		}
    	});
    }
     
    Marel.wParametresGraphe = Ext.extend(Ext.Window, {
     
    	initComponent : function() {
     
     
    dbInfos2();
    			// bloc sélection du paramètre
    Ext.MessageBox.alert(DBPARAMETRES.length);
    			var pp = new Array();
    			for (var i = 0; i < DBPARAMETRES.length; i++){
    	    			pp.push({p: DBPARAMETRES[i]});
    			}
    			var store = new Ext.data.JsonStore({
    							fields: ['p']
    							,data: pp
    			});
     
    			var fsetParametres = new Ext.form.FieldSet({
    					xtype: 'fieldset'
    					,title: 'Paramètres'
    					,autoWidth: true
    					,items: [new Ext.form.ComboBox({
    								id: 'parametre'
    								,name: 'parametre'
    								,store: store
    								,displayField: 'name'
    								,hideLabel: true
    								,width: 200
    								,typeAhead: true
    								,mode: 'local'
    								,forceSelection: true
    								,triggerAction: 'all'
    								,emptyText: 'Sélectionnez un paramètre...'
    								,allowBlank: false
    						})
    					]
    			});
     
    ......
    le problème, c'est que quand je fais alert de DBPARAMETRES.length, ça me renvoie 'vide', quand je la lance dans la fonction dbInfos2, ça me renvoie bien 9 (nbre d'éléments du tableau paramètres).
    Je pense que ça vient du fait que c'est de l'ajax, et donc le résultat de la requête n'est pas encore revenu quand il lance la fonction initComponent.
    Comment faire pour attendre le retour de la requête ajax?
    ou alors ajax n'est pas la bonne solution?


    Merci,
    Nico

  3. #3
    Membre éclairé
    Avatar de abraxis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 439
    Par défaut
    Petite astuce, pour tester si ton Json est correct.
    http://www.jsonlint.com/

    Ton Json est valide

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    j'ai essayé par une autre méthode avec ext.data.jsonStore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Marel.wParametresGraphe = Ext.extend(Ext.Window, {
     
    	initComponent : function() {
     
    	var dbInf = new Ext.data.Store({
    				proxy: new Ext.data.HttpProxy({url: 'scripts/dbDates.php'}),
    				reader: new Ext.data.JsonReader({fields: ['dd', 'df', 'parametres']}),
    				remoteSort: false
    });
     
     
    	dbInf.on('load', function() {
    		Ext.MessageBox.alert('reponse', dbInf.getAt(0).data.dd);
    	});
     
    	dbInf.load();
     
    ....
    le json renvoyé par le script php est correct, mais firebug me met une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbInf.getAt(0) is undefined
    comment accéder aux éléments du json ?

    Merci,

    Nico

  5. #5
    Membre éclairé
    Avatar de abraxis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 439
    Par défaut
    Essaie avec Mais ce la ne pourra pas fonctionner car dans l'appel de ton store tu veux afficher des données qui n’existe pas encore...
    A moins que je me trompe.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 491
    Par défaut
    quand je fais afficher dbInf, firebug renvoie toutes les caractéristiques de l'objet, et il y a une variable totalLength qui est à 0.

    Pourquoi les données n'existant pas encore quand je fais dbInf.load()? puisque normalement, elles devraient exister à partir de la déclaration de dbInf non ?

    dans ce cas, quelle est la solution ?
    je voudrais que quand je commence la déclaration de la config de mon formulaire, le résultat de la requête soit là, pour que je puisse initialiser les champs de mon formulaire...

    Merci,
    Nico

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Récupération des données dans une base à partir d'une valeur donnée
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 01/04/2011, 14h33
  2. Réponses: 2
    Dernier message: 19/05/2010, 16h20
  3. Réponses: 1
    Dernier message: 01/02/2010, 11h57
  4. Réponses: 3
    Dernier message: 10/03/2008, 23h43
  5. enregistrer des données dans une base avec jboss jbpm
    Par paolo2002 dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 19/09/2007, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo