====== Shopalot Tutoriel Dojo Toolkit ====== [[http://dojotoolkit.org|{{3:reseaux_et_telecommunications:dojo.png}}]] Fichiers source: [[http://www.fritscher.ch/dojo/shopalot/shopalot.zip|shopalot.zip]] Version pdf: {{3:reseaux_et_telecommunications:tutorial_dojo_final.pdf|Tutorial dojo.pdf}} Démo: [[http://www.fritscher.ch/dojo/shopalot/shopalot.html|www.fritscher.ch/dojo/shopalot/shopalot.html]] [[http://www.fritscher.ch/dojo/shopalot/|shopalot]] ===== Introduction ===== ==== Prérequis ==== Pour pouvoir tester, modifier ou encore implémenter les concepts démontrés dans ce tutorial, il vous faut une installation serveur de type [[wpfr>LAMP]] ou un accès à un hébergement offrant PHP et MySQL 5. Il est également fortement recommandé de posséder des bonnes notions dans les langages de mise en forme utilisés pour la création de pages web comme: HTML et CSS. De plus, il est recommandé d’avoir des notions de base en JavaScript ainsi qu’en PHP. Nous avons choisi d’utiliser le PHP comme language de traitement côté serveur, car il est un des plus répandus sur la toile. Mais il est également possible d’en utiliser d’autres qui vous seront peut-être plus familiers. ==== Qu’est-ce qu’AJAX? ==== Un produit de nettoyage?, un club de football néerlandais? Non plus! Comme tout le monde en parle, voici ce que cela signifie vraiment. AJAX: Asynchronous JavaScript and XML D’après la signification de l’acronyme, vous remarquerez rapidement qu’AJAX n’est pas une technologie en soi, mais un «regroupement de technologies déjà existantes pour créer des applications web découplé client-serveur». (openweb.eu.org): * une présentation utilisant XHTML et CSS ; * la manipulation dynamique des pages à travers DOM; * la manipulation des données avec XML et XSLT ; * l'échange des données de manière asynchrone avec XMLHttpRequest ; * le tout étant assemblé avec du Javascript En 2005, le terme AJAX est employé et apparu sur la toile. Il s’est vite doté d’une bonne réputation et fait actuellement sa place comme méthode informatique de développement d’application Web. Cependant, ses composants sont plus anciens, par exemple, l’objet XMLHttpRequest est l’héritier d’un objet ActiveX développé par Microsoft et introduit dans Internet Explorer 5 en 1999. Il a été amélioré sous Internet Explorer 6 pour finalement devenir un standard quelques années plus tard dans les autres browsers comme FireFox, Safari, etc. ==== A quoi sert AJAX? ==== Voici la définition d’après le site openweb.eu.org: «Cette technologie permet de faire des requêtes HTTP afin de récupérer des données au format XML qui pourront être intégrées à un document». Cela peut être très utile pour mettre à jour des données sans pour autant recharger la page. En somme, AJAX va-t-il changer ma vie développeur? Certainement oui, mais sûrement l’expérience de navigation de l’internaute. AJAX augmente considérablement l’ergonomie ainsi que la facilité de la navigation des sites Internet. Il permet ainsi aux applications Web 2.0 de ressembler et d’être de plus en plus compétitives face aux applications qui fonctionnent sur des systèmes d’exploitation. Les avantages possibles: * Diminution importante de l’utilisation de la bande passante: seules les données dynamiques sont chargées et non plus tout le document; * Interactivité accrue: plus de rechargement de la page; * Rationalisation du code: des routines (de vérification par exemple) n'ont plus à être écrites et maintenues dans deux langages (côté client et côté serveur). * Diminution du nombre de pages dynamiques nécessaires pour effectuer une même ou un groupe d’actions. Les inconvénients possibles: * Ne fonctionne pas sans JavaScript, ni dans les navigateurs les plus anciens; * Ne fonctionne qu'avec HTTP: il est impossible de récupérer des données sur un disque local (ce qui est normal); * Peut gêner les habitudes des internautes, car certaines fonctionnalités considérées comme standard ne sont plus disponibles, à savoir: * Les marques-pages et liens vers la page; * L’enregistrement des pages; * Le bouton retour. ==== Comment fonctionne AJAX? (adaptivepath) ==== Commençons par expliquer le modèle d’une application Web classique. Le client informe le serveur quelle page il désire consulter, ce dernier fait ses calculs et la lui renvoie. Ensuite, l’utilisateur clique sur un nouveau lien ou effectue une nouvelle action, ce qui déclenche à nouveau une phase d’échanges entre le client et le serveur durant laquelle l’utilisateur doit attendre. Ces temps d’attentes (pendant lesquels l’information est traitée par le serveur) résultent de la communication synchrone entre le client et le serveur, ce qu’Ajax permet d’éviter. Voici un exemple concret pour être un peu plus explicite: {{3:reseaux_et_telecommunications:web_app_model.png?400|Le modèle classique d'application web (gauche) comparé au modèle AJAX (droite) [adaptivepath]}} //Le modèle classique d'application web (gauche) comparé au modèle AJAX (droite) [adaptivepath]// {{3:reseaux_et_telecommunications:web_app_model2..png?400|Le modèle synchrone des applications web classiques (haut) comparé au modèle asynchrone des applications AJAX (bas) [adaptivepath]}} //Le modèle synchrone des applications web classiques (haut) comparé au modèle asynchrone des applications AJAX (bas) [adaptivepath]// {{3:reseaux_et_telecommunications:ajax.png?400|Une vue plus détaillée d'une interaction Ajax [java.net]}} //Une vue plus détaillée d'une interaction Ajax [java.net]// Le déroulement d’une requête quelconque sous AJAX est plus compliqué du fait que la communication est asynchrone. Mais il permet de garantir à l’utilisateur une interactivité accrue, car il n’aura pas besoin d’attendre un rechargement de la page entière pour disposer des nouvelles informations qu’il attend. Une fois que la page est chargée avec ses composants JavaScript, une action de l’utilisateur va déclencher une communication en arrière-plan de la part du script JavaScript grâce à un objet XML avec le serveur. Il peut donc continuer à effectuer des actions sur la page. Dès que le serveur répond de nouveau par un objet XML le script le récupère, et va mettre à jour la partie de la page web qui est concernée par les nouvelles informations. ==== Utilité d’un toolkit JavaScript comme DOJO ==== Le toolkit DOJO est un cadriciel (framework) Open Source qui peut se résumer en un ensemble de bibliothèques qui a pour but de permettre le développement rapide d’applications Web abouties en JavaScript. Elle permet d’implémenter facilement de l’AJAX dans un site Web. Par ailleurs, elle se targue d’être un outil d’édition d’application Web professionnelle. Mais qui est derrière DOJO? Un peu de culture informatique générale... DOJO Foundation est une organisation à but non lucratif qui a pour but de promouvoir ses projets en Open Source. Leur philosophie se résume en quatre points: * Encourage adoption * Discourage political contention * Encourage collaboration and integration with other projects * Be transparent Elle est parrainée par Ibm corporation, Sun Microsystems, AOL, et bien d’autres encore. Cette fondation généreuse met à disposition son toolkit sous licence duale, à savoir Academic Free License v2.1 et BSD License. Ce qui vous autorise de l’utiliser, de créer des logiciels sans rétribuer de royalties à DOJO Fondation que ce soit de manière monétaire ou en développement du toolkit et finalement reconnaît l’entièreté de vos droits quant à la future application que vous allez créez grâce au toolkit DOJO. L’avantage d’utiliser un toolkit comme DOJO ( http://dojotoolkit.org ) est que le développeur peut profiter de libraires et templates préfabriqués. Cela permet de créer une application riche plus rapidement, sans devoir écrire tous les bouts de code de bas niveau qui sont nécessaires à la communication client-serveur, ou pour l’animation, ou le remplacement de balises HTML. ====== Les étapes du tutorial ====== {{3:reseaux_et_telecommunications:etapes.png|étapes}} Le but de ce tutorial est de créer un site rudimentaire d’e-commerce qui s’appellera //Shopalot//, en 5 étapes seulement! Pour cela, nous commencerons par l’affichage d’un simple //HelloWorld// que nous étendrons jusqu’à obtenir un site //e-shop// entièrement fonctionnel. Cependant, nous ne couvrons qu’une petite partie de tous les modules disponibles de l’énorme toolkit qu’est DOJO. Il vous restera donc beaucoup de choses à explorer par vous-même, l’important est de comprendre la base de développement sous AJAX. Si quelque chose ne vous paraît pas clair, il est toujours conseillé d’aller consulter l’API http://dojotoolkit.org/api/ ou directement la source des fichiers DOJO. ===== Etape 1: Hello World ===== ==== Mise en place ==== La première étape consiste à télécharger le toolkit Dojo (si ce n’est pas encore fait) http://dojotoolkit.org/download/ et de l’extraire dans le dossier de votre projet. Ensuite, créez un fichier //shopalot.html// dans le répertoire source de votre projet. Vous devriez avoir: / |--dojo/ <- les fichiers dojos décompressés |--shopalot.html En ayant construit la structure de base et téléchargé tous les fichiers nécessaires, nous allons enfin pouvoir commencer à concevoir //shopalot.html//. **Remarque préliminaire:** vous avez la possibilité de télécharger un fichier zip contenant tous les fichiers sources du tutorial [[http://www.fritscher.ch/dojo/shopalot/shopalot.zip|shopalot.zip]], ainsi que des éléments graphiques complémentaires utilisés par celui-ci. Donc, si vous ne préférez pas copier/coller le code de ce document et d’étendre votre propre fichier, il vous sera toujours indiqué quels sont les fichiers de référence de chaque étape du tutorial. Copiez/collez le code ci-dessous dans votre nouveau fichier //shopalot.html// ou servez vous du fichier //etape1.html// de nos sources. Il faut également récupérer le fichier //style.css// si vous voulez récupérer notre mise en page. Shopalot: We have everything you will ever need to buy Hello World

Hello World

Le résultat attendu de ce code devrait ressembler à ceci: {{3:reseaux_et_telecommunications:etape1.png?600|étape 1}} démo: [[http://www.fritscher.ch/dojo/shopalot/etape1.html|www.fritscher.ch/dojo/shopalot/etape1.html]] ==== Widget qu’est-ce que c’est? ==== Avant de regarder en détail le code JavaScript, observons d’abord les propriétés de la balise **
** de notre code. On voit qu’elle comporte un attribut //dojoType//, c’est ce que dojo appelle un //widget//, c'est-à-dire une balise qui, lors de l’exécution du code, sera remplacée par du code plus complexe avec une mise en page et une fonctionnalité avancée. Pour savoir quels sont les paramètres de ce //widget// (s’il n’est pas encore documenté), le plus simple c’est de le retrouver dans l’API. Par exemple pour notre //widget// de type //dialog// on trouve: // focusElement: String // provide a focusable element or element id if you need to // work around FF's tendency to send focus into outer space on hide focusElement: "", // bgColor: String // color of viewport when displaying a dialog bgColor: "black", // bgOpacity: Number // opacity (0~1) of viewport color (see bgColor attribute) bgOpacity: 0.4, // followScroll: Boolean // if true, readjusts the dialog (and dialog background) when the user moves the scrollbar followScroll: true, // closeOnBackgroundClick: Boolean // clicking anywhere on the background will close the dialog closeOnBackgroundClick: false, Revenons au code JavaScript: Avant de pouvoir utiliser DOJO, il faut charger le script principal du toolkit, c’est ce que fait la première balise ** La première chose que nous allons faire est de rendre mobiles les différents produits que nous ajoutons à la liste //catalog// dans //updateCatalotog//. Pour cela, ajoutez ce bout de code après //catalog.appendChild(newLi)//. //make the item draggable var dnd = new dojo.dnd.HtmlDragCopySource(newLi, "*", true); //add a tooltip to the item var toolTip = dojo.widget.createWidget("Tooltip", {caption:data[i].description,connectId:data[i].id,showDelay:100}); document.body.appendChild(toolTip.domNode); D’une part, nous rendons le nouvel objet créé déplaçable de catégorie * car nous pouvons isoler les différents objets déplaçables dans des catégories (ce que nous n’utilisons pas), et spécifions qu’il ne peut y avoir de copie de l’élément (sans importance dans note cas vu que nous détruisons l’objet une fois qu’il est lâché sur le caddy). D’autre part, nous profitons d’ajouter une bulle d’aide affichant la description du produit. Ceci surtout pour montrer la capacité de DOJO à créer des //widgets// en code aussi bien qu’en HTML. Maintenant que les produits sont déplaçables, il faut encore que nous puissions les déposer dans l’image du caddy. Dans notre fonction //init(e)//, il faut encore y ajouter ces lignes de code. //drag & drop: drop target var cart = dojo.byId("cart"); var target = new dojo.dnd.HtmlDropTarget(cart, ["*"]); //redefine onDrop function of our target target.onDrop = function(e){ //desactivate drag object this.onDragOut(e); var id = e.dragSource.dragObject.id; addItemToCart(id); }; Nous créons un objet DOJO //DropTarget// avec //cart// qui est le nom de l'image du caddy que nous avons ajouté juste auparavant. Mais vu que nous ne souhaitions pas utiliser l’action par défaut, lorsqu’un produit est lâché dessus, nous redéfinissons la fonction //onDrop// pour qu’elle récupère l'id de l'élément lâché et le transmette à note fonction //addItemToCart//. ==== Communication ==== Voici notre dernière fonction pour que le puzzle soit au complet. function addItemToCart(itemId) { var bindArgs = { url: "getitems.php", handler: function(type, data, evt){ var total = dojo.byId("total"); if (data) { //update total total.innerHTML = (parseFloat(data.price) + parseFloat(total.innerHTML)).toFixed(2); //create new item from the data var newLi = document.createElement("li"); newLi.innerHTML = dojo.string.summary(data.name,15); var cartList = dojo.byId("cartList"); //keep the list small if(cartList.getElementsByTagName("li").length >=5){ dojo.dom.removeNode(cartList.firstChild); } //add item to the list cartList.appendChild(newLi); } }, mimetype: "text/json", content: {"action":"additem","itemid":itemId} }; //make the connection dojo.io.bind(bindArgs); } Avant d’expliquer ce que fait cette fonction, il faut rapidement introduire deux fonctions supplémentaires que propose note script //getitems.php//. Si on l’appelle avec comme paramètre //action// et valeur //additem//, celui-ci attend un deuxième paramètre //itemid// qui aura comme valeur le nom du produit à ajouter au caddy. Il cherchera ce produit dans la base de données, l’ajoute dans le caddy (au niveau de la session PHP) et ensuite répond avec les informations sur l’objet en question. (C’est ici que l’on pourrait améliorer le tutorial et par exemple directement retourner le caddy que l’on réaffichera). La deuxième fonction à expliquer et que si nous appelons le script sans paramètre, celui-ci nous retourne une liste en HTML avec le contenu du caddy. Pour utiliser cette option, nous devons ajouter cette ligne dans notre page //form.html//
 
Pour ce qui est de la fonction //addItemToCart// l’explication est quasi identique à celle de la fonction //getItems//. La différence majeure est au niveau de l’attribut //handler// qui ne contient pas un nom d’une fonction à exécuter, mais directement la fonction. Celle-ci met à jour le total, ainsi que la liste des cinq derniers produits ajoutés. Nous pouvons voir, qu’en plus des fonctions d’aide DOM, DOJO propose aussi des fonctions d’aide pour la manipulation de texte (String) comme //dojo.string.summary// qui nous aide à limiter le nombre de caractères à 15 maximum. Voici le résultat final de notre shop! {{3:reseaux_et_telecommunications:etape5a.png?600|étape 5}} {{3:reseaux_et_telecommunications:etape5b.png?600|étape 5}} Démo: [[http://www.fritscher.ch/dojo/shopalot/shopalot.html|http://www.fritscher.ch/dojo/shopalot/shopalot.html]] ====== Conclusion ====== Maintenant c’est à vous d’aller plus loin en vous aidant de l’API et du manuel. Tous les exemples disponibles dans les répertoires //demos// et //test// du toolkit peuvent être une grande source d’inspiration! Pour quelques pistes supplémentaires, allez voir par exemple dans le manuel la section création de vos propres //widgets//, ou encore essayez d’ajouter des fonctions supplémentaires à notre application, comme par exemple des catégories pour les produits, un historique de commandes, gestion de stock, etc. N’oubliez pas que la manière la plus simple d’apprendre est d’essayer! ====== Ressources ====== * Le tookit Dojo http://dojotoolkit.org * L’API http://dojotoolkit.org/api/ * Manuel http://manual.dojotoolkit.org/WikiHome/DojoDotBook * Navigateur firefox http://www.mozilla.com/firefox/ * Extension firefox pour debugger facilement http://getfirebug.com/ * IDE eclipse http://www.eclipse.org/ * Addon AJAX Toolkit Framework pour eclipse http://www.eclipse.org/atf/ ====== Références ====== * (openweb.eu.org) http://openweb.eu.org/articles/objet_xmlhttprequest/ * (java.net) https://d2.dev.java.net/doc/introduction.html * (adaptivepath) http://www.adaptivepath.com/publications/essays/archives/000385.php * http://dojo.jot.com/Tutorials/HelloWorld * http://today.java.net/pub/a/today/2006/04/27/building-ajax-with-dojo-and-json.html * Source des images : http://www.leshop.ch/, http://www.thinkgeek.com, http://www.amazon.com