Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXTJS, MINI TUTO ET INTERRACTION AVEC UNE BASE DE DONNÉES


Information sur le tutorial

Catégorie :Formulaire Date de création : 23/06/2008 18:49:25 Vu : 8 416 fois

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note

Description

Ce document est un tutoriel destiné à enseigner les bases d'extJS (JavaScript), en particulier l'interaction entre le script et une base de données.

Etant moi-même encore novice dans l'utilisation de ce Framework, ce tutoriel n'a pas pour vocation d'être exhaustif, mais il a pour but d'aider ceux qui souhaitent apprendre et utiliser la librairie Ext.

Les sources de ce tuto sont mises à disposition sur http://cv.pierrehoffmann.free.fr/mini%20tuto%20extJS.rar

Tutorial

********** Introduction **********

--------------- Définition ---------------

Ext est une bibliothèque Javascript permettant de construire des applications web interactives. C'était au départ une extension à la bibliothèque Javascript YUI de Yahoo, Ext peut maintenant être utilisée avec les bibliothèques Prototype, JQuery ou encore toute seule. Ext apporte un certain nombre de composants visuels d'une grande qualité comme des champs de formulaires avancés, des arbres, des tableaux, menu et barre d'outils, onglets, boites de dialogue. La version 2.0 est de sortie le 4 décembre 2007. Il s'agit d'une amélioration majeure de la bibliothèque.

Source : http://fr.wikipedia.org/wiki/Ext

--------------- Comment l’utiliser en HTML ---------------

La première phase consiste à télécharger le SDK complet contenant toutes les sources du framework.

http://extjs.com/products/extjs/download.php

Ensuite, deux fichiers seront impérativement appeler dans nos pages, à partir desquels, presque toutes les fonctionnalités pourront être utilisées (excepté l’Ajax avec les jquery, se trouvant dans un dossier annexe du Sdk, ou la bibliothèque scryptaculous permettant du design …)


Voici donc les lignes à rajouter

<script type="text/javascript" src="javascript/ext-base.js"></script>

<script type="text/javascript" src="javascript/ext-all.js"></script>


Ensuite, un design complet est fournit d’office dans le kit, il est donc préférable de copier le contenu des ressources d’ext jS ainsi que le CSS ext-all.css

<link type="text/css" rel="stylesheet" href="CSS/css/ext-all.css" />

<link type="text/css" rel="stylesheet" href="CSS/css/xtheme-gray.css" />

Ce second CSS concerne le design des popups du site


Ensuite, pour créer les fonctions désirées, référez vous au site http://extjs.com/deploy/dev/examples/samples.html

Qui fournit de nombreux exemples de l’utilisation d’extJS.



--------------- Comment interagir avec une base de données ---------------

Voici le point clé de ce tutoriel, en effet, très peu de documents sur internet relatent cette partie pourtant capitale dans l’utilisation d’extJS.

Dans notre exemple, nous allons créer une fenêtre de login, puis tester si l’utilisateur est enregistré dans la base de données. (voir chapitre 3)


Voici un lien pour télécharger directement les sources de ce tuto : http://cv.pierrehoffmann.free.fr/mini%20tuto%20extJS.rar



********** Procédure **********

--------------- 1ère étape : créer le fichier javascript login.js ---------------

Tout d’abord, créons notre formulaire à l’aide d’extJS


//Login, il s'agit d'un panel contenant le formulaire avec les champs login, password...

var login = new Ext.FormPanel({

id: 'login',                //id de la fenêtre

frame: true,                 //pour que tous les items soient dans la même frame

autoWidth: true,            //largeur de la fenêtre

autoHeight: true,            //hauteur de la fenêtre

labelWidth: 110,             //largeur des labels des champs

defaults: {width: 230},         //largeur des champs

labelAlign: 'right',            //les labels s'aligneront a droite        

bodyCfg: {tag:'center', cls:'x-panel-body'},        //on aligne tous les champs au milieu de la fenêtre

bodyStyle: 'padding:5p;margin:0px; ',


items: [{        //Ici, on affiche à la suite tous les champs que l'on veut mettre

xtype: 'textfield',            // = champ de texte

    fieldLabel: 'Adresse Email',         // = label de description du champ

    id: 'email',

    name: 'email',

    vtype: 'email',     //Vérification type : met un masque d'adresse email sur ce champ

    vtypeText: 'Votre adresse email doit être de la forme de "user@domain.com"',

//message si email non valide

    allowBlank: false,                //champ obligatoire pour poster le formulaire

    blankText:"Veuillez saisir votre adresse email."    //message si le champ n'est pas rempli

},{

    xtype: 'textfield',

    fieldLabel: 'Mot de passe',

    id: 'pass',

    name: 'pass',

    allowBlank: false,

    inputType: 'password',

    blankText:"Veuillez saisir votre mot de passe."

},{

    xtype:'checkbox',

    boxLabel : ' ',

    fieldLabel: 'Se souvenir de moi',

    checked: true,

    style: 'left:-104px;position:relative;',

    name: 'save'

},{

    xtype: 'button',

    text: 'Se connecter',

handler: fct_submit    //fonction à appeler lorsque l’on clique sur le bouton

},{

    xtype: 'hidden',        //Balise cachée afin de dire qu'il s'agit d'une connexion

    id: 'connexion',

name: 'connexion'

},{

    html: '<a class="lien" href="recup.php">Mot de passe oublié?</a>',    

//dans les balises html: on peut mettre n'importe quel code html

    bodyStyle:

    {

        paddingTop: '20px'

    }

},{

    html: '<a class="lien" href="inscrip.php">Créer un nouveau compte</a>'

}]

});


Voila notre formulaire créé. Afin de rendre le design plus attrayant, nous allons ajouter un nouveau panel contenant une status bar. Il s’agit d’une petite ligne en bas à gauche de la fenêtre affichant l’état de la connexion : « formulaire valide, connexion réussie, mot de passe incorrect … »



//Ce panel contiendra le panel précédent qui est le formulaire, sauf qu'en bas de celui ci figure la status bar, permettant d'afficher le status de la connexion (chargement ....)

var login_total = new Ext.Panel({

autoWidth: true,            //largeur de la fenêtre

autoHeight: true,            //hauteur de la fenêtre

    layout: 'fit',

    items: login,        //On met dans ce panel le panel de login

    bbar: new Ext.StatusBar({

        id: 'form-statusbar',

        defaultText: 'Prêt',

        plugins: new Ext.ux.ValidationStatus({form:'login'})

    })

});



Enfin, créons la fonction qui va instancier la fenêtre contenant ce panel

    

var win_login;

if(!win_login){            //Si la fenêtre de connexion n'existe pas, on la crée

    win_login = new Ext.Window({

    title: 'Authentification',        //titre de la fenêtre

    el:'popup_log_window',        

//********* el = id du div dans le code html de la page qui contiendra la popup ! ************//

    layout:'fit',

    width:400,

    autoHeight: true,        //hauteur de la fenêtre

    modal: true,             //Grise automatiquement le fond de la page

    closeAction:'hide',

    plain: true,

    items: login_total        //On met dans cette fenêtre le panel précédent

    });

}


function show_win_login(){

    win_login.show();

}

Voila le résultat


Dernière chose à ajouter à ce fichier JavaScript : le code de la fonction à traiter lorsque l’on clique sur le bouton « Se connecter » :



Ext.QuickTips.init();                //nécessaire pour initialiser les infobulles d’erreur

Ext.form.Field.prototype.msgTarget = 'side';    //nécessaire pour initialiser les infobulles d’erreur


function fct_inscription(btn){

    //Fonction pour rediriger l’utilisateur sur la même page où il se trouve.

location.replace = location.href ;

}


//Fonction appelée en cliquant sur submit du formulaire

function fct_submit() {

var sb = Ext.getCmp('form-statusbar');    //on instancie la statusbar en bas a gauche de la fenêtre

sb.showBusy('connexion ...');            //on y affiche un message de chargement

login.getEl().mask();                //on applique un masque gris sur la fenêtre nommée login


if (login.form.isValid()) {            //si le formulaire dans login est valide

login.form.submit({            //similaire à la méthode post

    url: 'log_post.php',        //URL de la page sur laquelle on effectue la méthode post

    method: 'POST',


    reset: false,            //pour ne pas reseter les formulaires en cas d'échec

    

//Si une erreur est survenue lors du POST

    failure: function(result, action) {


//L'objet JSON vas rechercher dans lire le résultat du POST et le décoder

        obj = Ext.util.JSON.decode(action.response.responseText);


//S'il s'agit d'une phrase générale on l'affiche(errors = type d'action ; reason : nom de l'action, on peut nommer cela comme on veut dans le formulaire post)

var message = obj.errors.reason;    

        

//si le message n'inclue pas un ID précis d'un champ de notre formulaire, on affiche simplement un message d'erreur général dans notre status bar, et non a droite du champ concerné

        if (message == undefined) message = obj.errors[0].msg;        

            

        sb.setStatus({        //On modifie le texte de notre status bar

            text:'Erreur : '+ message,

            iconCls:'',

            clear: true

        });

    }, //fin de la fonction failure


    //S'il n'y a pas eu d'erreur dans notre POST...

    success: function(result, action) {

        //Message de bienvenue

        obj = Ext.util.JSON.decode(action.response.responseText);

        var message = obj.msg.reason;        //on recherche le message à afficher

            

        sb.setStatus({

            text:'Authentification réussie : '+ message,

            iconCls:'',

            clear: true

        });

//msgbox affichant le message de connexion, puis redirige l'utilisateur s'il clique sur ok

        Ext.MessageBox.alert('Bienvenue', message, fct_inscription);

        

    }    //fin de la fonction success


});    //fin du submit


    

} else {        //Si le formulaire n'est pas valide, on change la phrase dans notre status bar

    sb.setStatus({

        text:'Erreur : Formulaire non valide.',

        iconCls:'',

        clear: true

    });

}

login.getEl().unmask();

}



--------------- 2ème étape : implémenter le code HTML ---------------


Tout d’abord, il faut déclarer les fichiers javascript dans le head de la page.

<link type="text/css" rel="stylesheet" href="CSS/css/ext-all.css" />

<link type="text/css" rel="stylesheet" href="CSS/css/xtheme-gray.css" />

    

<script type="text/javascript" src="javascript/ext-base.js"></script>

<script type="text/javascript" src="javascript/ext-all.js"></script>

<script type="text/javascript" src="javascript/validationStatus.js"></script>

<script type="text/javascript" src="javascript/log.js"> </script>


Remarque : le fichier validationstatus.js est requis pour la statusbar.


Ensuite, il faut définir la balise sur laquelle la popup doit s’ouvrir au click :

<a href="javascript:show_win_login();">Lancer la popup</a>

(On Remarque qu’il suffit d’écrire l’id de la balise pour que l’événement onReady d’estJS le prenne en compte.)


Enfin, il faut préparer un div qui contiendra la popup de login, mais qui reste caché tant qu’on ne l’a pas activé:


<div id="popup_log" class="x-hidden">

<div id="popup_log_window"></div>

</div>


Remarque : Il faut que le div « popup_log_window » soit déclaré dans la balise « el » de la fenêtre win d’extJS.


Erreur lors de l’authentification : mauvais mot de passe


--------------- 3ème étape : Le code PHP ---------------


Ce fichier doit être un fichier PHP vide, ne contenant que les tests de POST que nous allons effectuer grâce à extJS.

Dans notre exemple se fichier se nomme log_post.php et est appelé dans la balise URL de la fonction POST.

<?php

///////Fichier servant à traiter le formulaire de login créé par extJS dans javascript/log_non_connecte.js et javascript/log_connecte.js ///////


session_start()        //On initialise les sessions


if(isset($_POST['connexion']))        //S'il s'agit du POST du formulaire de connexion

{

$email = htmlentities($_POST['email'], ENT_QUOTES);

$pass = htmlentities($_POST['pass'], ENT_QUOTES);


$filename = $adrr."includes/my_sql.php";    //Classe de connexion à la bdd --> plus sécurisé, pratique et simple

if (file_exists($filename)) include($filename);



$maclasse = new my_sql();

$maclasse->query("SELECT * FROM membres WHERE login='".$email."'");

$maclasse->fetch_array();

if($maclasse->num_rows() == 0)        //login non trouvé

{

//message d'erreur général : on met la raison de l'erreur sans préciser quel type de champ est a l'origine du problème

die("{success: false, errors: { reason: 'Authentification &eacute;chou&eacute;e. Veuillez r&eacute;essayer.' }}");

}

else

{

if ($pass <> $maclasse->row['pass'])        //pass incorrecte

{

//message d'erreur particulier car on sait quel champ est à l'origine du problème, et on note donc l'id

die("{success: false, errors: [{id:'pass', msg:'Votre mot de passe est incorrect'}]}");

}

elseif($maclasse->row['val']==0)        //compte non activé

{

die("{success: false, errors: { reason: \"Vous devez valider votre compte avant de pouvoir l'utiliser.\" }}");

}

else

{

//On enregistre les info de l'utilisateur dans des cookies car elles ne peuvent pas être enregistrée en tant que variable de session pour le moment

$_SESSION['id'] = $maclasse->row['id'];

$_SESSION['nom'] = $maclasse->row['nom'];

$_SESSION['prenom'] = $maclasse->row['prenom'];


if (isset($_POST['save']))        //si l'utilisateur veut conserver les cookies

{

setcookie("id", $maclasse->row['id'], time()+365*60*3600);

setcookie("prenom", $maclasse->row['prenom'], time()+365*60*3600);

setcookie("nom", $maclasse->row['nom'], time()+365*60*3600);

}

//On concatène le prénom et le nom de l'utilisateur pour le message d'accueil

$msg = "Bienvenue ".$_SESSION['prenom']." ".$_SESSION['nom'].".";

die("{success: true, msg:{reason:'".$msg."'}}");

}

}

}

?>

Remarque : Dans cet exemple, j’ai utilisé une classe de connexion spécifique à la base de données, mais tout fonctionnerait avec des connexions normales.


Voila les vérifications de connexions effectuées, si la connexion est réussie, on écrit en dur sur la page le message d’authentification réussie, qui sera lu par extJS.




********** Annexe **********


Voici quelques informations supplémentaires utiles dans les formulaires d’extJS

xtype : différents types de champs : checkbox, combo, datefield, field, fieldset, form,hidden, htmleditor, numberfield, radio, textarea, textfield, timefield, trigger.


allowBlank : true / false

minLength : nombre

maxLength : nombre

vtype: différentes vérification : 'alpha','alphanum','email','url'


Tutoriel écrit par Pierre Hoffmann

phoffmann@exia-cesi.com

http://cv.pierrehoffmann.free.fr

Le 05 juillet 2008

23 juin 2008 18:53:38 :
Modification de la mise en page
23 juin 2008 18:56:43 :
Modification de la mise en forme
23 juin 2008 18:59:18 :
Modification de la mise en forme
23 juin 2008 19:08:08 :
Modification de la mise en page
23 juin 2008 19:09:15 :
Modification de la mise en page.
05 juillet 2008 11:39:04 :
Ajout des variables de sessions. Ajout de la propriété "modal" afin de griser le fond.
31 juillet 2008 21:00:11 :
Ajout du lien vers les sources Modification de l'appel de la fonction Ajout de quelques propriétés (autoheight ...)
signaler à un administrateur
Commentaire de XtremDuke le 25/06/2008 13:35:27

Tu dois être au courant mais sais-tu qu'on pouvais mettre un tableau en Cookie ? Celà t'evites de devoir en créer une quinzaine (idem en PHP)

signaler à un administrateur
Commentaire de steekhein le 01/07/2008 20:06:10

Salut !
En tout cas  merci beaucoup pour ton tuto sur extJs ça fait des mois que j'observe ce framework mais la doc en français ne semble pas tres disponible, de plus exploiter la doc en anglais m'était très laborieux et là ton tuto me sort du gouffre je t'encourage à continuer et pourquoi pas poster également  ce tuto  sur extjs.com au profit de la communauté francophone.
bonne continuation !

signaler à un administrateur
Commentaire de adamo901 le 31/07/2008 01:31:28

Bravo et merci pour ton effort
Bonne chance et bon courage

PS: Ton CV sur le net est vraiment super extra!

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,031 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.