<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5471968564169463653</id><updated>2011-12-27T10:34:43.707+01:00</updated><category term='iPhone  Bouygues Telecom'/><title type='text'>Leny online</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-6910023765037180153</id><published>2010-11-24T02:33:00.000+01:00</published><updated>2010-11-24T02:33:02.784+01:00</updated><title type='text'>Nouveau blog</title><content type='html'>Bonjour,&lt;br /&gt;Enfin, j'ai passé pas mal de temps sur le développement de mon nouveau site internet, il est désormais accessible &lt;a href="http://www.leny-bernard.com/"&gt;içi&lt;/a&gt; : &lt;a href="http://www.leny-bernard.com/"&gt;http://www.leny-bernard.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je ne posterais désormais plus de contenu içi mais sur le nouveau site.&lt;br /&gt;Au programme donc développement Symfony (bien sur), mais aussi développement iPad, GWT, jQuery etc.&lt;br /&gt;à Bientôt !&lt;br /&gt;Leny&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-6910023765037180153?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/6910023765037180153/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/11/nouveau-blog.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6910023765037180153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6910023765037180153'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/11/nouveau-blog.html' title='Nouveau blog'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-9030250845474468672</id><published>2010-11-12T05:42:00.000+01:00</published><updated>2010-11-12T05:43:59.230+01:00</updated><title type='text'>Lancement de mon nouveau blog imminent</title><content type='html'>&lt;span class="Apple-style-span" style="color: #990000;"&gt;ANNONCE OFFICIELLE :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="background-color: red;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;Ce blog va bientôt être obsolète !&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="background-color: red;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;Cependant, pas de panique !&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;L'adresse de mon nouveau blog sera dévoilée dans les prochains jours...&lt;br /&gt;&lt;br /&gt;Au programme :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;plus de tutoriels&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;plus d'articles&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;mes flux de partage rassemblés&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;mon CV&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;mes portfolios&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #073763;"&gt;un contact amélioré&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;A bientôt.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;Leny&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-9030250845474468672?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/9030250845474468672/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/11/lancement-de-mon-nouveau-blog-imminent.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9030250845474468672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9030250845474468672'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/11/lancement-de-mon-nouveau-blog-imminent.html' title='Lancement de mon nouveau blog imminent'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4660213037268726129</id><published>2010-11-04T13:21:00.001+01:00</published><updated>2010-11-04T13:21:19.387+01:00</updated><title type='text'>[COCOA] Tutoriels vidéo pour bien commencer</title><content type='html'>&lt;a href="http://tutorialsblogs.com/objective-c-programming-tutorial-65-videos-series/"&gt;http://tutorialsblogs.com/objective-c-programming-tutorial-65-videos-series/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4660213037268726129?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4660213037268726129/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/11/cocoa-tutoriels-video-pour-bien.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4660213037268726129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4660213037268726129'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/11/cocoa-tutoriels-video-pour-bien.html' title='[COCOA] Tutoriels vidéo pour bien commencer'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3285934860657368610</id><published>2010-11-03T23:51:00.000+01:00</published><updated>2010-11-04T00:25:03.246+01:00</updated><title type='text'>[SYMFONY] embedforms, embedi18n</title><content type='html'>Voici une petite fiche récap sur les formulaires imbriqués en symfony ainsi qu'un petit lien particulier pour ajouter des embedforms à la volée.&lt;br /&gt;&lt;b style="color: #990000;"&gt; &lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b style="color: #990000;"&gt;Définition et exemple basique d'application&lt;/b&gt;&lt;b style="color: #990000;"&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="color: #990000;"&gt;Personnalisation de l'affichage&lt;/b&gt;&lt;b style="color: #990000;"&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b style="color: #990000;"&gt;Formulaires de traduction i18n&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #990000;"&gt;Les formulaires embarqués ajoutés à la volée&lt;/span&gt;&lt;/b&gt;&lt;b style="color: #990000;"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;b style="color: #990000;"&gt;Définition et exemple basique d'application :&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;Un &lt;span style="color: #b45f06;"&gt;embedForm&lt;/span&gt; est un formulaire embarqué dans un autre formulaire. C'est très utile et par conséquent très utilisé dans symfony. Voici un exemple d'application :&lt;br /&gt;&lt;br /&gt;Si vous avez besoin d'utilisateurs, vous avez du installer le plugin sfDoctrineGuardPlugin. Peu importe qu'est ce que vous utilisez pour gérer vos utilisateurs, le schéma de données est le même. Pour peu que l'on veuille agrémenter nos utilisateurs d'un avatar, leur souhaiter leur anniversaire, savoir leur genre (sexe), il va falloir rajouter des champs.&lt;br /&gt;Ainsi on a 2 possibilités,&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;soit on modifie le schéma du plugin, mais c'est dommage car du coup, il va falloir le faire pour chaque nouveau site ou l'on aura besoin de faire ça.&lt;/li&gt;&lt;li&gt;soit, on modifie le schéma général en y ajoutant une table que l'on peut appeler Profile par exemple. On définit cette table avec les champs désirés (avatar, gender, birth_date, etc) et on définit une relation "one to one" avec la table définissant les utilisateurs. &lt;span style="color: #999999; font-size: x-small;"&gt;(On peut même aller plus loin dans la portabilité du code en créant directement un plugin personnel de gestion des profils; ainsi en 2 lignes de commandes, c'est gagné pour les nouveaux sites)&lt;/span&gt;&amp;nbsp; &lt;/li&gt;&lt;/ul&gt;On aura, en clair et dans le plus simple des cas, une table sfGuardUser et une table Profile&lt;br /&gt;&lt;br /&gt;Donc, voici le nouveau schéma.yml pour la table Profile&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TNHd_X_2y0I/AAAAAAAABCo/-AJ7nAy9zuI/s1600/schema.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TNHd_X_2y0I/AAAAAAAABCo/-AJ7nAy9zuI/s400/schema.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bon, première étape finit, mais pour l'instant, on a juste 2 modèles, reliés certes, mais qui définissent chacun 2 formulaires différents.&lt;br /&gt;Il va falloir embarquer le formulaire d'utilisateur dans le formulaire profile &lt;span style="font-size: x-small;"&gt;&lt;span style="color: #999999;"&gt;(toujours dans un soucis de portabilité du code et dans l'optique de création d'un plugin, c'est du moins ma vision)&lt;/span&gt;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;Symfony permet de gérer facilement les formulaires embarqués. Il suffit de modifier la méthode configure du formulaire Profile et d'y ajouter ces lignes :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TNHfXEZGPiI/AAAAAAAABCs/jRCgeMTlCGc/s1600/Capture-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TNHfXEZGPiI/AAAAAAAABCs/jRCgeMTlCGc/s1600/Capture-4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;J'explique brievement mon code qui je pense est assez explicite :&lt;br /&gt;Ici, je configure mon formulaire de profile. J'instancie un formulaire de la classe sfGuardRegisterForm et je lui passe l'utilisateur relié au profile grâce au schéma.&lt;br /&gt;&lt;br /&gt;Ainsi, si j'affiche $form, j'aurais les 2 formulaires imbriqués, ne faisant qu'un seul et même formulaire pour l'utilisateur.&lt;br /&gt;&lt;br /&gt;Je vous ai montré aussi comment on peut modifier de la même façon qu'un formulaire normal un formulaire embarqué, par exemple les labels.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; 2. &lt;b style="color: #990000;"&gt;Personnalisation de l'affichage&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;L'exemple précédent ne me convient pas totalement, si vous l'avez testé chez vous, vous savez probablement de quoi je parle, l'affichage n'est pas correct.&lt;br /&gt;&lt;br /&gt;Premièrement je veux mixer totalement les 2 formulaires. Pour l'instant ca m'affiche les 2 formulaires dans un même tableau, cependant,le formulaire sfGuardRegisterForm est affiché avec un label : "Utilisateur :"; ce qui décale les champs d'une colonne. Ce n'est pas ce que je veux. Aussi, je peux modifier l'affichage en allant modifier le fichier correspondant, soit _form.php et au lieu d'afficher $form simplement, on va afficher séparément les éléments.&lt;br /&gt;&lt;br /&gt;Ca donne ca :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TNHj3HnaRKI/AAAAAAAABCw/U3zTFkDcrt0/s1600/Capture-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TNHj3HnaRKI/AAAAAAAABCw/U3zTFkDcrt0/s640/Capture-5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ca nous affiche correctement le formulaire désiré, parfait.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. &lt;b style="color: #990000;"&gt;Formulaires de traduction i18n&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Parfois, vous aurez à faire de la traduction de contenu, par exemple, si vous faites un blog pour plusieurs langues, vous allez créer le modèle Article et vous allez le configurer comme ci-dessous afin qu'il soit traductible dans les langues spécifiées.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TNHlfoqawyI/AAAAAAAABC0/_g4ZLewdBkI/s1600/Capture-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TNHlfoqawyI/AAAAAAAABC0/_g4ZLewdBkI/s400/Capture-6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Un petit build --all créé comme à son habitude les classes de formulaire et de modèle. Ainsi si on va voir dans le dossier lib, on peut voir la classe ArticleTranslationForm.class.php&lt;br /&gt;&lt;br /&gt;On n'y touche pas, le but du sujet est juste de savoir comment l'afficher, on va droit au but, dans la méthode configure du formulaire, on va insérer nos formulaire de traduction comme suit :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TNHmcvKVUOI/AAAAAAAABC4/ia3a28vngSQ/s1600/Capture-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TNHmcvKVUOI/AAAAAAAABC4/ia3a28vngSQ/s1600/Capture-7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ca affichera ainsi, dans le formulaire de création d'article, les deux formulaires de traduction, c'est aussi simple que ça mais quand on ne sait pas, on ne peut pas l'inventer ;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; 4. &lt;b&gt;&lt;span style="color: #990000;"&gt;Les formulaires embarqués jaoutés à la volée &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1401663980"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.nacho-martin.com/dynamic-embedded-forms-in-symfony"&gt;http://www.nacho-martin.com/dynamic-embedded-forms-in-symfony&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3285934860657368610?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3285934860657368610/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/11/symfony-embedforms.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3285934860657368610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3285934860657368610'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/11/symfony-embedforms.html' title='[SYMFONY] embedforms, embedi18n'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y2fyEhOegYQ/TNHd_X_2y0I/AAAAAAAABCo/-AJ7nAy9zuI/s72-c/schema.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-9011971518712861046</id><published>2010-11-03T16:20:00.000+01:00</published><updated>2010-11-03T16:20:23.589+01:00</updated><title type='text'>Site d'un blog technique intéressant : élao</title><content type='html'>Des articles très intéressants, touchant à ce que j'aime, symfony, linux, applications iphone et ipad ! J'aime&lt;br /&gt;&lt;a href="http://www.elao.org/"&gt;http://www.elao.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-9011971518712861046?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/9011971518712861046/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/11/site-dun-blog-technique-interessant.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9011971518712861046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9011971518712861046'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/11/site-dun-blog-technique-interessant.html' title='Site d&apos;un blog technique intéressant : élao'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7919461486127179046</id><published>2010-11-01T01:01:00.000+01:00</published><updated>2010-11-01T01:18:21.537+01:00</updated><title type='text'>[SYMFONY] SQLSTATE[42s22] Erreur 1054 = SOLUTION</title><content type='html'>Bonjour,&lt;br /&gt;Si vous tombez sur ce message, c'est probablement qu'il vous est arrivé cette erreur :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TM3_PAXo2gI/AAAAAAAABCU/Le8xWizmhLI/s1600/Capture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="55" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TM3_PAXo2gI/AAAAAAAABCU/Le8xWizmhLI/s400/Capture.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;J'ai pour ma part eu ce problème et j'ai réussi à m'en sortir malgré le fait que je ne comprenne pas vraiment la base du problème. Aussi, ne maitrisant pas cette erreur, je ne vous donne pas la solution mais UNE solution qui a fonctionné pour moi mais qui ne fonctionnera peut être pas chez vous.&lt;br /&gt;&lt;br /&gt;Voici mon contexte :&lt;br /&gt;&lt;br /&gt;J'utilise :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Linux Ubuntu 10.10&lt;/li&gt;&lt;li&gt;PHP 5.3&lt;/li&gt;&lt;li&gt;Apache 2&lt;/li&gt;&lt;li&gt;Mozilla Firefox &amp;amp; Google Chrome&lt;/li&gt;&lt;li&gt;Doctrine&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Jusqu'içi, rien d'étonnant. Le problème surgit lorsque je créé des tables i18n, c'est à dire lorsque je fais ce type de schema.yml&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;actAs:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;I18n:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;fields: [title]&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;L'erreur n'arrive pas toujours. Très étonnant, parfois, sur la même application, pour 2 pages quasiment similaires, l'une déclenche l'erreur et l'autre non.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;C'est à rendre fou !&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;J'ai remarqué que cela plantait sur des requêtes tapant sur des tables traduites. C'est comme si Doctrine ne faisait pas la jointure et ne trouvait pas la traduction. J'ai trouvé par hasard un moyen pour "colmater" la brêche, le voici :&lt;br /&gt;&lt;br /&gt;Il m'est parfois apparu cette erreur sur une requête ou j'écrivais le nom du modèle en minuscule.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/TM4Dar4cliI/AAAAAAAABCk/uAlpaJ_mwTE/s1600/Capture-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="15" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TM4Dar4cliI/AAAAAAAABCk/uAlpaJ_mwTE/s400/Capture-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;J'ai du modifier le nom de modèle en insérant une majuscule en première lettre comme ceci.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TM4DTTbmZKI/AAAAAAAABCc/tKCI_0iZAmA/s1600/Capture-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="15" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TM4DTTbmZKI/AAAAAAAABCc/tKCI_0iZAmA/s400/Capture-2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;J'ai eu le problème inverse, ayant mis le nom de la classe avec la première lettre en majuscule, j'ai du mettre tout en minuscule. Je ne comprends pas forcément de quoi ca peut venir et surtout si vous pensez savoir, dites le moi, j'aimerais beaucoup comprendre cette histoire là.&lt;br /&gt;En tout cas, ca fonctionne pour moi, j'espère que ca fonctionnera pour vous aussi.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7919461486127179046?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7919461486127179046/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfonyerreur-1054-sqlstate42s22-erreur.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7919461486127179046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7919461486127179046'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfonyerreur-1054-sqlstate42s22-erreur.html' title='[SYMFONY] SQLSTATE[42s22] Erreur 1054 = SOLUTION'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y2fyEhOegYQ/TM3_PAXo2gI/AAAAAAAABCU/Le8xWizmhLI/s72-c/Capture.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2395634977002704602</id><published>2010-10-18T16:37:00.001+02:00</published><updated>2010-11-03T14:55:22.862+01:00</updated><title type='text'>[COCOA] Un bon petit site de tuto de gestion de database iphone :</title><content type='html'>&lt;a href="http://blancer.com/tutorials/i-phone/76993/sqlite-tutorial-adding-data/"&gt;http://blancer.com/tutorials/i-phone/76993/sqlite-tutorial-adding-data/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2395634977002704602?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2395634977002704602/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/10/un-bon-petit-site-de-tuto-iphone.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2395634977002704602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2395634977002704602'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/10/un-bon-petit-site-de-tuto-iphone.html' title='[COCOA] Un bon petit site de tuto de gestion de database iphone :'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3420811751633622001</id><published>2010-10-06T16:40:00.000+02:00</published><updated>2010-10-06T16:40:07.855+02:00</updated><title type='text'>[SYMFONY] Envoyer des emails</title><content type='html'>Petit article juste pour présenter les emails dans Symfony, j'ai pu lire beaucoup de choses, bien et moins bien sur les email dans Symfony, voilà ce que j'en ai retenu :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SWIFTMAILER est intégré à Symfony depuis sf 1.3&lt;/li&gt;&lt;li&gt;Pour créer un email, il faut d'abord instancier un mailer, cela se fait avec cette commande :&lt;br /&gt;&lt;br /&gt;$mailer = sfContext::getInstance()-&amp;gt;getMailer();&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pour construire l'email, on utilise la méthode compose() du mailer&lt;br /&gt;&lt;br /&gt;$message = $this-&amp;gt;getMailer()-&amp;gt;compose('email@destination.com, 'email@source.com', 'mon OBJET', 'mon contenu');&lt;br /&gt;&lt;br /&gt;On peut aussi faire des beaux emails en utilisant des vues de symfony en utilisant la méthode setBody() du message&lt;br /&gt;&lt;br /&gt;$message-&amp;gt;setBody($this-&amp;gt;getPartial('myPartialView',array("variable1"=&amp;gt;"1")), 'text/html');&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pour envoyer ce message, on utilise la méthode send() du mailer en lui passant en paramètres le message, l'email destinataire, l'email de réponse&lt;br /&gt;&lt;br /&gt;$mailer-&amp;gt;send($message, $emailTarget, $emailReply);&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Pour plus d'informations sur les emails avec Symfony comme par exemple la configuration des envois de mail, le mode de distribution, d'envoi etc, n'hésitez pas à aller voir le livre de Symfony &lt;a href="http://www.symfony-project.org/more-with-symfony/1_4/fr/04-Emails"&gt;"The more with Symfony, page 4"&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3420811751633622001?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3420811751633622001/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfony-envoyer-des-emails.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3420811751633622001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3420811751633622001'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfony-envoyer-des-emails.html' title='[SYMFONY] Envoyer des emails'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4997177806289615561</id><published>2010-10-06T16:18:00.000+02:00</published><updated>2010-10-06T16:18:19.482+02:00</updated><title type='text'>[SYMFONY][JQuery] Gérer ses formulaires en Ajax, validation soumission, etc !</title><content type='html'>Bonjour,&lt;br /&gt;&lt;br /&gt;Bonne nouvelle : Cet article est très utile :)&lt;br /&gt;Il va nous permettre de traiter un formulaire à la volée et de récupérer les erreurs qu'un mauvais remplissage pourrait renvoyer.&lt;br /&gt;&lt;br /&gt;Imaginons que l'on veuille ajouter un commentaire à un article de blog.&lt;br /&gt;On affiche notre article puis en dessous, on affiche un lien pour commenter l'article.&lt;br /&gt;Le formulaire de commentaire doit connaitre implicitement le sujet à commenter.&lt;br /&gt;Aussi, il faudra :&lt;br /&gt;&lt;br /&gt;1.&lt;span style="color: #073763;"&gt; modifier le formulaire de commentaire pour passer l'id de l'article en douce &lt;/span&gt;(grâce au widget sfWidgetFormInputHidden&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orange;"&gt;/lib/form/Doctrine/CommentForm.php&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;public function configure()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;widgetSchema['model'] = new sfWidgetFormInputHidden();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;getWidgetSchema()-&amp;gt;setLabels(array(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'author'=&amp;gt; "Pseudo :",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'content'=&amp;gt; "Message :",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ));&lt;br /&gt;&amp;nbsp; }&lt;/blockquote&gt;&amp;nbsp;2. &lt;span style="color: #073763;"&gt;passer l'id de l'article lorsqu'on charge le formulaire&lt;/span&gt;&lt;br /&gt;On peut soit afficher le formulaire dès le chargement de la page, soit en Ajax, faisons le en Ajax, ce serait trop facile ;)&lt;br /&gt;&lt;br /&gt;On va donc utiliser JQuery. Installons déjà le plugin &lt;a href="http://www.symfony-project.org/plugins/sfJqueryReloadedPlugin"&gt;sfJqueryReloadedPlugin&lt;/a&gt;&lt;br /&gt;Une fois que c'est fait et que l'on a bien inclut le helper jQuery, on peut se créer dans un fichier js que l'on va inclure (je vous fait confiance là dessus) une fonction qui sera déclenchée lors du clic sur le bouton commenter.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orange;"&gt;/app/frontend/blog/show/myArticle&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;div&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;h1&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;?php echo $article-&amp;gt;getTitle(); ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/h1&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;p&amp;gt;&amp;lt;?php echo $article-&amp;gt;getContent(); ?&amp;gt;&amp;lt;/p&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;input type="button" value="Commenter" onclick="comment(&amp;lt;?php echo $article-&amp;gt;getId(); ?&amp;gt;)"/&amp;gt;&amp;nbsp;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;div id="commentForm"&amp;gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;/web/js/main.js&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;function comment(arg){&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;$.post("/comment/new",&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{id: arg},&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;function(data)&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$("#commentForm").html(data);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$("#commentForm").slideToggle();&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;});&lt;/blockquote&gt;&lt;blockquote&gt;}&lt;/blockquote&gt;&lt;/blockquote&gt;Jusque là, on est pas trop désorienté, c'est juste la facon de charger le formulaire de commentaire.&lt;br /&gt;Il faut donc maintenant créer l'action comment dans le module blog :&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: orange;"&gt;/app/frontend/modules/comment/actions/actions.php&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: orange;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;blockquote&gt;public function executeComment(sfWebRequest $request) {&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$comment = new Comment();&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$comment-&amp;gt;setArticleId($request-&amp;gt;getParameter("id"));&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$this-&amp;gt;form = new CommentForm($comment);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/blockquote&gt;&lt;/blockquote&gt;Vous l'avez surement compris, dans le code précédent, on créé un objet commentaire pour pré-remplir avec l'id de l'article. &amp;nbsp;On charge ensuite commentSuccess.php. Crééz le comme vous voulez, je vais personnelement aller au plus simple pour bien montrer la facilité du processus.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;/app/frontend/modules/comment/templates/newSuccess.php&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;?php use_helper('jQuery'); ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;?php echo jq_form_remote_tag(array(&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'update' &amp;nbsp; =&amp;gt; 'commentForm', /* représente l'id de la div que l'on doit mettre à jour */&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'url' &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; 'comment/'.($form-&amp;gt;getObject()-&amp;gt;isNew() ? 'create' : 'update'),&lt;/blockquote&gt;&lt;blockquote&gt;)); ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;?php echo $form; ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;input type="submit" value="Commenter"/&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;/form&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;On réinclut le helper de jQuery. Pourquoi ? car sinon, la vue, isolée car chargée en ajax est incapable de trouver la fonction jq_form_remote_tag.&lt;br /&gt;On passe 2 paramètre à cette fonction : url, qui désigne l'action que va éffectuer le formulaire et update qui définit dans quel id de la page l'action ajax va afficher la réponse. Içi, dans la div d'id commentForm.&lt;br /&gt;&lt;br /&gt;Désormais, il faut dire quel vue on va afficher lorsque cela sera validé. Le formulaire, une fois validé et enregistré raffiche le formulaire pour l'éditer, fonctionnement par défaut mais qui ne nous convient pas. On peut pour changer cela en ajoutant un test dans la template newSuccess.php.&lt;br /&gt;Grâce à l'attribut $form-&amp;gt;getObject()-&amp;gt;isNew() des formulaires, on peut en déduire le comportement que l'on doit adopter, soit afficher le formulaire (comportement 1) soit afficher le commentaire (comportement 2).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;/app/frontend/modules/comment/templates/newSuccess.php&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;?php if($form-&amp;gt;getObject()-&amp;gt;isNew()){?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;h3&amp;gt;&amp;lt;?php echo __("Ajout d'un commentaire :");?&amp;gt;&amp;lt;/h3&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;?php include_partial('form', array('form' =&amp;gt; $form)) ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;?php }else{&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;include_partial("show",array("comment"=&amp;gt;$comment));&lt;/blockquote&gt;&lt;blockquote&gt;}?&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Voilà qui est fait. Maintenant. Le formulaire est en Ajax, s'il y a des erreurs dans le remplissage du formulaire, les erreurs seront affichées puis lorsque cela sera valide, le nouveau commentaire sera affiché comme les autres commentaires grâce au fichier _show.php que vous aurez créé selon votre envie de mise en forme des commentaires.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4997177806289615561?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4997177806289615561/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfonyjquery-gerer-ses-formulaires-en.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4997177806289615561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4997177806289615561'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/10/symfonyjquery-gerer-ses-formulaires-en.html' title='[SYMFONY][JQuery] Gérer ses formulaires en Ajax, validation soumission, etc !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-6399999270790126915</id><published>2010-09-29T04:04:00.000+02:00</published><updated>2010-09-29T04:04:04.931+02:00</updated><title type='text'>Le ShowCase de Google</title><content type='html'>Ceci est le showcase de l'API Ajax de Google... elle regroupe beaucoup plus que du simple Ajax, elle intègre de la traduction grâce au moteur de google translate, gmaps, gearth, blogger, des graphiques, etc etc.&lt;br /&gt;&lt;br /&gt;Intégrable facilement sur n'importe quel site, faites vous plaisir, il suffit de cliquer sur l'exemple voulut puis de choisir ViewDocs en haut à droite.&lt;br /&gt;On peut même et ca c'est pas mal, changer le code de la vue du haut puis de générer le résultat en bas.&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/apis/ajax/playground/"&gt;http://code.google.com/apis/ajax/playground/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-6399999270790126915?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/6399999270790126915/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/le-showcase-de-google.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6399999270790126915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6399999270790126915'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/le-showcase-de-google.html' title='Le ShowCase de Google'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-5828958953706908257</id><published>2010-09-18T00:10:00.000+02:00</published><updated>2010-09-18T00:10:21.599+02:00</updated><title type='text'>[GWT] Problème de relève d'évenement</title><content type='html'>En GWT, pour relever des évenements, on utilise des handlers.&lt;br /&gt;Parfois, comme dans la classe Slider de GXT &lt;span class="Apple-style-span" style="color: purple;"&gt;com.extjs.gxt.ui.client.widget.Slider, &lt;/span&gt;des méthodes éxistent déjà pour déclencher des actions lors d'un évenement particulier.&lt;br /&gt;&lt;br /&gt;Déclenchons par exemple un évenement au clic sur notre slider.&lt;br /&gt;Si on instancie un slider, l'auto completion d'Eclipse ne nous montre que les méthodes publiques. Or si on regarde dans la doc, il existe un bon nombre de méthodes permettant de faire ca : la méthode OnClick par exemple.&lt;br /&gt;&lt;br /&gt;Mais comment l'obtenir ? Je me suis prit la tête pendant une après midi pour voir que ces méthodes sont protected... Des méthodes ?? Protected ?? mais pourquoi ? Et bien j'imagine que vu que c'est destiné à être des scripts JavaScript, cela ne doit être fait qu'une fois, lors de son instanciation... à vérifier, n'hésitez pas à me dire si vous avez une meilleure explication.&lt;br /&gt;&lt;br /&gt;En tout cas, vous l'avez compris, ce n'est pas perdu, elles sont là et on peut les utiliser.&lt;br /&gt;Au lieu d'instancier un slider "normalement", en utilisant le constructeur normal :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/TJPlXWfsxkI/AAAAAAAABAk/s2kMRvRW7xY/s1600/Capture-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TJPlXWfsxkI/AAAAAAAABAk/s2kMRvRW7xY/s320/Capture-4.png" /&gt;&lt;/a&gt;&lt;/div&gt;On peut l'instancier et surcharger les méthodes que l'on veut utiliser.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TJPlZkeuKOI/AAAAAAAABAs/I7r19VInO0c/s1600/Capture-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TJPlZkeuKOI/AAAAAAAABAs/I7r19VInO0c/s320/Capture-5.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-5828958953706908257?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/5828958953706908257/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-probleme-de-releve-devenement.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5828958953706908257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5828958953706908257'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-probleme-de-releve-devenement.html' title='[GWT] Problème de relève d&apos;évenement'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y2fyEhOegYQ/TJPlXWfsxkI/AAAAAAAABAk/s2kMRvRW7xY/s72-c/Capture-4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-8277108593032094450</id><published>2010-09-16T05:48:00.000+02:00</published><updated>2010-09-21T03:06:42.504+02:00</updated><title type='text'>[OBJC] Découverte de l'Objective C / 31 jours = 31 applis, on va tenter de garder le rythme !</title><content type='html'>Je me suis mis au developpement iPhone depuis quelques jours.&lt;br /&gt;Pour se faire, j'ai installé un vm Mac OS X 10.6.2 puis j'ai installé XCode.&lt;br /&gt;Ensuite j'ai joué avec et j'ai trouvé ça très marrant.&lt;br /&gt;J'ai ensuite eu la chance d'obtenir un bouquin sur le Cocoa.&lt;br /&gt;Ca explique le fonctionnement et les analogies entre l'objective C et le Java que je connais mieux.&lt;br /&gt;&lt;br /&gt;Une fois les bases assimilées, le code objective C m'est apparu plus clair.&lt;br /&gt;Je me suis ensuite lancé dans la création d'un TP personnel : une calculatrice.&lt;br /&gt;&lt;br /&gt;Plutot que de refaire le tuto, je vous conseille de suivre celui-ci que j'ai trouvé très complet. J'ai laissé un commentaire sur son site pour lui proposer une amélioration au niveau de son code. Ceci dit, vous pouvez suivre son tuto les yeux fermés, ca marchera :)&lt;br /&gt;&lt;br /&gt;Voilà ma calculatrice si ca peut vous motiver :)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TJgFFFKhYEI/AAAAAAAABA0/LFiJ9ET5D00/s1600/calculatrice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TJgFFFKhYEI/AAAAAAAABA0/LFiJ9ET5D00/s640/calculatrice.png" width="396" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Je vous conseille ce site, très bien écrit et assez récent (par rapport à aujourd'hui) &lt;br /&gt;&lt;a href="http://www.tutomobile.fr/faire-une-application-calculette-tutoriel-iphone-n%C2%B04/06/08/2010/"&gt;TUTO CALCULATRICE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Faites vous plaisir.&lt;br /&gt;&lt;a href="http://www.webresourcesdepot.com/iphone-application-and-website-development-all-tools-and-tutorials-you-need/"&gt;autre ressource&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-8277108593032094450?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/8277108593032094450/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/objc-decouverte-de-lobjective-c-31.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/8277108593032094450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/8277108593032094450'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/objc-decouverte-de-lobjective-c-31.html' title='[OBJC] Découverte de l&apos;Objective C / 31 jours = 31 applis, on va tenter de garder le rythme !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y2fyEhOegYQ/TJgFFFKhYEI/AAAAAAAABA0/LFiJ9ET5D00/s72-c/calculatrice.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-6160123908311953730</id><published>2010-09-14T19:24:00.000+02:00</published><updated>2010-09-14T19:25:47.270+02:00</updated><title type='text'>[GWT][GXT]  Les grids</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;En GXT, on a souvent le besoin de mettre en forme des données. J'ai eu besoin de le faire, en me baladant sur le showcase de Sencha, j'ai vu le &lt;a href="http://www.sencha.com/examples/explorer.html#gridplugins"&gt;plugin exapander pour les grid&lt;/a&gt;. Un très beau rendu qui permet d'afficher des compléments d'informations pour une liste d'objets donnée.&lt;br /&gt;Ca donnera ça :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-ozlhN_0I/AAAAAAAAA_c/TBGylVq4OMQ/s1600/Capture-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-ozlhN_0I/AAAAAAAAA_c/TBGylVq4OMQ/s320/Capture-8.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On part de notre modèle pour aller vers la vue.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Voici notre modèle : Student =&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-qF7U_NAI/AAAAAAAAA_k/6-3Q7-wWA8s/s1600/Capture-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-qF7U_NAI/AAAAAAAAA_k/6-3Q7-wWA8s/s400/Capture-9.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;On déclare 3 attributs pour faire simple et un constructeur recevant nos 3 attributs.&lt;br /&gt;On créé ensuite une interface héritant de BeanModelMarker&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-qm4_z19I/AAAAAAAAA_s/GJasfLgv2Ms/s1600/Capture-10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-qm4_z19I/AAAAAAAAA_s/GJasfLgv2Ms/s320/Capture-10.png" /&gt;&lt;/a&gt;&lt;/div&gt;Ne surtout pas oublier l'annotation @BEAN({package}.{Class}.class), elle est très importante dans la liaison entre la classe Student et cette interface.&lt;br /&gt;&lt;br /&gt;Maintenant on passe du côté Vue&lt;br /&gt;&lt;br /&gt;Là ou on veut afficher notre grid, on créé une liste de Student, appelée students :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI-rzIcwnjI/AAAAAAAAA_0/rJ0pmY1ELoc/s1600/Capture-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI-rzIcwnjI/AAAAAAAAA_0/rJ0pmY1ELoc/s320/Capture-11.png" /&gt;&lt;/a&gt;&lt;/div&gt;On se créé un magasin puis pour chaque Student de notre liste students, on génère le BeanModel associé. Ainsi, nous avons un store contenant des BeanModel :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-r-NR3iaI/AAAAAAAAA_8/b1G46dy5_9I/s1600/Capture-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-r-NR3iaI/AAAAAAAAA_8/b1G46dy5_9I/s320/Capture-12.png" /&gt;&lt;/a&gt;&lt;/div&gt;On créé ensuite un XTemplate (KESAKO ? c'est ce qui sera affiché lorsque l'on cliquera sur le petit plus dans notre grid, on peut ne pas le faire si on veut juste une grid standard) :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-sj8TLmoI/AAAAAAAABAE/Bjql04qQVKA/s1600/Capture-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-sj8TLmoI/AAAAAAAABAE/Bjql04qQVKA/s320/Capture-13.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;Maintenant, il faut créer les colonnes. C'est là que c'est Magique.On créé une liste de ColumnConfig, on y ajoute notre plugin expander qui nous permet d'afficher des info supplémentaires selon le précédent XTemplate puis on créé autant de nouveau ColumnConfig que l'on veut de colonne. &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-tJbUe_xI/AAAAAAAABAM/LN9Hlv76nC8/s1600/Capture-14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-tJbUe_xI/AAAAAAAABAM/LN9Hlv76nC8/s320/Capture-14.png" /&gt;&lt;/a&gt;&lt;/div&gt;2 méthodes très importantes ci-dessus,&lt;br /&gt;&lt;br /&gt;colum.setHeader("Prénom");&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;colum.setId("firstName");&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;La  méthode magique est cette dernière. Ce qu'on lui passe =&amp;gt; firstName  est, vous l'avez peut être déjà remarqué, le nom d'un des attributs  de mon objet Student. Il faut retourner dans notre modèle Student pour générer tous les getters dont nous aurons besoin. ici firstName et LastName &lt;span style="color: orange;"&gt;Student.class.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-vIyTj0oI/AAAAAAAABAU/ezLpvsQW4NQ/s1600/Capture-16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TI-vIyTj0oI/AAAAAAAABAU/ezLpvsQW4NQ/s320/Capture-16.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Maintenant c'est quasiment fini, il faut créer le fameux Grid en lui passant notre liste de (Student)BeanModel et notre ColumnModel cm.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-vwqStmPI/AAAAAAAABAc/1-i6syDh2F0/s1600/Capture-17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-vwqStmPI/AAAAAAAABAc/1-i6syDh2F0/s320/Capture-17.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Voilà, c'est fini et normalement, je viens de le tester, ca fonctionne niquel !&lt;br /&gt;Enjoy ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-6160123908311953730?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/6160123908311953730/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gxt-les-grids.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6160123908311953730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6160123908311953730'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gxt-les-grids.html' title='[GWT][GXT]  Les grids'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_y2fyEhOegYQ/TI-ozlhN_0I/AAAAAAAAA_c/TBGylVq4OMQ/s72-c/Capture-8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-325769929343023246</id><published>2010-09-13T16:33:00.000+02:00</published><updated>2010-09-13T16:33:13.077+02:00</updated><title type='text'>[GWT] Les Layouts</title><content type='html'>Première étape de la création d'une application GWT, l'interface utilisateur.&lt;br /&gt;En GWT, on utilise les Layouts (Patron, MasterPage).&lt;br /&gt;&lt;br /&gt;En gros on créé l'architecture de la vue en créant un layout général.&lt;br /&gt;&lt;br /&gt;Toujours avec la fameuse librairie GXT (cf les précédents tuto), on va réussir à faire un super truc très rapidement.&lt;br /&gt;&lt;br /&gt;Deux trucs à savoir :&lt;br /&gt;&lt;br /&gt;1) Il existe beaucoup de types de layouts. Nous utiliserons le type de layout utilisé dans l'exemple du showcase de Sencha &lt;a href="http://www.sencha.com/examples/explorer.html#borderlayout"&gt;BorderLayoutExample&lt;/a&gt;&amp;nbsp;car il est très performant, assez rapide de mise en oeuvre et déjà stylé et largement parametrable, c'est probablement au moment ou je parle le plus puissant layout de GWT.&lt;br /&gt;2) Pour redimensionner automatiquement notre layout lorsqu'on redimensionne le navigateur, il faut utiliser l'objet VIEWPORT&lt;br /&gt;&lt;br /&gt;Pour intégrer Viewport à notre exemple de borderlayout, on va importer Viewport et l'instancier. Il faudra toujours considérer ViewPort comme la vue globale.&lt;br /&gt;&lt;br /&gt;J'ai renommé l'exemple BorderLayoutExample en GeneralLayout.&lt;br /&gt;J'ai enlevé la classe mère LayoutContainer de la déclaration de classe, l'objet ViewPort héritant déjà de LayoutContainer&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI40H_naKXI/AAAAAAAAA_E/oAhAtb6Ij4A/s1600/Capture-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI40H_naKXI/AAAAAAAAA_E/oAhAtb6Ij4A/s400/Capture-5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Je ne vais pas revenir sur les exemples de Sencha, c'est assez explicite, je vous montre seulement ce qui change dans le fichier GeneralLayout à la fin, lorsqu'on ajoute du contenu à une zone du layout :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI41Al4a9PI/AAAAAAAAA_M/3YeHnABJGEY/s1600/Capture-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="30" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TI41Al4a9PI/AAAAAAAAA_M/3YeHnABJGEY/s200/Capture-6.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Il reste une chose à faire maintenant, utiliser viewport comme vue globale dans le onModuleLoad()&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI41dewsUNI/AAAAAAAAA_U/I9L6OycRUgY/s1600/Capture-7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TI41dewsUNI/AAAAAAAAA_U/I9L6OycRUgY/s320/Capture-7.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ainsi, on peut maintenant redimensionner notre navigateur, le layout se redimensionnera instantanément.&lt;br /&gt;Plutot Génial hein ?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-325769929343023246?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/325769929343023246/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-les-layouts.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/325769929343023246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/325769929343023246'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-les-layouts.html' title='[GWT] Les Layouts'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y2fyEhOegYQ/TI40H_naKXI/AAAAAAAAA_E/oAhAtb6Ij4A/s72-c/Capture-5.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-1712892406494397155</id><published>2010-09-09T19:15:00.000+02:00</published><updated>2010-09-09T19:15:21.567+02:00</updated><title type='text'>[GWT] Changer les ports des applications 8888 et 9997</title><content type='html'>J'ai vu que personne sur le web ou presque n'en parlait, par défaut, une application GWT est lancée sur un serveur d'application embarqué JETTY sur le port 8888. Lorsque vous développez vos applications, il faut installer un plugin dans votre navigateur qui va communiquer avec votre application codée en JAVA et tout retranscrire la partie client en JavaScript.&lt;br /&gt;&lt;br /&gt;Pour développer plusieurs projets en même temps, il faut donc paramétrer 2 ports.&lt;br /&gt;Pour accéder aux paramètres de son application, il faut faire un clique droit sur son projet et sélectionner Run As &amp;gt; Run Configurations :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkMoAEqpXI/AAAAAAAAA-g/n2kywuTW0Wc/s1600/Sans+titre-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkMoAEqpXI/AAAAAAAAA-g/n2kywuTW0Wc/s400/Sans+titre-2.png" width="352" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On arrive dans la configuration de notre application GWT.&lt;br /&gt;Il faut changer à 2 endroits des ports.&lt;br /&gt;Le premier, celui de JETTY. Par défaut, il est égal à 8888, j'ai donc modifié le port en 8888 vers 8890, on peut aussi bien choisir de cocher l'option qui permet de toujours choisir un port non utilisé. C'est pratique, autant s'en servir.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkLQcspM_I/AAAAAAAAA-Q/k-e3BfAn4QI/s1600/Capture-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkLQcspM_I/AAAAAAAAA-Q/k-e3BfAn4QI/s320/Capture-4.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Deuxièmement, il faut changer le deuxième port en se placant dans l'onglet Arguments et en ajoutant l'option -codeServerPort 9998, par exemple pour le numéro de port&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkLC2O3sXI/AAAAAAAAA-I/JR7HDeSuPxQ/s1600/Capture-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkLC2O3sXI/AAAAAAAAA-I/JR7HDeSuPxQ/s640/Capture-3.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ainsi, vous pouvez avoir plusieurs projets accessible grâce à la combinaison des 2 ports.&lt;br /&gt;Voilà pour la petite astuce.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-1712892406494397155?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/1712892406494397155/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-changer-les-ports-des-applications.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1712892406494397155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1712892406494397155'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-changer-les-ports-des-applications.html' title='[GWT] Changer les ports des applications 8888 et 9997'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y2fyEhOegYQ/TIkMoAEqpXI/AAAAAAAAA-g/n2kywuTW0Wc/s72-c/Sans+titre-2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7516102235051617243</id><published>2010-09-03T20:39:00.000+02:00</published><updated>2010-09-07T22:04:22.336+02:00</updated><title type='text'>[GWT] Découverte de la librairie GXT</title><content type='html'>Sencha propose une librairie EXJ GWT appellée GXT.&lt;br /&gt;On peut y accéder ici : http://www.sencha.com&lt;br /&gt;&lt;br /&gt;On télécharge la dernière version stable, au jour d'aujourd'hui, septembre 2010, c'est la version &lt;a href="http://www.sencha.com/products/gwt/download.php?dl=extgwt220gwt2"&gt;2.2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On part du principe qu'on a déjà créé un projet GWT.&lt;br /&gt;&lt;br /&gt;Dans notre projet GWT on créé un dossier lib puis un dossier gxt-2.2.0 à la racine du projet, on y extrait le fichier gxt.jar présent à la racine du fichier téléchargé.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIaae0FSvBI/AAAAAAAAA-A/NZqO_WTZgxs/s1600/Capture-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TIaae0FSvBI/AAAAAAAAA-A/NZqO_WTZgxs/s320/Capture-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Il faut maintenant inclure le jar à notre projet. Dans eclipse, il suffit de faire un clic droit sur notre projet -&amp;gt; proprietés (ou Alt + Entrée) puis de choisir "Include Jar"&lt;br /&gt;On va chercher le fichier gxt.jar qui se trouve dans ~/WORKSPACE/PROJECT/lib/&lt;br /&gt;gxt.jar&lt;br /&gt;&lt;br /&gt;Il apparait ainsi dans la liste des librairies ajoutées au projet. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/TIE6a1gchDI/AAAAAAAAA9Y/_Ec0JRob-vo/s1600/Capture-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="127" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TIE6a1gchDI/AAAAAAAAA9Y/_Ec0JRob-vo/s400/Capture-4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Il faut ensuite ajouter les ressources au projet (icons,images, model). Pour faire cela, il faut cliquer sur l'onglet Source (des proprietés du projet) puis choisir "Add Folder". On va chercher le dossier lib/gxt-2.2.0/samples/resources/src&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TIE7ExVZxgI/AAAAAAAAA9g/OUTIJNPdfiM/s1600/Capture-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TIE7ExVZxgI/AAAAAAAAA9g/OUTIJNPdfiM/s400/Capture-5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Il faut maintenant copier le dossier ressources présent dans le fichier que vous avez téléchargé gxt-2.2.0 et vers le dossier war.&lt;br /&gt;Il faut maintenant modifier le fichier html pour inclure le fichier css de gxt-all.css&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link type="text/css" rel="stylesheet" href="resources/css/gxt-all.css" /&amp;gt;&lt;/blockquote&gt;Il faut maintenant référencer gxt en ajoutant ces lignes dans le fichier de config TestGXT.gwt.xml :&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp; &amp;lt;!-- Other module inherits&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;inherits name='com.extjs.gxt.ui.GXT'/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;inherits name='com.extjs.gxt.samples.resources.Resources'/&amp;gt;&lt;/blockquote&gt;GXT est désormais installé.&lt;br /&gt;On peut désormais aller sur le show case de sencha pour faire nos emplettes, Voir source, copier coller et remplacer la regex suivante &lt;span style="color: #e06666;"&gt;\s[0-9]+.\s&lt;/span&gt; par "".&lt;br /&gt;&lt;br /&gt;Vous pouvez télécharger le projet minimal ici :&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1786237323"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.megaupload.com/?d=U8O9AOMW" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TIFFgy6Uf4I/AAAAAAAAA9o/KZp-NDoUjxE/s320/but_dnld_file_o.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7516102235051617243?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7516102235051617243/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-decouverte-de-la-librairie-gxt.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7516102235051617243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7516102235051617243'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/09/gwt-decouverte-de-la-librairie-gxt.html' title='[GWT] Découverte de la librairie GXT'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_y2fyEhOegYQ/TIaae0FSvBI/AAAAAAAAA-A/NZqO_WTZgxs/s72-c/Capture-1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4569480842783699148</id><published>2010-08-27T17:16:00.000+02:00</published><updated>2010-08-28T00:16:08.412+02:00</updated><title type='text'>[GWT] Tutoriel AJAX</title><content type='html'>&lt;div style="text-align: center;"&gt;Bonjour, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #999999;"&gt;GWT V2.0.4&lt;/span&gt;&lt;/div&gt;Pour commencer à toucher au modèle MVC, on va se pencher sur la réalisation d'une calculatrice respectant le modèle MVC et &amp;nbsp;appelant le serveur pour ce qui est du calcul de factorielles.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;Dans un premier temps, on va faire une calculatrice &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #93c47d;"&gt;non ajax&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;, seulement coté client.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Je vous conseille de faire maintenant un petit diagramme de classe faisant apparaitre correctement les cotés Model, View et Controller ainsi que les interfaces implémentées ou les classes mères.&lt;br /&gt;On rajoutera dans la partie 2 les appels &lt;span class="Apple-style-span" style="color: #93c47d;"&gt;&lt;b&gt;RPC (AJAX)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Voici mon diagramme de classe, celui qu'on utilisera lors de ce tuto :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THe9p0CCWjI/AAAAAAAAA6Y/2cRRIQYMJAg/s1600/schema.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THe9p0CCWjI/AAAAAAAAA6Y/2cRRIQYMJAg/s400/schema.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;On va donc créer une nouvelle application GWT, (voir le tuto précédent) puis on va créer de nouveaux packages à ceux déjà existant.&lt;br /&gt;&lt;br /&gt;Ainsi dans le package com.client, on va créer 3 packages : model, view, controller.&lt;br /&gt;&lt;br /&gt;Cela nous créé notre modèle MVC.&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;On va d'abord créer le &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;MODELE&lt;/span&gt; Calculator.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;1) Clic droit sur le package, new-&amp;gt; class; entrer Calculator comme nom de classe puis valider.&lt;br /&gt;2) &amp;nbsp;sur notre schéma on a déclaré 4 constantes, définissant les modes de calcul disponible de la calculatrice. On a aussi une "proprieté" mode qui définit le mode courant.&lt;br /&gt;La proprieté &lt;span class="Apple-style-span" style="color: blue;"&gt;oldValue&lt;/span&gt; est le résultat de l'opération précédente.&lt;br /&gt;La proprieté &lt;span class="Apple-style-span" style="color: blue;"&gt;currentValue&lt;/span&gt; correspond au nombre dernierement ajouté.&lt;br /&gt;La proprieté &lt;span class="Apple-style-span" style="color: blue;"&gt;saveCurrentValue&lt;/span&gt; est un booléen qui va gérer l'ajout ou le remplacement des chiffres à l'écran. Ainsi, la première touche, au départ et après une opération, remplacera le résultat et le booléen passera à false jusqu'à ce que l'on clique sur un opérateur (+ - * / = ).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfJ01W6SPI/AAAAAAAAA6g/0S4IWZ1zX7A/s1600/calcdef.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfJ01W6SPI/AAAAAAAAA6g/0S4IWZ1zX7A/s320/calcdef.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;3) Les méthodes ! On déclare un constructeur Calculator(); Rien de méchant, le constructeur va servir à instancier (créer) un nouveau calculator.&lt;br /&gt;On va ensuite déclarer un méthode appendDigit(int value) qui va être appellée lors du clic sur un bouton numérique (0-9) et va servir à remplacer le résultat à l'écran ou à le mettre à la suite (en fonction du &lt;span class="Apple-style-span" style="color: purple;"&gt;booléen&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;saveCurrentValue&lt;/span&gt;).&lt;br /&gt;La méthode clear() va servir à purger notre calculatrice, c'est litteralement un remise à zéro RAZ, déclenchée lorsqu'on clique sur le bouton C.&lt;br /&gt;La méthode compute() va calculer notre opération. En fonction du mode (ADD=&amp;gt;0,SUBSTRACT=&amp;gt;1,MULTIPLY=&amp;gt;2,DIVIDE=&amp;gt;3)&lt;br /&gt;la méthode getOldValue() est juste un accesseur, pas besoin d'en parler plus longuement.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfKLhdbl6I/AAAAAAAAA6o/2s6zv9qIJF4/s1600/calcmethodes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="363" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfKLhdbl6I/AAAAAAAAA6o/2s6zv9qIJF4/s400/calcmethodes.png" width="400" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/THfKXWixqoI/AAAAAAAAA6w/9xk3S8MtLJM/s1600/compute.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/THfKXWixqoI/AAAAAAAAA6w/9xk3S8MtLJM/s400/compute.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;On va maintenat créer la&amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;VUE&lt;/span&gt;&amp;nbsp;CalculatorWidget.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Celle-ci va nous permettre de générer notre clavier, notre écran, bref notre calculatrice coté utilisateur.&lt;br /&gt;&lt;br /&gt;1) On a une proprieté &lt;span class="Apple-style-span" style="color: blue;"&gt;screen&lt;/span&gt; qui va définir l'écran dans lequel l'utilisateur verra affiché la réponse.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfL71i6caI/AAAAAAAAA64/BnYUP7yqFAI/s1600/calcwidgetprop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfL71i6caI/AAAAAAAAA64/BnYUP7yqFAI/s320/calcwidgetprop.png" /&gt;&lt;/a&gt;&lt;/div&gt;2) On ajoute ensuite les méthodes. On a une méthode pour afficher quelque chose à l'écran, une méthode pour créer une touche : &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;createButton()&lt;/span&gt;, une autre pour le clavier : &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;createKeyboard()&lt;/span&gt; qui va utiliser la méthode &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;createButton&lt;/span&gt;().&lt;br /&gt;Mais avez vous remarqué que notre &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CalculatorWidget&lt;/span&gt; hérite de &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SimplePanel&lt;/span&gt;.&lt;br /&gt;Notre widget sera donc un &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SimplePanel&lt;/span&gt; et on veut que lorsqu'on le charge, on génère un VerticalPanel dans lequel on ajoute &lt;span class="Apple-style-span" style="color: blue;"&gt;screen&lt;/span&gt;&amp;nbsp;(&lt;span class="Apple-style-span" style="color: purple;"&gt;TextBox&lt;/span&gt;) qu'on désactive pour ne pas qu'on puisse y taper n'importe quoi, et qu'on génère un clavier pour pouvoir demander un calcul.&lt;br /&gt;On ordonne ces actions dans la méthode &lt;span class="Apple-style-span" style="color: #eeeeee;"&gt;&lt;span class="Apple-style-span" style="background-color: #999999;"&gt;@override&lt;/span&gt;&lt;/span&gt; &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;onLoad&lt;/span&gt;()&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/THfOkTpD9eI/AAAAAAAAA7A/FRuA83QT65A/s1600/calcwidgetmeth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/THfOkTpD9eI/AAAAAAAAA7A/FRuA83QT65A/s640/calcwidgetmeth.png" width="464" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;La fonction display() est bateau, pas besoin d'un dessin, je la met quand même pour plus de&amp;nbsp;clarté.&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/THfOuE_eZ_I/AAAAAAAAA7I/D1YYFbUCxV4/s1600/display.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/THfOuE_eZ_I/AAAAAAAAA7I/D1YYFbUCxV4/s1600/display.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="75" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/THfOuE_eZ_I/AAAAAAAAA7I/D1YYFbUCxV4/s200/display.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;On va enfin créer le&amp;nbsp;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;CONTROLLEUR&lt;/span&gt;&amp;nbsp;ButtonHandler.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;1) Le controlleur est la pièce directrice de votre programme. C'est ici que l'on va créer notre &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;b&gt;modèle&lt;/b&gt;&lt;/span&gt; et notre &lt;span class="Apple-style-span" style="color: #b45f06;"&gt;&lt;b&gt;vue&lt;/b&gt;&lt;/span&gt; et que l'on va effectuer les actions au clic des boutons.&lt;br /&gt;Ainsi, on va faire implémenter l'interface ClickHandler et on va donc implémenter l'action onClick() afin de définir le comportement du programme et donc calculer les opérations et recharger l'affichage de l'écran.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/THfSsTgrUGI/AAAAAAAAA7Q/fjDzBnCYRi0/s1600/Capture-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/THfSsTgrUGI/AAAAAAAAA7Q/fjDzBnCYRi0/s640/Capture-4.png" width="432" /&gt;&lt;/a&gt;&lt;/div&gt;On pourrait&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #93c47d;"&gt;presque&lt;/span&gt;&lt;/b&gt;&amp;nbsp;penser que c'est fini et c'est &lt;b&gt;&lt;span class="Apple-style-span" style="color: #93c47d;"&gt;presque&lt;/span&gt;&lt;/b&gt; vrai !&lt;br /&gt;&lt;br /&gt;Il faut maintenant changer ce que fait le programme, le main si vous venez du Java. En GWT, vous l'avez compris, on appelle ça le onModuleLoad() :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfTf4j2BcI/AAAAAAAAA7Y/RFsVyDRgqe8/s1600/Capture-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="108" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THfTf4j2BcI/AAAAAAAAA7Y/RFsVyDRgqe8/s320/Capture-5.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="background-color: #f6b26b;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;ACTION AJAX&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="background-color: #f1c232;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;On va essayer d'expliquer le plus facilement possible les concepts de base.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Pour intégrer de l'AJAX dans notre calculatrice, on va ajouter une nouvelle fonctionnalité : la factorielle.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;C'est peut être pas très clair pour ce qu'est la factorielle alors je vous le dis la factorielle de 5, c'est 1x2x3x4x5 donc c'est pas forcément très dur mais ca monte très vite dans des nombres énormes.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;GWT fournit un&amp;nbsp;framework complet reposant sur un modèle entièrement asynchrone.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Voilà comment s'articule le moteur RPC :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/THg5G-uzAnI/AAAAAAAAA84/fbPR30prRx4/s1600/schema-rpc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/THg5G-uzAnI/AAAAAAAAA84/fbPR30prRx4/s400/schema-rpc.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;L’interface de service&amp;nbsp;est le contrat de notre service. C’est l’ensemble des opérations&amp;nbsp;que nous proposons de distribuer. Il existe deux types d’interface.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;• L’interface synchrone&amp;nbsp;(&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;MyService/FactoService&lt;/span&gt;&lt;/span&gt;)&amp;nbsp;: c’est cette interface qui est utilisée par notre implémentation&amp;nbsp;sur le serveur. Elle est générée en JavaScript lors de la phase de compilation et se&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;situe côté client du fait de sa dépendance avec d’autres éléments côté client.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;• L’interface asynchrone : dans GWT, toute requête Ajax s’effectue de manière&amp;nbsp;asynchrone. C’est cette interface qui est concrètement utilisée lors de l’invocation&amp;nbsp;par le code client.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;1) On va donc créer notre interface de synchrone. On va la nommer &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;FactoService&lt;/span&gt; et la faire étendre de &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;RemoteServiceServlet&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;On déclare la méthode pour calculer la factorielle. On va l'appeller &lt;b&gt;factoServer&lt;/b&gt;(int n)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Il faut ensuite assigner à notre servlet un alias en ajoutant&amp;nbsp;&lt;span class="Apple-style-span" style="color: #999999;"&gt;@RemoteServiceRelativePath("&lt;/span&gt;facto&lt;span class="Apple-style-span" style="color: #999999;"&gt;")&lt;/span&gt; au dessus de la déclaration de l'interface&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/THgKitxN6FI/AAAAAAAAA7g/nS_CudpFay4/s1600/Capture-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="53" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/THgKitxN6FI/AAAAAAAAA7g/nS_CudpFay4/s400/Capture-6.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;2) Puis l'autre interface, l'asynchrone. On va la nommer, &lt;b&gt;et c'est obligatoire de la nommer comme ceci &lt;/b&gt;NomDeLInterfaceSynchrone+&lt;i&gt;Async&lt;/i&gt;, ce qui donne&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt; FactoServiceAsync&lt;/span&gt;,&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgXSHAQkAI/AAAAAAAAA7w/j4Jz2B6QkW4/s1600/Capture-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgXSHAQkAI/AAAAAAAAA7w/j4Jz2B6QkW4/s320/Capture-8.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;3) Comme vous le voyez sur le schéma au dessus, on doit générer un proxy. Le Proxy va servir à communiquer entre le client et le serveur. Sur le schéma, il y a marqué "&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;Généré&lt;/span&gt;", Java nous permet de créer dynamiquement des classes. On appelle la méthode create de la final Class GWT en lui passant le nom de l'interface &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;FactoService&lt;/span&gt; et le type &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;FactoServiceAsync&lt;/span&gt;. Il faut mettre cette ligne de code dans le modèle ou l'on veut éffectuer l'action AJAX (&lt;span class="Apple-style-span" style="color: #76a5af;"&gt;on peut cependant le mettre ailleurs si on en a besoin ailleurs, tant que ca respecte le modèle MVC&lt;/span&gt;).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Voici la fameuse ligne de code :&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/THgd7GWRpwI/AAAAAAAAA8A/5Rk2hiIUd9U/s1600/Capture-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/THgd7GWRpwI/AAAAAAAAA8A/5Rk2hiIUd9U/s640/Capture-9.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;4) Le mécanisme RPC est quasiment fini coté client. Il faut maintenant créer la méthode dans notre modèle. Je vous rappelle le but de l'action AJAX, c'est trouver la factorielle d'un nombre.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Donc dans notre modèle Calculator, on va ajouter une méthode askFactoToServer(int n)&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgp_EmI0HI/AAAAAAAAA8Q/M8cQnYsPn9Y/s1600/Capture-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgp_EmI0HI/AAAAAAAAA8Q/M8cQnYsPn9Y/s640/Capture-11.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;On a bouclé tout ce qui se trouve du coté client.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Une classe reste désormais à implémenter, la classe coté serveur.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;5) Sur le schéma, on voit la classe &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;MyServiceImpl.java&lt;/span&gt;, c'est la classe coté serveur qui va nous calculer notre factorielle.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgwU4ppC3I/AAAAAAAAA8g/x00-4uBHZ8c/s1600/Capture-11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/THgwU4ppC3I/AAAAAAAAA8g/x00-4uBHZ8c/s640/Capture-11.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;on ajout @suppressWarnings("serial") pour éviter un avertissement lié à la sérialisation&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Et voilà ! Profitez bien !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4569480842783699148?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4569480842783699148/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/08/gwt-tutoriel-ajax.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4569480842783699148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4569480842783699148'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/08/gwt-tutoriel-ajax.html' title='[GWT] Tutoriel AJAX'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y2fyEhOegYQ/THe9p0CCWjI/AAAAAAAAA6Y/2cRRIQYMJAg/s72-c/schema.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-5095457943018676734</id><published>2010-08-17T04:45:00.000+02:00</published><updated>2010-08-18T02:52:06.468+02:00</updated><title type='text'>[GWT] Tutoriel de découverte</title><content type='html'>Me voilà dans un nouveau stage !&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGn3sLpc-yI/AAAAAAAAA5A/DAlZZFKPriU/s1600/gwt-1.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGn3sLpc-yI/AAAAAAAAA5A/DAlZZFKPriU/s320/gwt-1.png" /&gt;&lt;/a&gt;Je travaille pour un professeur qui souhaite créer un logiciel en ligne d'exercice de maths, de suivi des élèves et de gestion de compétences.&lt;br /&gt;On va normalement travailler avec Google web toolkit !&lt;br /&gt;C'est avec ce toolkit que Google code ses applications et le concept est assez simple et interessant :&lt;br /&gt;- Ce n'est que du JAVA !&lt;br /&gt;Je ne sais pas si c'est une bonne nouvelle mais c'est comme ca :D&lt;br /&gt;&lt;br /&gt;Le fonctionnement est donc que l'on code tout en Java en utilisant les librairies qui conviennent. On ne touche normalement jamais à une ligne de code js et c'est completement objet.&lt;br /&gt;J'ai donc installé ça ce soir et ca me donne très envie aussi je vous le recommande, je vais m'y mettre serieusement là et je posterais quelques tutoriels à ce sujet.&lt;br /&gt;Ci contre un premier screen de ce qu'un projet neuf donne :&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;&lt;b&gt;Je vous propose maintenant un petit tuto de découverte de GWT :&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;c'est fortement inspiré du tuto que propose google ici :&amp;nbsp;&lt;span class="Apple-style-span" style="color: black; font-style: normal;"&gt;&lt;a href="http://code.google.com/intl/fr-FR/webtoolkit/doc/latest/tutorial/gettingstarted.html"&gt;StockWatcher&lt;/a&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; font-style: normal; line-height: 20px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="background-color: #d9ead3;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;Il faut tout d'abord installer eclipse si vous ne l'avez pas déjà fait.&lt;br /&gt;1. téléchargez la dernière version d'eclipse sur&amp;nbsp;&lt;a href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br /&gt;2. ensuite allez dans Eclipse -&amp;gt; Help -&amp;gt; New Software&lt;br /&gt;Une fois dans New Software, on ajoute cet url : &lt;a href="http://dl.google.com/eclipse/plugin/3.5"&gt;http://dl.google.com/eclipse/plugin/3.5&lt;/a&gt;&amp;nbsp;qui contient les sources de &lt;span class="Apple-style-span" style="color: #6fa8dc;"&gt;&lt;b&gt;GWT&lt;/b&gt;&lt;/span&gt; et le plugin &lt;span class="Apple-style-span" style="color: #6fa8dc;"&gt;&lt;b&gt;GWT pour eclipse&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;3. Cochez &amp;nbsp;tout&lt;br /&gt;4. Continuez l'installation jusqu'à la fin, logiquement pas de problème sinon suivez ce qu'ils disent, puis redémarrer.&lt;br /&gt;5. De nouvelles choses apparaissent désormais , notamment 3 icones avec le g emblématique de google.&lt;br /&gt;6. Eclipse vient d'installer GWT et être maintenant prêt à l'utiliser.&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #cccccc;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; font-style: normal; line-height: 20px;"&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="background-color: #d9ead3;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;Je vais fonctionner ici en captures d'écran pour le code pour ne pas que vous copiez (bêtement) le code car c'est incomparable la différence entre écrire le code et le copier pour la compréhension.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;On créer maintenant une nouvelle application web google. C'est assez instinctif, c'est cette icone .&amp;nbsp; &lt;/span&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGsbwKCKqOI/AAAAAAAAA5I/8hje3QnyzuM/s320/gicon.png" /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;On renseigne le nom du projet :&lt;span class="Apple-style-span" style="color: #cc0000;"&gt;stockWatcher&lt;/span&gt; et le package, habituellement, je mets juste &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;com&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Ca génère donc le hello world, c'est assez marrant, ca montre un peu comment ca s'organise mais ca ne sert pas à grand chose. &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;On va maintenant dans war et on ouvre le fichier stockwatcher.html (ca dépend du nom que vous avez pris pour votre nom de projet, j'ai moi pris "stockwatcher") puis on fait le ménage, rien qu'en enlevant les commentaires, on arrive à un truc propre et simple :&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;!doctype html&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;html&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;link type="text/css" rel="stylesheet" href="StockWatcher.css"&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;Web Application Starter Project&amp;lt;/title&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;script type="text/javascript" language="javascript" src="stockwatcher/stockwatcher.nocache.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;h1&amp;gt;StockWatcher&amp;lt;/h1&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;div id="stockList"&amp;gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;/html&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;GWT utilise les id pour dire ou il veut afficher ses élements. Ainsi, on a fait une div avec l'id stockList vide mais dans le but d'y mettre notre contenu.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;on ouvre maintenant &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;com.client&lt;/span&gt;.StockWatcher.java&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;On a notre classe, déclarée comme ceci : &lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;public class&lt;/b&gt;&lt;/span&gt; StockWatcher &lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;implements&lt;/span&gt;&lt;/b&gt; Entrypoint{ }&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Je vous rappelle qu'on déclare ce dont on a besoin directement dans la classe.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;Dans ce tuto, on veut pouvoir ajouter en Ajax de nouvelles entrées dans un tableau, on va donc avoir besoin :&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;d'un tableau (flexTable)&lt;/li&gt;&lt;li&gt;d'un input text (TextBox)&amp;nbsp;&lt;/li&gt;&lt;li&gt;d'un label pour indiquer la date de dernière mise à jour (Label)&lt;/li&gt;&lt;li&gt;d'un bouton (Button)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;On a aussi besoin d'un panel, c'est typique de Java, considerons le simplement comme un socle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;un panel pour l'affichage (VerticalPanel) et un panel horizontal pour l'ajout d'entrées&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Mais tous ces éléments nécessitent l'import de certains fichiers.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsndj8Ne8I/AAAAAAAAA5Q/_h9Li5su4YU/s1600/imports.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsndj8Ne8I/AAAAAAAAA5Q/_h9Li5su4YU/s320/imports.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;On met ces import de librairies tout en haut du fichier.&lt;/div&gt;&lt;div&gt;Donc on met ca juste en dessous de la déclaration de la classe.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGsn1QhhIBI/AAAAAAAAA5Y/XUcaP7L4KnE/s1600/declarations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGsn1QhhIBI/AAAAAAAAA5Y/XUcaP7L4KnE/s320/declarations.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Le point d'entrée du programme, c'est la fonction &lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;public void&lt;/b&gt;&lt;/span&gt; onModuleLoad(){ }&lt;br /&gt;&lt;br /&gt;C'est notre "main" pour ceux qui le cherchaient...&lt;br /&gt;On commence par créer notre tableau dans lequel on va stocker les données, c'est le FlexTable stocksFlexTable :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/TGsoDICxElI/AAAAAAAAA5g/qv6iy51Mys4/s1600/stockstable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TGsoDICxElI/AAAAAAAAA5g/qv6iy51Mys4/s320/stockstable.png" /&gt;&lt;/a&gt;&lt;/div&gt;Cela fera 4 colonnes.&lt;br /&gt;&lt;br /&gt;On va ensuite y mettre l'input text et le bouton pour pouvoir ajouter des nouvelles entrées dans l'horizontalPanel addPanel:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/TGsoiDnB1xI/AAAAAAAAA5o/eKb8y3kkeUk/s1600/addPanel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/TGsoiDnB1xI/AAAAAAAAA5o/eKb8y3kkeUk/s320/addPanel.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Maintenant on met dans le mainPanel le tableau, le panel d'ajout d'entrées ainsi que notre label de mise à jour :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_y2fyEhOegYQ/TGsorMaczsI/AAAAAAAAA5w/nGMBJ6fxGa8/s1600/mainPanel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_y2fyEhOegYQ/TGsorMaczsI/AAAAAAAAA5w/nGMBJ6fxGa8/s320/mainPanel.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Vient ensuite une chose très interessante, la notion de RootPanel.&lt;br /&gt;Le RootPanel, c'est notre page ! On ne la déclare jamais, elle est omniprésente et sert à communiquer entre notre classe et notre fichier html.&lt;br /&gt;&lt;br /&gt;Ainsi, on va mettre notre mainPanel dans la div d'id stocksList comme ceci :&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGso1WQNSiI/AAAAAAAAA54/mS3EmI1VGS0/s1600/rootpanel.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGso1WQNSiI/AAAAAAAAA54/mS3EmI1VGS0/s320/rootpanel.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Maintenant, si on appuye sur F11 dans eclipse, on build notre projet et on peut le visualiser dans notre navigateur préféré (sauf au moment ou j'écris sur chrome sous ubuntu, c'est un comble !! Google quand même :S )&lt;br /&gt;&lt;br /&gt;Mais pour l'instant, rien ne se passe en cliquant sur notre bouton et le tableau est vide.&lt;br /&gt;Il faut créer une action sur le clic du bouton pour pouvoir envoyer le contenu de l'input text vers le flexTable.&lt;br /&gt;&lt;br /&gt;Cela se fait avec la méthode addClickHandler de notre objet addStockButton.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGspEUytafI/AAAAAAAAA6A/STEa8IRTaoo/s1600/addclickhandler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_y2fyEhOegYQ/TGspEUytafI/AAAAAAAAA6A/STEa8IRTaoo/s320/addclickhandler.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Vous voyez ici que l'on fait appel, dès que l'on clique sur le bouton &lt;span class="Apple-style-span" style="color: blue;"&gt;addStockButton,&lt;/span&gt;&amp;nbsp;la fonction addStock(); &amp;nbsp;Or cette fonction n'éxiste pas et eclipse va vous le faire remarquer.&lt;br /&gt;Eclipse est sympa ! Il va même vous proposer de la créer à votre place.&lt;br /&gt;&lt;br /&gt;Imaginons qu'on ne veuille pas ajouter 2 fois la même chose dans notre FlexTable et seulement des entrées de plus de 4 caractères et sans caractères spéciaux.&lt;br /&gt;On créé une liste des entrées qu'on ajoute et à chaque fois on va vérifier qu'il n'éxiste pas dans notre liste avant de l'ajouter dans le flexTable et on teste le contenu avec un REGEX avec la fonction matches("^[0-9A-Z\\.]{1,10}$")&lt;br /&gt;&lt;br /&gt;On affiche un message d'erreur avec l'objet Window, accessible grâce à l'inclusion :&lt;br /&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;import&lt;/b&gt;&lt;/span&gt; com.google.gwt.user.client.Window;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;On oublie pas d'instancier notre liste stocks ArrayList, juste en dessous des autres déclarations&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsp6SGyvsI/AAAAAAAAA6I/ytOaoCYZ9F8/s1600/arrayList.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsp6SGyvsI/AAAAAAAAA6I/ytOaoCYZ9F8/s320/arrayList.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Puis on écrit notre fonction. Ca donne ça :&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsqZuDFMaI/AAAAAAAAA6Q/2a8XwHwUfUA/s1600/addStock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_y2fyEhOegYQ/TGsqZuDFMaI/AAAAAAAAA6Q/2a8XwHwUfUA/s320/addStock.png" /&gt;&lt;/a&gt;&lt;/div&gt;On peut enfin ajouter des choses dans notre flexTable ! Enjoy&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-5095457943018676734?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/5095457943018676734/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/08/gwt-decouverte-et-installation.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5095457943018676734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5095457943018676734'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/08/gwt-decouverte-et-installation.html' title='[GWT] Tutoriel de découverte'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_y2fyEhOegYQ/TGn3sLpc-yI/AAAAAAAAA5A/DAlZZFKPriU/s72-c/gwt-1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-6500725062274232453</id><published>2010-05-25T18:40:00.000+02:00</published><updated>2010-05-25T18:40:29.331+02:00</updated><title type='text'>[SYMFONY] Les formulaires !</title><content type='html'>Ce tutoriel est juste génial !! Facile, illustré et très riche !&lt;br /&gt;&lt;a href="http://www.symfony-project.org/blog/2008/10/14/new-in-symfony-1-2-make-your-choice"&gt;http://www.symfony-project.org/blog/2008/10/14/new-in-symfony-1-2-make-your-choice&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-6500725062274232453?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/6500725062274232453/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/05/symfony-les-formulaires.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6500725062274232453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6500725062274232453'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/05/symfony-les-formulaires.html' title='[SYMFONY] Les formulaires !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2665031807273538665</id><published>2010-05-25T16:22:00.000+02:00</published><updated>2010-11-17T15:34:02.586+01:00</updated><title type='text'>Symfony sur mutualisé (OVH, 1&amp;1 etc) = La solution</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;Bonjour,&lt;br/&gt;&lt;span style='color:#a64d79'&gt;La solution aujourd'hui pour envoyer son site fait sous symfony sur un hébergeur mutualisé.&lt;/span&gt;&lt;br/&gt;Pas d'accès SSH, donc pas de lignes de commandes. Il faut cependant  avoir les droits minimaux sur le serveur.&lt;br/&gt;&lt;br/&gt;&lt;span style='color:#a64d79'&gt;Connectez-vous&lt;/span&gt; à votre espace de stockage par &lt;span style='color:#e06666'&gt;ftp&lt;/span&gt;.&lt;br/&gt;Normalement, vous avez un dossier &lt;span style='color:#f6b26b'&gt;/www&lt;/span&gt;, il faut y &lt;span style='color:#a64d79'&gt;mettre le contenu de votre dossier&lt;/span&gt;&lt;br /&gt;				&lt;span style='color:orange'&gt;/web&lt;/span&gt;.&lt;br/&gt;Si vous n'avez pas de répertoire www, comme j'ai pu rencontrer le problème sur OVH, il faudra aller dans le panneau d'administration afin de définir le dossier &lt;span style='color:#ffc000'&gt;/web&lt;/span&gt; (que vous aurez copié de votre projet initial (symfony)) comme répertoire par défaut.&lt;br/&gt;Supprimez le reste&lt;br/&gt;&lt;br/&gt;Tous les autres repertoires (&lt;span style='color:orange'&gt;apps, config, cache&lt;/span&gt;, ...) iront à la racine de votre espace.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Donc vous avez une architecture quasi similaire, peut être à l'exception du dossier &lt;span style='color:orange'&gt;web&lt;/span&gt; renommé en &lt;span style='color:orange'&gt;www&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style='color:#a64d79'&gt;Uploadez votre installation de symfony&lt;/span&gt; à la racine, aux cotés des dossiers apps et config.&lt;br/&gt;Je l'ai personnellement installé dans le dossier symfony-1.4.&lt;br/&gt;Maintenant, il faut faire pointer vers ce repertoire.&lt;br/&gt;Cela se passe dans le fichier /config/ProjectConfiguration.class.php ou il faut modifier la ligne require_one '/mon/path/local/vers/symfony';&lt;br/&gt;Vous devez &lt;span style='color:#a64d79'&gt;mettre le nouveau chemin&lt;/span&gt;. Il commence chez ovh par homez.{3chiffres} Mais vous n'êtes pas censé le connaitre. Pour le savoir, on peut soit générer une erreur en allant sur le site dès maintenant, php va dire qu'il y a une erreur à tel endroit, il faudra alors copier ce chemin, soit en affichant &amp;lt;? echo realpath("index.php"); ?&amp;gt; dans le fichier index.php&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;cela donne donc quelquechose du style :&lt;br/&gt;&lt;span style='color:blue'&gt;require_once&lt;/span&gt;&lt;br /&gt;				&lt;span style='color:orange'&gt;'/homez.123/monnom/symfony-1.4/lib/autoload/sfCoreAutoLoad.class.php';&lt;/span&gt;&lt;br/&gt;&lt;span style='color:orange'&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;Ensuite tant qu'on est dans le fichier de conf, si vous avez un dossier www au lieu du fichier web initial, on va &lt;span style='color:#a64d79'&gt;surcharger la variable de configuration sf_web_dir&lt;/span&gt; qui pointe normalement sur web.&lt;br/&gt;&lt;br/&gt;sfConfig::&lt;span style='color:#990000'&gt;set&lt;/span&gt;('&lt;span style='color:orange'&gt;sf_web_dir&lt;/span&gt;', '&lt;span style='color:orange'&gt;/homez.123/monnom/www&lt;/span&gt;');&lt;br/&gt;&lt;br /&gt;			&lt;/p&gt;&lt;p&gt;Sinon, on y touche pas.&lt;br/&gt;Il ne reste plus qu'une seule chose à faire pour le coté config, la base de données, c'est plutot facile aussi, l'offre de base permet d'avoir une base de données en général, il faut d'abord &lt;span style='color:#a64d79'&gt;la créer dans le manager&lt;/span&gt;. Ensuite il vous donne les informations d'accès.&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Ouvrez donc le fichier &lt;span style='color:orange'&gt;/config/databases.yml&lt;/span&gt;&lt;br/&gt;Il faut juste &lt;span style='color:#a64d79'&gt;modifier les identifiants de connexion&lt;/span&gt; avec les votres...&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style='color:blue'&gt;&lt;strong&gt;all:&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style='color:blue'&gt;&lt;strong&gt;  doctrine:&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style='color:blue'&gt;&lt;strong&gt;    class:&lt;/strong&gt;&lt;/span&gt; sfDoctrineDatabase&lt;br/&gt;    &lt;span style='color:blue'&gt;&lt;strong&gt;param:&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;      &lt;span style='color:blue'&gt;&lt;strong&gt;dsn: &lt;/strong&gt;&lt;/span&gt;     mysql:host=&lt;span style='color:#cc0000'&gt;mysql5-xx.perso&lt;/span&gt;;dbname=&lt;span style='color:#cc0000'&gt;monnomdb&lt;/span&gt;&lt;br/&gt;      &lt;span style='color:blue'&gt;&lt;strong&gt;username:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;				&lt;span style='color:#cc0000'&gt;monnom&lt;/span&gt;&lt;br/&gt;      &lt;span style='color:blue'&gt;&lt;strong&gt;password:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;				&lt;span style='color:#cc0000'&gt;monpassw&lt;/span&gt;&lt;br/&gt;&lt;span style='color:#cc0000'&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style='color:#cc0000'&gt;SetEnv PHP_VER 5&lt;br/&gt;Options  FollowSymLinks  ExecCGI &lt;br/&gt;&lt;br/&gt;&amp;lt;IfModule mod_gzip.c&amp;gt;&lt;br/&gt;mod_gzip_on Off&lt;br/&gt;&amp;lt;/IfModule&amp;gt; &lt;br/&gt;&lt;br/&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;   &lt;br/&gt;&lt;br/&gt;RewriteEngine On   &lt;br/&gt;&lt;br/&gt;# Permettre a IE de reconnaitre le win_png.htc de retraitement des png transparents&lt;br/&gt;#AddType text/x-component .htc   &lt;br/&gt;&lt;br/&gt;#RewriteBase /~votredossierbase/   &lt;br/&gt;&lt;br/&gt;# we skip all files with .something&lt;br/&gt;RewriteCond %{REQUEST_URI} \.. $&lt;br/&gt;RewriteCond %{REQUEST_URI} !\.html$&lt;br/&gt;RewriteCond %{REQUEST_URI} !\.php&lt;br/&gt;RewriteRule .* - [L]   # we check if the .html version is here (caching)   &lt;br/&gt;&lt;br/&gt;# RewriteRule ^$ index.html [QSA] # Suppression du "/" pour un sous-dossier&lt;br/&gt;RewriteRule ^$ /index.html [QSA]&lt;br/&gt;RewriteRule ^([^.] )$ $1.html [QSA]&lt;br/&gt;RewriteCond %{REQUEST_FILENAME} !-f   &lt;br/&gt;&lt;br/&gt;# no, so we redirect to our front web controller&lt;br/&gt;# RewriteRule ^(.*)$ index.html [QSA] # Suppression du "/" pour un sous-dossier&lt;br/&gt;RewriteRule ^(.*)$ /index.php [QSA,L]   # hidden frontoffice controller&lt;br/&gt;# RewriteRule ^(.*)$ index.html [QSA] # Suppression du "/" pour un sous-dossier&lt;br/&gt;RewriteRule ^index\.php/(.*)$ /index.php [QSA,L] &lt;br/&gt;&lt;br/&gt;&amp;lt;/IfModule&amp;gt;&lt;br/&gt;# big crash from our front web controller&lt;br/&gt;ErrorDocument 500 "&amp;lt;h2&amp;gt;Application error&amp;lt;/h2&amp;gt;symfony application failed to start properly&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style='color:#cc0000; background-color:#76a5af'&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style='color:#cc0000'&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style='color:white; background-color:#76a5af'&gt;&lt;strong&gt;Plutot facile jusqu'à maintenat hein ? Hé bien c'est quasi fini, c'est vraiment trop cool symfony... :)&lt;/strong&gt;&lt;/span&gt;&lt;span style='color:#cc0000'&gt;&lt;br/&gt;&lt;br/&gt;Maintenant, il faut &lt;/span&gt;&lt;span style='color:#a64d79'&gt;copier le repertoire sf &lt;/span&gt;&lt;span style='color:#cc0000'&gt;de votre installation de symfony &lt;/span&gt;&lt;span style='color:orange'&gt;/homez.123/monnom/symfony-1.4/data/bin/web/sf/ &lt;/span&gt;&lt;span style='color:#cc0000'&gt;sans quoi vous n'aurez pas les petites images intégrées du framework notamment utilisé par la debug bar.&lt;br/&gt;&lt;br/&gt;Désormais, il ne reste qu'une seule chose à faire, le .htaccess&lt;br/&gt;&lt;/span&gt;&lt;span style='color:#a64d79'&gt;Créez un fichier dans le dossier&lt;/span&gt;&lt;span style='color:#cc0000'&gt;&lt;br /&gt;				&lt;/span&gt;&lt;span style='color:orange'&gt;/www&lt;/span&gt;&lt;span style='color:#cc0000'&gt; que vous appelerez .htaccess et mettez ca dedans :&lt;/span&gt;&lt;span style='color:#a64d79'&gt;Assurez vous que les dossiers&lt;/span&gt;&lt;span style='color:#cc0000'&gt;&lt;br /&gt;				&lt;/span&gt;&lt;span style='color:orange; background-color:white'&gt;/cache&lt;/span&gt;&lt;span style='color:#cc0000'&gt; et &lt;/span&gt;&lt;span style='color:orange'&gt;/log&lt;/span&gt;&lt;span style='color:#cc0000'&gt; soient bien vides et que les droits sont bien à 775 ou 777&lt;br/&gt;puis &lt;/span&gt;&lt;span style='color:#a64d79'&gt;profitez de votre site&lt;/span&gt;&lt;span style='color:#cc0000'&gt;.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2665031807273538665?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2665031807273538665/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/05/symfony-sur-mutualise-ovh-1-etc-la.html#comment-form' title='7 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2665031807273538665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2665031807273538665'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/05/symfony-sur-mutualise-ovh-1-etc-la.html' title='Symfony sur mutualisé (OVH, 1&amp;amp;1 etc) = La solution'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-1597947141944540426</id><published>2010-05-17T22:03:00.001+02:00</published><updated>2010-05-17T22:03:26.086+02:00</updated><title type='text'>Les 100 meilleurs scripts JS !</title><content type='html'>http://www.neurosoftware.ro/wp/elvis/javascript/100-best-javascript-resources/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-1597947141944540426?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/1597947141944540426/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/05/les-100-meilleurs-scripts-js.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1597947141944540426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1597947141944540426'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/05/les-100-meilleurs-scripts-js.html' title='Les 100 meilleurs scripts JS !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7368235234304446234</id><published>2010-03-27T00:02:00.000+01:00</published><updated>2010-03-29T14:38:56.192+02:00</updated><title type='text'>[JQUERY] Drag'n Drop - Plugin de fou !</title><content type='html'>Je viens de découvrir ce plugin, &lt;strike&gt;je vais me pencher dessus la semaine prochaine.. &lt;/strike&gt;... En fait, je n'en ai plus l'utilité, il faut utiliser ce genre de plugin avec précaution si on ne veut pas perdre ses visiteurs dans un process trop compliqué.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://threedubmedia.com/demo/drop/"&gt;Plugin Drag Drop - Jquery&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7368235234304446234?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7368235234304446234/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/jquery-dragn-drop-plugin-de-fou.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7368235234304446234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7368235234304446234'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/jquery-dragn-drop-plugin-de-fou.html' title='[JQUERY] Drag&apos;n Drop - Plugin de fou !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-5545415484984531225</id><published>2010-03-24T15:47:00.000+01:00</published><updated>2010-03-24T15:59:31.437+01:00</updated><title type='text'>[SYMFONY][FACEBOOK] Récupérer les informations de profil : FACEBOOK CONNECT</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Pour récupérer les informations de l'utilisateur lorsqu'il s'enregistre à votre site ou bien en appuyant sur un bouton "remplir automatiquement mon profile", il faut créer une fonction qui va faire ca pour nous.&lt;br /&gt;&lt;br /&gt;J'ai mis cette fonction dans la classe sfFacebook, c'est pour moi le plus logique :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;public static function&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt; &lt;/span&gt;&lt;b&gt;updateSfGuardUserWithFacebookAccount&lt;/b&gt;(&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUser&lt;/span&gt;) {&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt; =&amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUser&lt;/span&gt;-&amp;gt;getProfile();&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;&amp;nbsp;= sfFacebook::getFacebookApi()-&amp;gt;users_getInfo(&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;getFacebookUid(), array(&lt;span class="Apple-style-span" style="color: orange;"&gt;"first_name", "last_name", "username", "birthday_date", "email_hashes", "proxied_email", "sex", "pic", "pic_small", "relationship_status", "current_location", "activities", "interests", "music", "tv", "movies", "books", "website"&lt;/span&gt;));&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setFirstName(&lt;span class="Apple-style-span" style="color: #660000;"&gt;$infos&lt;/span&gt;[0]["first_name"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setLastName($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["last_name"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setEmailHash(serialize($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["email_hashes"]));&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setEmail($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["proxied_email"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setBirthdayDate($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["birthday_date"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setSex($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["sex"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setPic($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["pic"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setPicSmall($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["pic_small"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setRelationshipStatus($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["relationship_status"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setActivities($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["activities"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setInterests($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["interests"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setMusic($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["music"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setTv($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["tv"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setMovies($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["movies"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setBooks($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["books"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;setWebsite($&lt;span class="Apple-style-span" style="color: #660000;"&gt;infos&lt;/span&gt;[0]["website"]);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #660000;"&gt;$sfGuardUserProfile&lt;/span&gt;-&amp;gt;save();&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/blockquote&gt;&lt;/blockquote&gt;&amp;nbsp;Ensuite il faut simplement appeler cette fonction, soit avec le déclencheur onlogin="" sur le bouton facebook connect, soit avec une fonction jquery :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;function updateProfileWithFacebook() {&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;$.ajax({&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;url: '/sfFacebookConnectAuth/UpdateGuardWithFBProfile',&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;success: function(profile) { $(".profile").html(profile);&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;makeEditableField();},&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;error: function(e) { alert("Une erreur est survenue. Nous n'arrivons pas à contacter les serveurs de Facebook. Merci de bien vouloir nous excuser pour ce désagrément et réessayer plus tard." &amp;nbsp; e); }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;});&lt;/blockquote&gt;&lt;blockquote&gt;}&lt;/blockquote&gt;Vous pouvez trouver la liste des informations récuperables &lt;a href="http://wiki.developers.facebook.com/index.php/User_%28FQL%29"&gt;ici&lt;/a&gt;&lt;br /&gt;Enjoy !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-5545415484984531225?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/5545415484984531225/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/symfonyfacebook-recuperer-les.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5545415484984531225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5545415484984531225'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/symfonyfacebook-recuperer-les.html' title='[SYMFONY][FACEBOOK] Récupérer les informations de profil : FACEBOOK CONNECT'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-5143809295809301898</id><published>2010-03-15T09:00:00.000+01:00</published><updated>2010-03-24T15:48:46.560+01:00</updated><title type='text'>[SYMFONY][FACEBOOK] Proposer aux visiteurs de s'identifier en un simple clic : FACEBOOK CONNECT</title><content type='html'>&lt;b&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;Se connecter à un site en clic est si pratique !&lt;/span&gt;&lt;/b&gt; Plus besoin pour vos utilisateurs de passer 2 minutes à remplir le formulaire d'inscription et d'aller cliquer sur lien recu dans l'email de confirmation bal bla !&lt;br /&gt;On connaissait Open ID qui permettait déjà de faire ca, cependant, OpenId ca ne parle pas à grand monde alors que &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;&lt;b&gt;Facebook &lt;/b&gt;! &lt;/span&gt;est completement et omiprésent sur le web.&lt;br /&gt;&lt;br /&gt;Facebook pense à nous, developpeurs de sites 2.0, pour nous rendre cette tache possible.&lt;br /&gt;&lt;b&gt;Symfony pense à nous, développeurs fainéants, pour nous rendre cette tache facile et complete !&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;aussi avant d'installer notre fameux plugin, on doit avoir installé le plugin sfDoctrineGuard (marche aussi avec les autres version de sfGuard)&lt;br /&gt;&lt;blockquote&gt;INSTALLEZ sfGuard AVANT D'INCLURE LE FACEBOOK CONNECT&lt;/blockquote&gt;Une fois que c'est fait, on installe le plugin sfFacebookConnect&lt;br /&gt;Pour d'autres (plus amples) informations, vous pouvez vous rendre sur la page du&amp;nbsp;&lt;a href="http://www.symfony-project.org/plugins/sfFacebookConnectPlugin"&gt;Plugin sfFacebook &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: 14px; line-height: 19px;"&gt;&lt;pre class="command-line" style="background-color: black; color: white; font-family: 'Bitstream Vera Sans Mono', monospace; font-size: 13px; line-height: 17px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 0,5em; padding-left: 1em; padding-right: 0px; padding-top: 0,5em;"&gt;&lt;code style="font-family: 'Bitstream Vera Sans Mono', monospace;"&gt;svn co http://svn.symfony-project.com/plugins/sfFacebookConnectPlugin/trunk sfFacebookConnectPlugin&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/blockquote&gt;Ensuite créer vous une application sur &lt;a href="http://www.facebook.com/developers/"&gt;Facebook/developpers&lt;/a&gt;&lt;br /&gt;Vous devez renseigner les champs suivants :&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Connect Url :&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;http://&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: orange;"&gt;mon.url&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;/ &amp;nbsp;// doit finir par un slash&lt;/blockquote&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Base Domain :&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: orange;"&gt;mon.url&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;ATTENTION : Ceci est choisi d'une certaine facon. Il faut plusieurs choses : que votre&lt;b&gt; &lt;/b&gt;&lt;span class="Apple-style-span" style="background-color: orange;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;mon.url&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;soit en ligne (pas de fichier particulier à inclure sur le site en ligne, Facebook va le pinger, c'est tout). Si vous voulez, comme moi, programmer et tester le plugin en local, vous pouvez modifier votre fichier hosts (qui se trouve ici&amp;nbsp;sous linux&amp;nbsp;: /etc/hosts) et rajoutant la ligne 127.0.0.1 &lt;span class="Apple-style-span" style="background-color: #3d85c6;"&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;local.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: orange;"&gt;mon.url&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;Ainsi, vous garderez votre accès internet pour votre site en ligne et vous aurez accès à votre site local avec l'adresse&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: white;"&gt;&lt;span class="Apple-style-span" style="background-color: orange;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: #3d85c6;"&gt;local.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;mon.url&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;. Evidement, votre virtual host doit être fonctionnel mais ca je ne m'en fait pas pour vous.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Une fois l'application créer, on va faire en sorte que nos fichiers de configuration autorise le plugin à être utilisé :&lt;br /&gt;Dans le fichier settings.yml, ajoutez sfFacebookConnectAuth à la ligne enabled_modules :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;all:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;.settings:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;enabled_modules: &amp;nbsp; &amp;nbsp; &amp;nbsp;[default, sfGuardAuth, sfFacebookConnectAuth]&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;login_module: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BasesfFacebookConnectAuthActions&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;login_action: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; executeAjaxSignin&lt;/blockquote&gt;Ensuite modifiez votre fichier app.yml :&lt;br /&gt;&lt;blockquote&gt;all:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;facebook:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;api_key: &amp;nbsp;votre_api_key&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;api_secret: votre_api_secret&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;api_id: votre_app_id&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;redirect_after_connect: false&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;redirect_after_connect_url: ''&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;connect_signin_url: 'sfFacebookConnectAuth/signin'&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;app_url: '/my-app'&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;guard_adapter: ~&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;js_framework: jQuery&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;sf_guard_plugin:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;profile_class: sfGuardUserProfile&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;profile_field_name: user_id&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;profile_facebook_uid_name: facebook_uid&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;profile_email_name: email&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;profile_email_hash_name: email_hash&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;facebook_connect:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;load_routing: &amp;nbsp; &amp;nbsp; true&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;user_permissions: []&amp;nbsp;&lt;/blockquote&gt;&lt;br /&gt;Allez ensuite dans le fichier &lt;span class="Apple-style-span" style="color: #e06666;"&gt;/plugins/sfDoctrineGuardPlugin/config/doctrine/schema.yml&lt;/span&gt;&lt;br /&gt;Pour qu'on puisse stocker les informations de profil du nouvel utilisateur, il va falloir &amp;nbsp;une nouvelle table dans la base de données, la table sf_guard_user_profile et la lier avec la table sf_guard_user...&lt;br /&gt;Voilà donc les modifications à apporter :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sfGuardUserProfile:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;tableName: &amp;nbsp; &amp;nbsp; sf_guard_user_profile&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;columns:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;user_id: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: integer(4), notnull: true }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;first_name: &amp;nbsp; &amp;nbsp; &amp;nbsp; { type: string(30) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;last_name: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: string(30) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;facebook_uid: &amp;nbsp; &amp;nbsp; { type: string(20) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;email: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;email_hash: &amp;nbsp; &amp;nbsp; &amp;nbsp; { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;birthday_date : &amp;nbsp; { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sex: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pic: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;pic_small: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{ type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;relationship_status : { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;current_location &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;activities &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;interests &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;music &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;tv &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;movies &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;books &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;local &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;books &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;website &amp;nbsp;: { type: string(255) }&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;indexes:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;facebook_uid_index:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;fields: [facebook_uid]&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;unique: true&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;email_index:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;fields: [email]&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;unique: true&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;email_hash_index:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;fields: [email_hash]&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;unique: true&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;relations:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;sfGuardUser:&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;type: one&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;foreignType: one&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;class: sfGuardUser&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;local: user_id&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;foreign: id&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;onDelete: cascade&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;foreignAlias: Profile&lt;/blockquote&gt;Evidement, il faut dire à Doctrine de construire la nouvelle table et les relations associées :&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;&lt;b&gt;symfony Doctrine:build --all --and-load --no-confirmation&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;Allez ensuite dans /apps/frontend/lib/myUser.class.php&lt;br /&gt;et faites étendre la classe&lt;br /&gt;&lt;blockquote&gt;class myUser extends sfFacebookUser{}&lt;/blockquote&gt;Voilà, la configuration du plugin est finie.&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: #6aa84f;"&gt;&lt;span class="Apple-style-span" style="color: yellow;"&gt;&amp;nbsp;U T I L I S O N S &amp;nbsp; L E &amp;nbsp; M A I N T E N A N T &amp;nbsp;!&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;J'imagine et j'espère que vous utilisez un layout, avec Facebook Connect, l'utilisation du layout facilite grandement l'intégration du plugin.&lt;/span&gt;&lt;br /&gt;Ouvre votre &lt;span class="Apple-style-span" style="color: #e06666;"&gt;/apps/frontend/templates/layout.php&lt;/span&gt;&lt;br /&gt;Insérez ces lignes dans la balise head:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;script type="text/javascript" src="/sfFacebookConnectPlugin/js/animation/animation.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;?php use_helper('sfFacebookConnect'); ?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;?php include_bottom_facebook_connect_script();?&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;Ensuite, on veut proposer un lien à l'utilisateur pour se connecter en 1 clic à notre site.&lt;br /&gt;On va donc vérifier que l'utilisateur n'est pas connecté au site pour lui proposer ce boutton :&lt;br /&gt;Toujours dans layout, car c'est un élement que vraissemblablement, on veut voir sur toutes les pages :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;?php&amp;nbsp;if (!$sf_user-&amp;gt;isAuthenticated()) {&lt;/blockquote&gt;&lt;blockquote&gt;?&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;fb:login-button v="2" size="medium"&amp;gt;Se connecter avec Facebook&amp;lt;/fb:login-button&amp;gt;&lt;/blockquote&gt;&lt;blockquote&gt;&amp;lt;?php&lt;/blockquote&gt;&lt;blockquote&gt;}else{&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; echo "hello";&lt;/blockquote&gt;&lt;blockquote&gt;}&amp;nbsp;?&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;A ce niveau là, un simple clic sur le bouton, vérifiera si l'utilisateur est déjà connecté à facebook, sinon il lui proposera d'entrer ses identifiants. S'il s'identifie correctement dans le formulaire facebook, il est alors immédiatement identifié sur votre site.&lt;br /&gt;Et si l'on va voir dans la base de données, on voit qu'un nouvel utilisateur nommé Facebook-012345678 vient d'être créé et qu'il a aussi un profile.&lt;br /&gt;Mais là, ( Suprise ! ho !) le profile est vierge. Seul l'uid est récupéré.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;J'ai longtemps cherché la solution mais en fait ca parait logique. On ne sait pas a l'avance ce que vous voulez récupérer pour votre application et de base on dit que vous ne voulez seulement connecter un utilisateur.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Mais moi, je veux récupérer beaucoup plus de choses que cela, c'est pour cette raison que j'ai créé un modèle pour sf_guard_user_profile avec tous ces champs (sex, brithday_date etc...).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour faire ceci, vous pouvez suivre ce tuto : &lt;a href="http://lenybernard.blogspot.com/2010/03/symfonyfacebook-recuperer-les.html"&gt;Récupérer les informations des utilisateurs FacebookConnect&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.symfony-project.org/more-with-symfony/1_4/fr/12-Developing-for-Facebook"&gt;http://www.symfony-project.org/more-with-symfony/1_4/fr/12-Developing-for-Facebook&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.fruitsoftware.com/2010/01/facebook-connect-friends-et-autres-plaisirs/"&gt;http://blog.fruitsoftware.com/2010/01/facebook-connect-friends-et-autres-plaisirs/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-5143809295809301898?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/5143809295809301898/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/proposer-aux-visiteurs-de-sidentifier.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5143809295809301898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/5143809295809301898'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/proposer-aux-visiteurs-de-sidentifier.html' title='[SYMFONY][FACEBOOK] Proposer aux visiteurs de s&apos;identifier en un simple clic : FACEBOOK CONNECT'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-820602115317640303</id><published>2010-03-10T21:30:00.000+01:00</published><updated>2010-03-10T22:29:55.922+01:00</updated><title type='text'>[SYMFONY] Insérer le formulaire de login dans le frontend</title><content type='html'>Voici un blog assez génial que je viens de découvrir, il explique notamment comment insérer le formulaire de login dans le frontend.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.clementdelmas.fr/blog/developpement-web/symfony/formulaire-dauthentification-pour-frontend-avec-sfguardplugin/comment-page-1#comment-9"&gt;&lt;span style="color: #e06666;"&gt;http://www.clementdelmas.fr/blog/developpement-web/symfony/formulaire-dauthentification-pour-frontend-avec-sfguardplugin/comment-page-1#comment-9&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="post-content right-col"&gt;&lt;h2&gt;&lt;a href="http://www.clementdelmas.fr/blog/developpement-web/symfony/formulaire-dauthentification-pour-frontend-avec-sfguardplugin" rel="bookmark" title="Formulaire d’authentification pour frontend avec sfGuardPlugin"&gt;Formulaire d’authentification pour frontend avec sfGuardPlugin&lt;/a&gt;&lt;/h2&gt;Dans la série «&amp;nbsp;je déterre des tutos que j’ai rédigé l’an dernier&amp;nbsp;», voilà un tutoriel fait pour &lt;a href="http://www.clementdelmas.fr/blog/tag/symfony"&gt;symfony&lt;/a&gt;. Il a été rédigé pour la 1.2, mais je pense qu’il doit être encore compatible pour 1.4 (à vérifier quand même). Le but de ce tutoriel est de vous montrer comment faire, simplement et rapidement, un formulaire d’authentification pour l’application frontend, dans un component, le tout avec &lt;a href="http://www.clementdelmas.fr/blog/tag/sfGuardPlugin"&gt;sfGuardPlugin&lt;/a&gt; (ouf!). Je vous invite à lire au passage, la &lt;a href="http://www.symfony-project.org/plugins/sfGuardPlugin"&gt;documentation du plugin&lt;/a&gt; et un &lt;a href="http://www.symfony-project.org/book/1_2/07-Inside-the-View-Layer#chapter_07_component_slots"&gt;extrait du guide pour Symfony 1.2&lt;/a&gt;, qui pourront toujours vous aider / compléter cet article.&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Création du component&lt;/h3&gt;On crée un component contenant le code de l’action qu’on veut  exécuter dans le partial. Pour cela, crée un nouveau fichier components.class.php dans le module lié au component (dossier  sfGuardAuth/actions). Ensuite, on édite le fichier et on ajoute la création  du formulaire :&lt;br /&gt;&lt;blockquote&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class sfGuardAuthComponents extends sfComponents&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function executeSideSignin($request)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $class = sfConfig::get('app_sf_guard_plugin_signin_form', 'sfGuardFormSignin');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;signinForm = new $class();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Création du template&lt;/h3&gt;On crée le template du component (dans notre cas _sideSignin.php dans  le dossier sfGuardAuth/templates),&lt;br /&gt;qui permettra d’afficher le formulaire de connexion, et on l’édite:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;h2&amp;gt;Formulaire d'identification&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;lt;form id="signinForm" action="&amp;lt;?php echo url_for('@sf_guard_signin') ?&amp;gt;" method="post" class="clearfix"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="signinFields"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="signin_username"&amp;gt;Login&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="text" name="signin[username]" id="signin_username" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="signin_password"&amp;gt;Mot de passe&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="password" name="signin[password]" id="signin_password" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="checkbox" name="signin[remember]" id="signin_remember" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;label for="signin_remember"&amp;gt;Se souvenir de moi&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="signinSubmit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;?php echo $signinForm-&amp;gt;renderHiddenFields();&lt;br /&gt;&amp;amp;nbsp; ?&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- a href="#"&amp;gt;Mot de passe oublié ?&amp;lt;/a&amp;gt; | --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;input type="submit" value="Connexion »" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Finalisation&lt;/h3&gt;Il ne reste plus qu’à l’intégrer dans le template voulu, avec le  fameux : "&lt;b&gt;include_component(’sfGuardAuth’, ’sideSignin’);&lt;/b&gt;",  vider le cache et rafraichir la page…&lt;br /&gt;Pour tester si l'utilisateur est déjà authentifié, on se sert de cette fonction : &lt;b style="color: #45818e;"&gt;if(!$sf_user-&amp;gt;isAuthenticated())&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; include_component('sfGuardAuth', 'sideSignin'); ?&amp;gt;&lt;br /&gt;&lt;br /&gt;Merci à &lt;a href="http://www.clementdelmas.fr/"&gt;clementdelmas.fr &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-820602115317640303?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/820602115317640303/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/symfony-inserer-le-formulaire-de-login.html#comment-form' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/820602115317640303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/820602115317640303'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/symfony-inserer-le-formulaire-de-login.html' title='[SYMFONY] Insérer le formulaire de login dans le frontend'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2931070284357947780</id><published>2010-03-10T21:08:00.001+01:00</published><updated>2010-03-10T21:08:18.872+01:00</updated><title type='text'>Reconnaitre n'importe quelle police</title><content type='html'>Voici un site génial pour retrouver le nom d'une police que l'on veut ! &lt;a href="http://new.myfonts.com/WhatTheFont/"&gt;&lt;span style="color: #e06666;"&gt;http://new.myfonts.com/WhatTheFont/&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2931070284357947780?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2931070284357947780/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/reconnaitre-nimporte-quelle-police.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2931070284357947780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2931070284357947780'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/reconnaitre-nimporte-quelle-police.html' title='Reconnaitre n&apos;importe quelle police'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-9147664388988983019</id><published>2010-03-09T23:02:00.000+01:00</published><updated>2010-03-09T23:06:15.866+01:00</updated><title type='text'>Gérer des utilisateurs avec SYMFONY</title><content type='html'>Voici un site très riche sur Symfony notament en ce qui concerne la gestion des utilisateurs :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.lafermeduweb.net/tutorial/la-gestion-des-droits-et-utilisateur-dans-symfony-p49.html"&gt;&lt;span class="Apple-style-span" style="color: #e06666;"&gt;&lt;b&gt;http://www.lafermeduweb.net/tutorial/la-gestion-des-droits-et-utilisateur-dans-symfony-p49.html&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.lexik.fr/blog/symfony/symfony/utilisation-de-sfuser-et-de-ses-namespaces-1053"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: #f6b26b;"&gt;http://www.lexik.fr/blog/symfony/symfony/utilisation-de-sfuser-et-de-ses-namespaces-1053&lt;/span&gt;&lt;/b&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-9147664388988983019?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/9147664388988983019/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/gerer-des-utilisateurs-avec-symfony.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9147664388988983019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9147664388988983019'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/gerer-des-utilisateurs-avec-symfony.html' title='Gérer des utilisateurs avec SYMFONY'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4639844359764360336</id><published>2010-03-08T16:34:00.000+01:00</published><updated>2010-03-26T13:13:11.156+01:00</updated><title type='text'>Stylez vos champs input type="file"</title><content type='html'>&lt;pre&gt;&lt;code&gt;C'est plutot frustrant, les input type="text" ne se style pas comme les autres....&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Vous voulez quand même les styler et vous avez bien raison. Voici une solution :&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre style="color: #6aa84f;"&gt;&lt;code&gt;&amp;nbsp;&lt;b&gt;Joignez ces styles :&lt;/b&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;label.FileLabel&lt;br /&gt;{&lt;br /&gt;    width: 79px;&lt;br /&gt;    height: 22px;&lt;br /&gt;    background: url(myIMAGE.png) 0 0 no-repeat;&lt;br /&gt;&lt;br /&gt;    display: block;&lt;br /&gt;    overflow: hidden;&lt;br /&gt;    cursor: pointer;&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;label.FileLabel input.file&lt;br /&gt;{&lt;br /&gt;    position: relative;&lt;br /&gt;    height: 100%;&lt;br /&gt;    width: auto;&lt;br /&gt;    opacity: 0;&lt;br /&gt;    -moz-opacity: 0;&lt;br /&gt;    filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;} &lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;b&gt;&lt;span style="color: #45818e;"&gt;Il faut ensuite entourer votre bouton de choix de fichier comme ceci :&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;&lt;code&gt;&amp;lt;label class="FileLabel"&amp;gt; &lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;    &amp;lt;input type="file" class="file" name="myFile"/&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;lt;/label&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Exemple :&lt;br /&gt;&lt;label class="FileLabel" style="background: url( http://www.doyoubuzz.com/images/css/base/button/logo_add_fr.gif) 0 0 no-repeat; cursor: pointer; display: block; height: 22px; overflow: hidden; width: 79px;"&gt;&lt;br /&gt;&lt;input class="file" name="myFile" style="-moz-opacity: 0; filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0); height: 100%; opacity: 0; position: relative; width: auto;" type="file" /&gt;&lt;/label&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4639844359764360336?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4639844359764360336/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/03/stylez-vos-champs-input-typefile.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4639844359764360336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4639844359764360336'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/03/stylez-vos-champs-input-typefile.html' title='Stylez vos champs input type=&quot;file&quot;'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-8965593166137181312</id><published>2010-02-25T18:29:00.000+01:00</published><updated>2010-02-25T18:31:02.802+01:00</updated><title type='text'>Action AJAX avec Symfony et JQuery</title><content type='html'>Symfony et moi, c'est une réelle histoire d'amour technologique en ce moment.&lt;br /&gt;Voici pourquoi... Tout est d'une simplicité enfantine et instinctive.&lt;br /&gt;Ainsi pour faire quoi que ce soit, il y a toujours une solution évidente et facile.&lt;br /&gt;Voici le tuto pour appeller une action Symfony en Ajax par JQuery.&lt;br /&gt;&lt;div style="color: #a64d79;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: #a64d79;"&gt;&lt;b&gt;Tout d'abord, créons un contexte.&lt;/b&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;1.L'utilisateur clique sur un bouton.&lt;/div&gt;&lt;div style="color: #e06666;"&gt;2.Cela déclenche un évenement JQuery et donc une fonction.&lt;/div&gt;&lt;div style="color: #e06666;"&gt;3.Cette fonction envoit des données telle adresse (reliée à une action)&lt;/div&gt;&lt;div style="color: #e06666;"&gt;4.L'action éffectue une tache quelconque comme un test de valeur et renvoit la réponse&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #e06666;"&gt;1.L'utilisateur clique sur un bouton.&lt;/div&gt;&lt;br /&gt;Voici un code HTML très simple pour simuler ceci.&lt;br /&gt;&lt;blockquote&gt;&amp;lt;input id="mybutton" type="button" value="Valider"&amp;gt;&lt;/blockquote&gt;&amp;nbsp;&lt;span style="color: #e06666;"&gt;2.Cela déclenche un évenement JQuery et donc une fonction.&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #cccccc;"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="color: #cccccc;"&gt;id="mybutton" type="button" &lt;/span&gt;&lt;b&gt;onclick="myAjaxFunction()"&lt;/b&gt; &lt;span style="color: #cccccc;"&gt;value="Valider"&amp;gt; &lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;&lt;span style="color: purple;"&gt;#myJSFile.js&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: purple;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #3d85c6;"&gt;function&lt;/span&gt; &lt;b&gt;myAjaxFunction&lt;/b&gt;(){}&lt;/span&gt; &lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: #e06666;"&gt;3.Cette fonction envoit des données telle adresse (reliée à une action)&lt;/span&gt;&lt;span style="color: purple;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: purple;"&gt;#myJSFile.js&lt;/span&gt; &lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #3d85c6;"&gt;function&lt;/span&gt; &lt;b&gt;myAjaxFunction&lt;/b&gt;(){&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&lt;/span&gt; value = $(&lt;span style="color: orange;"&gt;"#myhiddenvalue"&lt;/span&gt;).val();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;$&lt;/span&gt;.post(&lt;span style="color: orange;"&gt;"myModuleName/myAction"&lt;/span&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {myParam : value},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #3d85c6;"&gt;function&lt;/span&gt;(data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&lt;span style="color: orange;"&gt;"#mybutton"&lt;/span&gt;).attr("value",data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/blockquote&gt;&lt;div style="color: #e06666;"&gt;4.L'action éffectue une tache quelconque comme un test de valeur et renvoit la réponse&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;public function&lt;/span&gt; &lt;b&gt;executeIndex&lt;/b&gt;(sfWebRequest &lt;span style="color: #660000;"&gt;$request&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;$request&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;-&amp;gt;isXmlHttpRequest())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #660000;"&gt;$myValue&lt;/span&gt; = $request-&amp;gt;getParameter('myParam');&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;if&lt;/span&gt;(&lt;span style="color: #660000;"&gt;$myValue&lt;/span&gt;==1)&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #660000;"&gt;$message&lt;/span&gt; = "super";&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #990000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;message&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #990000;"&gt;&lt;/span&gt; = "bof";&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #660000;"&gt;$this&lt;/span&gt;-&amp;gt;renderText(&lt;span style="color: #660000;"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;message&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt; &lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Ainsi, le texte du bouton va changer grace à un appel AJAX.&lt;/div&gt;&lt;div style="color: black;"&gt;Passez plus de paramètres, renvoyez au lieu d'un texte un fichier _myFileToDisplay.php (renderPartial au lieu de renderText)&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #3d85c6;"&gt;exemple :&amp;nbsp;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: #660000;"&gt;$this&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: blue;"&gt;&lt;/span&gt;-&amp;gt;renderPartial('myModuleNamle/myFileToDisplay', array(&lt;/span&gt;&lt;span style="color: black;"&gt;'message' =&amp;gt; &lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;message,&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;'hello' =&amp;gt; "coucou"&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;Pensez que lorsqu'on fait un renderPartial, le fichier doit commencer par underscore, soit ici _myFileToDisplay.php&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #e06666;"&gt;&lt;span style="color: black;"&gt;Bonne chance&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-8965593166137181312?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/8965593166137181312/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/02/action-ajax-avec-symfony-et-jquery.html#comment-form' title='21 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/8965593166137181312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/8965593166137181312'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/02/action-ajax-avec-symfony-et-jquery.html' title='Action AJAX avec Symfony et JQuery'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-1578322470253588959</id><published>2010-02-25T17:57:00.000+01:00</published><updated>2010-02-25T18:00:03.515+01:00</updated><title type='text'>Un site grace au Framework Symfony très rapidement !</title><content type='html'>Symfony 1.4 + Doctrine &lt;br /&gt;&lt;br /&gt;Symfony est un &lt;b&gt;&lt;span style="color: #b4a7d6;"&gt;framework PHP&lt;/span&gt;&lt;/b&gt; très puissant. Selon le modèle MVC et intelligement pensé, il va devenir votre allié le plus puissant !&lt;br /&gt;&lt;br /&gt;Symfony possède une &lt;b style="color: #d5a6bd;"&gt;communauté&lt;/b&gt; très développée et très active, ce qui permet de ne toujours trouver quelqu'un pour nous aider à faire ce qu'on veut.&lt;br /&gt;&lt;br /&gt;Ce sujet va donc vous montrer comment &lt;span style="color: #d5a6bd;"&gt;créer un projet et les modules&lt;/span&gt; qui vont avec.&lt;br /&gt;&lt;div style="background-color: white; color: #9fc5e8;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: #3d85c6;"&gt;&lt;i style="background-color: white;"&gt;Je recommande l'utilisation de &lt;b&gt;Netbeans 6.8&lt;/b&gt; pour faire du Symfony. En effet, un clic droit sur votre projet vous permettra d'avoir accès à une interface reliée directement au framework ! Un gain de temps et une aide précieuse.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Tout d'abord, vous devez savoir ce que vous voulez faire comme site. En général, on commence par analyser sur une feuille de papier nos attentes et on en déduit notre schéma de données (si vous n'avez pas de schéma de données, je ne penses pas que symfony soit d'une grande aide pour vous...).&lt;br /&gt;Ensuite, créez votre base de données dans phpmyadmin avec les tables qui conviennent.&lt;br /&gt;Entrez quelques données de test puis retournez dans votre IDE (netbeans).&lt;br /&gt;Faites donc un clic droit sur votre projet -&amp;gt; symfony et sélectionnez la tache :&lt;br /&gt;&lt;b&gt;&lt;span style="color: orange;"&gt;- doctrine:build-schema&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="color: #cccccc;"&gt;ce qui executera &lt;b&gt;symfony doctrine:build-schema&lt;/b&gt;&lt;/div&gt;cette commande, comme indiqué dans la fenêtre symfony de Netbeans va générer votre schéma à partir de votre base de données. Vous pouvez retrouver votre schéma dans le dossier &lt;span style="color: purple;"&gt;/config/doctrine/schema.yml&lt;/span&gt;&lt;br /&gt;Si vous voulez que vos tables (et donc vos modèles) soit "timestampable", c'est à dire qu'ils aient de base les champs "&lt;span style="color: red;"&gt;created_at&lt;/span&gt;" et "&lt;span style="color: red;"&gt;updated_at&lt;/span&gt;", il faut rajouter ceci à votre &lt;span style="color: purple;"&gt;schema.yml&lt;/span&gt; :&lt;br /&gt;# config/doctrine/schema.yml&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #3d85c6;"&gt;myModeleName:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b style="color: #3d85c6;"&gt;actAs:&lt;/b&gt;&lt;br /&gt;&lt;b style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Timestampable: ~&lt;/b&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; columns:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; name:&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; type: string(255)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; notnull:&amp;nbsp; true&lt;/span&gt;&lt;/blockquote&gt;Il est très important de respecter les tabulations (indentation) dans un fichier *.yml&lt;br /&gt;Le fait d'ajouter à notre schema ces lignes va donc générer automatiquement les 2 champs "&lt;span style="color: red;"&gt;created_at&lt;/span&gt;" et "&lt;span style="color: red;"&gt;updated_at&lt;/span&gt;" : &lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&lt;/span&gt;&lt;b style="color: #3d85c6;"&gt;actAs:&lt;/b&gt;&lt;br /&gt;&lt;b style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Timestampable: ~ &lt;/b&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;Maintenant, on va exporter les données de test de la base de données dans notre projet. Même processus que tout à l'heure, clique droit sur le projet -&amp;gt; symfony et on cherche désormais la tâche : &lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:data-dump&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="color: black;"&gt;Allez jeter un coup d'oeil dans &lt;span style="color: purple;"&gt;/data/fixtures/&lt;/span&gt;&lt;/span&gt;&lt;span style="color: purple;"&gt;data.yml&lt;/span&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Vos données sont là, prêtes à être regénérées dans votre base de données dès que vous le voudrez. Lorsque l'on modifie le schéma de données, il faut évidement reconstruire la base de données.&lt;/div&gt;&lt;div style="color: black;"&gt;Si on ajoute un champ &lt;span style="color: red;"&gt;myField&lt;/span&gt; à notre modèle &lt;span style="color: #0b5394;"&gt;myModeleName&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;span style="color: #3d85c6;"&gt;myModeleName:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #3d85c6;"&gt;actAs:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Timestampable: ~&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; columns:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; name:&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; type: string(255)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; notnull:&amp;nbsp; true&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myField:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type: int(4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notnull:false&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;Ajouter ces 3 lignes à notre schéma va donc ajouter un champ.&lt;br /&gt;Voyons si cela génère bien tout ce que l'on veut dans la base grâce à la tache&lt;br /&gt;&lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:build --all --and-load --no-confirmation&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Cette tache va recréer la base de données (&lt;span style="color: orange;"&gt;build&lt;/span&gt;) en se basant sur le schéma de données et va peupler votre base avec les enregistrements dans votre fichier &lt;span style="color: purple;"&gt;data.yml&lt;/span&gt; (&lt;span style="color: orange;"&gt;--and-load&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #666666;"&gt;L'option --no-confirmation est juste pour ne pas nous demander confirmation lors de l'execution de la requete, on sait ce qu'on fait.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La base est propre et peuplée : &lt;b style="color: #6aa84f;"&gt;OK&lt;/b&gt;&lt;br /&gt;Mais cette tache ne s'est pas occupée seulement de cela. Elle a aussi généré les modèles pour chaque table avec les accesseurs &lt;span style="color: #76a5af;"&gt;getName(), getMyField()&lt;/span&gt; etc.&lt;br /&gt;Vous pouvez voir ces fichiers dans /lib/model&lt;br /&gt;&lt;br /&gt;Voilà qui est fait en ce qui concerne la partie modèle du concept modèle vue controleur.&lt;br /&gt;&lt;br /&gt;Attaquons la partie CONTROLLEUR, les ACTIONS.&lt;br /&gt;&lt;br /&gt;Vous l'avez compris, &lt;b&gt;&lt;span style="color: red;"&gt;Symfony génère tout !&lt;/span&gt;&lt;/b&gt; Il suffit de lui dire quoi faire.&lt;br /&gt;&lt;br /&gt;Dans Symfony on distingue 3niveaux : le projet, les applications, les modules.&lt;br /&gt;projet = site&lt;br /&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;applications&lt;/span&gt;&lt;/b&gt; = parties générales du site (client/admin)&lt;br /&gt;&lt;b&gt;&lt;span style="color: #741b47;"&gt;modules&lt;/span&gt;&lt;/b&gt; = pages&lt;br /&gt;&lt;br /&gt;Pour être vraiment compris, un exemple est mieux que tout :&lt;br /&gt;- un site va en général avoir une application pour le client (frontend) et une application pour l'administration du site (backend). Frontend et backend est le jargon pour les applications. Si vous avez créé votre projet avec Netbeans 6.8 en choisissant l'option &lt;b&gt;Symfony&lt;/b&gt;, vous avez déjà du créer l'application frontend.&lt;br /&gt;&lt;br /&gt;Sinon, je ne penses pas vous étonner en vous disant qu'il faut aller dans la fenetre de symfony (clique droit sur le projet -&amp;gt; symfony).&lt;br /&gt;Choisissez la tache &lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:generate:app&lt;/span&gt;&lt;/b&gt; puis entrez le nom de l'application : &lt;b&gt;&lt;span style="color: orange;"&gt;frontend&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Voilà l'application crée, on monte d'un niveau et on génère le module.&lt;br /&gt;Clique droit -&amp;gt; Symfony -&amp;gt; &lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:generate-module&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;une commande aussi sèche n'a pas d'interet. Il faut lui donner le nom de l'application à laquelle le module va s'ajouter&lt;/span&gt;&lt;br /&gt;on ajoute donc &lt;b&gt;&lt;span style="color: #38761d;"&gt;frontend&lt;/span&gt;&lt;/b&gt; puis le nom du &lt;b&gt;&lt;span style="color: #741b47;"&gt;module&lt;/span&gt;&lt;/b&gt; puis le nom du &lt;b&gt;&lt;span style="color: #3d85c6;"&gt;modele&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;ce qui donne &lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:generate-module &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;frontend &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #741b47;"&gt;myModuleName &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #3d85c6;"&gt;myModeleName&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Je recommande d'ajouter à cette commande 2 options : &lt;span style="color: orange;"&gt;--with-show&lt;/span&gt; et &lt;span style="color: orange;"&gt;--non-verbose-templates&lt;/span&gt;&lt;br /&gt;Ce qui donne :&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;&lt;span style="color: orange;"&gt;doctrine:generate-module &lt;/span&gt;&lt;/b&gt;&lt;span style="color: orange;"&gt;--with-show&lt;/span&gt;&lt;b&gt;&lt;span style="color: orange;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style="color: orange;"&gt;--non-verbose-templates&lt;/span&gt;&lt;b&gt;&lt;span style="color: orange;"&gt; &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;frontend &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #741b47;"&gt;myModuleName &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #3d85c6;"&gt;myModeleName&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;Cela génère donc tout ce qu'il faut pour accéder à notre module.&lt;br /&gt;Aussi accédez à votre application en tapant dans la barre d'adresse de votre navigateur &lt;span style="color: purple;"&gt;http://localhost/myProjectName&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Vous verrez alors que Symfony a généré un CRUD (create, read, update, delete) pour votre module.&lt;br /&gt;&lt;br /&gt;C'est plutot puissant mais ce n'est pas encore terrible. C'est moche et ca ne convient pour l'instant que peu.&lt;br /&gt;Allons voir dans &lt;span style="color: purple;"&gt;/app/&lt;/span&gt;&lt;b&gt;&lt;span style="color: orange;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;frontend&lt;/span&gt;&lt;/b&gt;&lt;span style="color: purple;"&gt;/modules/&lt;/span&gt;&lt;b&gt;&lt;span style="color: #741b47;"&gt;myModuleName &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;On peut voir deux dossiers : &lt;span style="color: blue;"&gt;actions&lt;/span&gt; et &lt;span style="color: red;"&gt;templates&lt;/span&gt;&lt;br /&gt;Ce qui se trouve dans le dossier &lt;span style="color: purple;"&gt;templates&lt;/span&gt; seront le coté VUE de votre site alors que dans le dossier &lt;span style="color: purple;"&gt;actions&lt;/span&gt;, ce sera pleinement le controlleur, les actions du site.&lt;br /&gt;Pour l'instant de part et d'autre, nous avons les actions et template pour :&lt;br /&gt;lister les objets (&lt;span style="color: blue;"&gt;executeIndex&lt;/span&gt; et &lt;span style="color: red;"&gt;indexSuccess.php&lt;/span&gt;)&lt;br /&gt;créer un objet(&lt;span style="color: blue;"&gt;executeNew&lt;/span&gt; et &lt;span style="color: red;"&gt;newSuccess.php&lt;/span&gt;)&lt;br /&gt;editer un objet (&lt;span style="color: blue;"&gt;executeEdit&lt;/span&gt; et &lt;span style="color: red;"&gt;editSuccess.php&lt;/span&gt;)&lt;br /&gt;et voir un objet (&lt;span style="color: blue;"&gt;executeShow&lt;/span&gt; et &lt;span style="color: red;"&gt;showSuccess.php&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Il suffit de regarder dans le fichier &lt;span style="color: blue;"&gt;actions.class.php&amp;nbsp; &lt;span style="color: black;"&gt;pour voir comment les actions fonctionnent. C'est très simple, en ce qui concerne l'appel on tape le nom du module/suivi du nom de l'action soit par exemple pour lister &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #38761d;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="color: #741b47;"&gt;myModuleName&lt;/span&gt;&lt;/b&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;/&lt;span style="color: red;"&gt;index&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: blue;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Le code dedans est typique à Doctrine et est très facile à prendre en main.&lt;br /&gt;&lt;div style="color: black;"&gt;La variable $this est l'objet View. On lui affecte des variables comme ceci :&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;span style="color: #990000;"&gt;$this&lt;/span&gt;-&amp;gt;&lt;span style="color: #38761d;"&gt;myVar&lt;/span&gt; = &lt;span style="color: orange;"&gt;"my content"&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: black;"&gt;Pour l'utiliser dans la vue, il faut simplement taper &lt;span style="color: #990000;"&gt;$myVar&lt;/span&gt; : Rien de plus !&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&amp;nbsp;Attaquons nous à la Vue maintenant !&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&amp;nbsp;On a vu que c'est plutot moche de base. Pas de css, pas d'utilisation du layout.&lt;/div&gt;&lt;div style="color: black;"&gt;Voici la procédure pour utiliser le layout :&amp;nbsp;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;C'est le rôle de l'intégrateur, il s'agit de faire le css et de construire le corps des pages. Dans le dossier &lt;span style="color: purple;"&gt;modules/templates&lt;/span&gt;, un fichier s'appelle &lt;span style="color: purple;"&gt;layout.php&lt;/span&gt;. C'est celui-ci qu'il faut modifier et qui sera votre page maitre.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Dedans, vous allez devoir créer l'architecture et montrer ou doit se placer tel contenu relatif à chaque page.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Pour se faire, on utilise la header :&lt;/div&gt;&lt;br /&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&amp;lt;?php include_slot(&lt;span style="color: orange;"&gt;"mySlotName"&lt;/span&gt;, &lt;span style="color: orange;"&gt;"&amp;lt;&amp;nbsp; my default content"&lt;/span&gt;); ?&amp;gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div style="color: black;"&gt;Ce sont des marqueurs : ici se placera tel élement.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;Allons désormais dans la template &lt;span style="color: red;"&gt;indexSuccess.php&lt;/span&gt; et spécifions quel est tel ou tel contenu.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: black;"&gt;&amp;lt;php slot(&lt;span style="color: orange;"&gt;'content'&lt;/span&gt;); ?&amp;gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mon vrai contenu &lt;/div&gt;&lt;div style="color: black;"&gt;&amp;lt;php end_slot(); ?&amp;gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;C'est ainsi que les master page fonctionne, très simple.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;Donc faites votres CSS (exemple à la fin du sujet) et incluez le fichier en ajouter le nom du fichier dans le fichier &lt;span style="color: purple;"&gt;view.yml&lt;/span&gt; de votre application ou de votre module.&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="color: #444444;"&gt;Il n'existe pas par défaut dans le module mais si vous créez un dossier config dans votre module, avec un fichier view.yml, vous pouvez spécifier par exemple une feuille de style particulière pour votre module. Cette astuce est valable pour tout type de configuration.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;CSS exemple :&amp;nbsp;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;hr /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="color: black;"&gt;&lt;span style="color: #274e13;"&gt;html&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #F1F1F1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-top:30px;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #274e13;"&gt;body&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; width: 1024px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin:0 auto;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #89B1F9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: 1px #808080 dashed;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: arial;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-size: 0.7em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#header, #menu, #content, footer&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; text-align: center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 50px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#header&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 0px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #89B1F9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 215px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;h1&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border-bottom:1px solid #333333;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; color:#333333;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; display:block;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family:Georgia,"Times New Roman",Times,serif;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-size:24px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-weight:normal;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; line-height:32px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin:0 0 21px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding:0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;.clear&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; clear:both;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#content&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #89B1F9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100%;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; min-height: 275px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;img&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: 0px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#footer&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; color: #FF9900;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; text-align: center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #89B1F9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 123px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#footer a, #footer a:hover, #footer a:visited&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 0px 5px 0px 5px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; color:#FF9900;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-weight: bold;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; text-decoration: none;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;#footer #copyright&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin-top: 80px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-size: 0.8em;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; color : #999999;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; text-transform: uppercase;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;.even, .odd&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cursor: pointer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background-color: #89BAF9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 5px;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #274e13;"&gt;.odd&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background-color: #BACDFA;&lt;br /&gt;}&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-1578322470253588959?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/1578322470253588959/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/02/un-site-grace-au-framework-symfony-tres.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1578322470253588959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1578322470253588959'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/02/un-site-grace-au-framework-symfony-tres.html' title='Un site grace au Framework Symfony très rapidement !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4916770138449392220</id><published>2010-02-23T10:08:00.000+01:00</published><updated>2010-02-23T10:08:30.398+01:00</updated><title type='text'>Couleurs Pastels : tableau pour utilisation CSS rapide</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/S4Oa9UVchOI/AAAAAAAAA1w/A0c_yhQLPOg/s1600-h/pastels.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/S4Oa9UVchOI/AAAAAAAAA1w/A0c_yhQLPOg/s400/pastels.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4916770138449392220?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4916770138449392220/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2010/02/couleurs-pastels-tableau-pour.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4916770138449392220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4916770138449392220'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2010/02/couleurs-pastels-tableau-pour.html' title='Couleurs Pastels : tableau pour utilisation CSS rapide'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y2fyEhOegYQ/S4Oa9UVchOI/AAAAAAAAA1w/A0c_yhQLPOg/s72-c/pastels.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-471730014590543517</id><published>2009-12-21T11:54:00.001+01:00</published><updated>2009-12-21T11:54:57.580+01:00</updated><title type='text'>Exporter en PDF une page web</title><content type='html'>Voici une super page lorsqu'on a le besoin de sauver le contenu d'une page web. En quelques clics, vous obtenez exactement le rendu de la page web que vous désirez.&lt;br /&gt;&lt;br /&gt;-&amp;gt; &lt;span style="color: red;"&gt;http://www.web2pdfconvert.com/&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-471730014590543517?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/471730014590543517/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/12/exporter-en-pdf-une-page-web.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/471730014590543517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/471730014590543517'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/12/exporter-en-pdf-une-page-web.html' title='Exporter en PDF une page web'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3906801522893927980</id><published>2009-12-13T16:41:00.000+01:00</published><updated>2009-12-13T16:41:14.351+01:00</updated><title type='text'>INSTALLATION DE WINDOWS SUR UN UBUNTU</title><content type='html'>&amp;nbsp;Vous avez installé ubuntu puis windows seven et donc vous n'avez plus accès à votre ubuntu chéri ?&lt;br /&gt;&lt;br /&gt;&amp;nbsp;PAS DE PROBLEME, ON VA RECUPERER CA&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;Si vous n'avez pas fait la boulette encore&lt;/span&gt;&lt;/b&gt;, copiez sous ubuntu votre fichier menu.lst dans votre partition windows pour y avoir accès sous windows&lt;br /&gt;&lt;br /&gt;&lt;b style="color: red;"&gt;Si la boulette est déja faite&lt;/b&gt;, insérez un live cd d'ubuntu pour booter sous linux. Allez chercher votre fichier menu.lst et copiez le dans votre partition windows pour y avoir accès sous windows&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lancez seven, téléchargez et lancez vista boot pro. Créez un grub manager en copiant le fichier de grub de votre ubuntu, menu.lst dans celui qui a été créé en créant votre grub manager...&lt;br /&gt;Redémarrer, une nouvelle entrée apparait au multiboot :&lt;br /&gt;&lt;br /&gt;Windows Seven&lt;br /&gt;Neogrub&lt;br /&gt;Vosu pouvez maintenant booter sur les 2 !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3906801522893927980?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3906801522893927980/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/12/installation-de-windows-sur-un-ubuntu.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3906801522893927980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3906801522893927980'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/12/installation-de-windows-sur-un-ubuntu.html' title='INSTALLATION DE WINDOWS SUR UN UBUNTU'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3828396747490287059</id><published>2009-11-30T12:28:00.001+01:00</published><updated>2010-02-10T19:28:21.573+01:00</updated><title type='text'>Notes : code pour CSS spécifiques pour ie6 et ie7</title><content type='html'>Si vous avez besoin de faire deux css différents pour ie6 et ie7 utiliser ce bout de code en remplaçant le span par votre code&lt;br /&gt;&lt;span style="color: purple;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;?php&lt;br /&gt;&lt;br /&gt;if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'Firefox' ) !== FALSE ) { echo " Firefox"; }&lt;br /&gt;elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'Opera' ) !== FALSE ) { echo " Opera"; }&lt;br /&gt;elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'Safari' ) !== FALSE ) { echo "Safari"; }&lt;br /&gt;elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE' ) !== FALSE ) { echo "Internet Explorer"; }&lt;br /&gt;else { echo "navigateur non reconnu"; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: purple;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;on vérifie si la réponse du ‘HTTP_USER_AGENT’ contient bien ‘MSIE6.0′, c’est à dire qu’on détecte que c’est un IE6&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3828396747490287059?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3828396747490287059/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/11/notes-code-pour-css-specifiques-pour.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3828396747490287059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3828396747490287059'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/11/notes-code-pour-css-specifiques-pour.html' title='Notes : code pour CSS spécifiques pour ie6 et ie7'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7125261344284236080</id><published>2009-11-29T23:33:00.001+01:00</published><updated>2009-11-29T23:33:43.203+01:00</updated><title type='text'>De supers tutoriels JQuery</title><content type='html'>Il y en a un paquet : http://www.webcssdesign.com/ajax/jquery-plugins-240-tutoriels-a-decouvrir/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7125261344284236080?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7125261344284236080/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/11/de-supers-tutoriels-jquery.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7125261344284236080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7125261344284236080'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/11/de-supers-tutoriels-jquery.html' title='De supers tutoriels JQuery'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7983071261989515418</id><published>2009-11-29T00:15:00.000+01:00</published><updated>2009-11-29T00:15:29.237+01:00</updated><title type='text'>Conversion de vidéo sous linux en ligne de commande</title><content type='html'>Installer le paquet ffmpeg. Entrez ensuite dans le terminal cette commande... &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Convertir un fichier FLV en AVI:&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&amp;nbsp;ffmpeg -i mavideo.flv mavideo.avi&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Convertir un fichier AVI en FLV: ffmpeg -i mavideo.avi mavideo.flv  &lt;/li&gt;&lt;li&gt; Convertir un fichier WMV en MPEG-4 (Xvid): mencoder mavideo.wmv -ovc xvid -oac mp3lame -o mavideo.avi &lt;/li&gt;&lt;li&gt; Convertir un fichier FLV en AVI (MPEG4/DivX) en 2 passes (meilleure qualité): &lt;ul&gt;&lt;li&gt; mencoder video.flv -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -oac copy -o a.avi &lt;/li&gt;&lt;li&gt; mencoder video.flv -ovc lavc -lavcopts vcodec=mpeg4:vpass=2 -oac copy -o a.avi&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7983071261989515418?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7983071261989515418/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/11/conversion-de-video-sous-linux-en-ligne.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7983071261989515418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7983071261989515418'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/11/conversion-de-video-sous-linux-en-ligne.html' title='Conversion de vidéo sous linux en ligne de commande'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-1611410363345625894</id><published>2009-10-30T09:55:00.000+01:00</published><updated>2009-10-30T09:55:17.555+01:00</updated><title type='text'>JQUERY Un plugin génial de validation de formulaire</title><content type='html'>Bonjour !&lt;br /&gt;Aujourd'hui petit tutoriel sur un plugin de validation de formulaire. Fini la galère des formulaires validés tant bien que mal. Ici on fait ca très facilement et en un temps record.&lt;br /&gt;&lt;br /&gt;Voici le résultat qu'on obtient a la fin : &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.position-relative.net/creation/formValidator/"&gt;Validation du formulaire&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;Etape 1 :&lt;/span&gt; &lt;/b&gt;Tout d'abord, il faut télécharger les fichiers.&amp;nbsp;Il vous faut la dernière version de JQuery, le plugin en question, les feuilles CSS relatives et un petit exemple pour vous aider si jamais vous êtes perdus :&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.position-relative.net/creation/formValidator/formValidator.zip"&gt;Ficher d'exemple &lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Regardez dans l'archive (.zip), on retrouve ces élements.&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #e69138;"&gt;Etape 2 :&lt;/b&gt; Ajoutez ces lignes entre vos balises&amp;nbsp; HEAD&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div class="geshi no html"&gt;&amp;lt;link rel="stylesheet" href="css/validationEngine.jquery.css" type="text/css" media="screen" charset="utf-8" /&amp;gt;&lt;br /&gt;&amp;lt;script src="js/jquery.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;script src="js/jquery.validationEngine.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="js/jquery.validationEngine-fr.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;/div&gt;&lt;/blockquote&gt;&amp;nbsp;Le fichier jquery.validationEngine-fr.js est une extension pour les personnes utilisant un navigateur parametré en francais. Les autres auront le plugin normal, en anglais. Vous pouvez cependant le parametrer comme bon vous semble.&lt;br /&gt;&lt;div style="color: #76a5af;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b style="color: #e69138;"&gt;Etape 3 :&lt;/b&gt; Une fois les librairies et le JQuery inclus, il faut maintenant appeler la fonction de validation du formulaire sur le formulaire que vous voulez valider.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;div class="geshi no html"&gt;  &lt;div class="de1"&gt;$(document).ready(function() { &lt;/div&gt;&lt;div class="de1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#formID").validationEngine({ &lt;/div&gt;&lt;div class="de1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; success : &amp;nbsp;false, &lt;/div&gt;&lt;div class="de1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; failure : function() { callFailFunction() &amp;nbsp;} &lt;/div&gt;&lt;div class="de1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }) &lt;/div&gt;}) &lt;/div&gt;&lt;/blockquote&gt;Vous l'aurez compris, vous pouvez utiliser une classe ou un id, ici c'est le cas ou votre formulaire possède l'attribut &lt;b style="background-color: white; color: #e06666;"&gt;id="formID"&lt;/b&gt;&lt;br /&gt;Vous devez mettre ce code entre des balises &amp;lt;script type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt; ou alors dans un fichier *.js et inclus dans cette même balise avec l'attribut src="monfichier.js"&lt;br /&gt;&lt;br /&gt;&lt;b style="color: #e69138;"&gt;Dernière Etape, 5 :&lt;/b&gt;&lt;br /&gt;I ne reste plus qu'a &lt;b style="color: #351c75;"&gt;associer à chaque champ que l'on veut valider une classe spécifique&lt;/b&gt;. Par exemple, pour un champ obligatoire qui ne doit comporter que des lettres et qui ne doit pas dépasser 100 caractères :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;input class="validate[required,custom[onlyLetter],length[0,100]]" name="firstname" type="text" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&amp;nbsp;Et voilà, maintenant, vous pouvez utiliser ces arguments pour la validation de vos champs :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;strong&gt;optional&lt;/strong&gt;: &lt;strong&gt;Special:&lt;/strong&gt; Only validate when the field is not empty &lt;strong&gt;*Please call optional first&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;required&lt;/strong&gt;: Field is required&lt;br /&gt;&lt;strong&gt;length[0,100]&lt;/strong&gt; : Between x and x characters allowed&lt;br /&gt;&lt;strong&gt;maxCheckbox[7]&lt;/strong&gt; : Set the maximum checkbox autorized for a group&lt;br /&gt;&lt;strong&gt;minCheckbox[7]&lt;/strong&gt; : Set the minimum checkbox autorized for a group&lt;br /&gt;&lt;strong&gt;confirm[fieldID]&lt;/strong&gt; : Match the other field (ie:confirm password)&lt;br /&gt;&lt;strong&gt;telephone &lt;/strong&gt;: Match telephone regEx rule.&lt;br /&gt;&lt;strong&gt;email&lt;/strong&gt; : Match email regEx rule.&lt;br /&gt;&lt;strong&gt;onlyNumber&lt;/strong&gt; : Numbers only&lt;br /&gt;&lt;strong&gt;noSpecialCaracters&lt;/strong&gt; : No special characters allowed&lt;br /&gt;&lt;strong&gt;onlyLetter&lt;/strong&gt; : Letters only&lt;br /&gt;&lt;strong&gt;date&lt;/strong&gt; : Invalid date, must be in YYYY-MM-DD format&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-1611410363345625894?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/1611410363345625894/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/jquery-un-plugin-genial-de-validation.html#comment-form' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1611410363345625894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1611410363345625894'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/jquery-un-plugin-genial-de-validation.html' title='JQUERY Un plugin génial de validation de formulaire'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3933200104996760217</id><published>2009-10-24T14:40:00.000+02:00</published><updated>2009-10-24T14:40:34.015+02:00</updated><title type='text'>Installer ie6 et ie7 sur Ubuntu</title><content type='html'>Bonjour à tous!&lt;br /&gt;&lt;h4&gt;Mise en contexte&lt;/h4&gt;Ubuntero féru d’internet, vous avez votre propre blog…Cool!&lt;br /&gt;Vous décidez d’en modifier le look, et c’est là que la misère commence: de quoi à l’air votre blog, pour les surfeurs utilisant d’autre navigateurs? Comment déceler et corriger les éventuelles erreurs qui pourraient apparaître à partir d’un autre navigateur, et notamment les Internet Explorer.&lt;br /&gt;Certes, il existe des outils tels que &lt;a href="http://browsershots.org/" target="_blank" title="browsershot"&gt;celui-ci&lt;/a&gt;, qui peuvent aider, dans un premier temps, mais cela devient fastidieux d’utiliser de tel outils pour la moindre correction (surtout si vous êtes comme moi: partisan de la méthode essais/erreur !) .&lt;br /&gt;&lt;span id="more-101"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;Présentation d’ &lt;a href="http://www.tatanka.com.br/ies4linux/page/Fr/Page_D%27Accueil" target="_blank" title="ie4linux"&gt; ie4linux&lt;/a&gt;&lt;/h4&gt;Je vous propose une méthode simple pour installer Internet Explorer 6 ET Internet Explorer 7, grâce au script&lt;a href="http://www.tatanka.com.br/ies4linux/page/Fr/Page_D%27Accueil" target="_blank" title="ie4linux"&gt; ie4linux&lt;/a&gt;! Celui-ci permet l’installation rapide et facile de ces deux navigateurs, au travers d’une interface graphique.&lt;br /&gt;&lt;h4&gt;Installation d’&lt;a href="http://www.tatanka.com.br/ies4linux/page/Fr/Page_D%27Accueil" target="_blank" title="ie4linux"&gt; ie4linux&lt;/a&gt;&lt;/h4&gt;Attention, le support d’Internet Explorer 7 via ie4linux est encore en phase beta! Ne le faites que si vous êtes sûr de vous! Si votre ordinateur explose, ne vous en prenez qu’à vous même. N’oubliez pas de &lt;a href="http://splitsch.blog-libre.fr/ubuntu/sauvegarder-et-restaurer-son-systeme-gratuitement-via-partimage.html" title="un monde parfait : partimage: sauvegarder et restaurer son système"&gt;faire des sauvegarde&lt;/a&gt;, de temps en temps! Chez moi, je n’ai eu aucu problème, mais cela ne veut pas dire que vous n’en aurez pas!!! A vos risques et périls &lt;img alt=":)" class="wp-smiley" src="http://www.pastanque.be/splitsch/wp-includes/images/smilies/icon_smile.gif" /&gt; &lt;br /&gt;Pour installer ces navigateurs, certains paquets sont requis:&lt;br /&gt;En console:&lt;br /&gt;&lt;code&gt;apt-get install wine libxxf86dga1 libxxf86vm1 cabextract&lt;/code&gt;&lt;br /&gt;Ensuite, toujours en console:&lt;br /&gt;&lt;code&gt;wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-2.5beta6.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;code&gt;tar zxvf  ies4linux-2.5beta6.tar.gz&lt;/code&gt;&lt;br /&gt;&lt;code&gt;cd ies4linux-2.5beta6/&lt;/code&gt;&lt;br /&gt;&lt;code&gt;./ies4linux&lt;/code&gt;&lt;br /&gt;Cette interface apparaîtra:&lt;br /&gt;&lt;a href="http://img259.imageshack.us/my.php?image=fileddwjdqif4.jpg" target="_blank"&gt;&lt;img alt="ie4linux" border="0" src="http://img259.imageshack.us/img259/6301/fileddwjdqif4.th.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Choisissez les options qui vont bien, ensuite, cliquez sur “Advanced”:&lt;br /&gt;&lt;a href="http://img512.imageshack.us/my.php?image=filekw9lybcq4.jpg" target="_blank"&gt;&lt;img alt="ie4linux: Internet Explorer 7" border="0" src="http://img512.imageshack.us/img512/5775/filekw9lybcq4.th.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Cochez la case “7.0″ tout en bas.&lt;br /&gt;Puis, cliquez sur “Validez” et encore une fois sur “Validez”, attendez un peu que la magie opère et hop, vous avez maintenant droit à IE6 et IE7 dans menu&amp;gt;application&amp;gt;internet !&lt;br /&gt;Le look que IE7 est celui de IE6, mais le rendu est bien celui de IE7, il n’y a aucun soucis la dessus &lt;img alt=":)" class="wp-smiley" src="http://www.pastanque.be/splitsch/wp-includes/images/smilies/icon_smile.gif" /&gt;&lt;br /&gt;&lt;a href="http://img520.imageshack.us/my.php?image=filev2kzmisl0.jpg" target="_blank"&gt;&lt;img alt="Ie4linux sur Ubuntu" border="0" src="http://img520.imageshack.us/img520/802/filev2kzmisl0.th.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Désinstallation&lt;/h4&gt;Pour désinstaller ie4linux, il suffit, en console, d’exécuter le script à nouveau, mais avec un paramètre:&lt;br /&gt;&lt;code&gt;./ies4linux --uninstall&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Source : http://www.pastanque.be/splitsch/ubuntu/ie4linux-installer-internet-explorer-6-et-7-sur-ubuntu.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3933200104996760217?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3933200104996760217/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/installer-ie6-et-ie7-sur-ubuntu.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3933200104996760217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3933200104996760217'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/installer-ie6-et-ie7-sur-ubuntu.html' title='Installer ie6 et ie7 sur Ubuntu'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-1624524570938737277</id><published>2009-10-23T12:47:00.000+02:00</published><updated>2009-10-23T12:47:25.493+02:00</updated><title type='text'>Google Wave - That's now !</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.google.com/accounts/wave/wave-logo.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="https://www.google.com/accounts/wave/wave-logo.gif" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #666666; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;Qu'est ce que Google wave ??&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Si vous suivez l'actualité des technologies de l'informatique, vous avez probablement entendu parler de cette fameuse vague, Google Wave arrive et c'est pour notre plus grande plaisir !&lt;br /&gt;&lt;br /&gt;C'est une nouvelle facon de communiquer, à mi-chemin entre l'email, les chats, les forums, twitter et Netvibes.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666666; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;Je suis perdu...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: black; font-family: Arial,Helvetica,sans-serif;"&gt;A tout nouveau concept, nouveau vocabulaire. Google a créé, inventé Google Wave, voici des petites explications..&lt;br /&gt;&lt;/div&gt;&lt;span style="color: #666666; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Wave (vague)&lt;/b&gt; : une vague représente un flot de communication, avec plusieurs personnes humaines et des robots, se déroulant sur une période de temps. Ce flot de communication est lancé par un participant, à destinations d'autres participants (humains ou non). Les moyens de communication peuvent être de tous types : texte riche, images, documents, vidéos, cartes, évènements de calendrier, gadgets... Une vague est similaire aux Thread (discussions) des forums et de Gmail, aux conversations en messagerie instantanée etc.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Wavelet (vaguelette)&lt;/b&gt; : une vaguelette est une partie de vague qui peut être restreinte à certains utilisateurs. Par exemple, lors d'une discussion entre 5 amis, un couple d'ami peut vouloir discuter du même sujet mais sans que les autres n'accèdent à votre discussion. En créant une vaguelette privée, les deux personnes peuvent communiquer (en privé) tout en gardant le reste de la discussion (publique) disponible...&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Blip :&lt;/b&gt; un blip est la plus petite unité de communication d'une vague : c'est l'équivalent de ce que vous envoyez dans un mail à chaque fois que vous cliquez sur le bouton envoyer.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;Ainsi après avoir tout configuré, Google Wave s'affiche sous cette interface :&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #666666; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.zorgloob.com/uploaded_images/Google_Wave_snapshots_inbox-749903.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://www.zorgloob.com/uploaded_images/Google_Wave_snapshots_inbox-749903.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Analysons cette interface. En haut dans la colonne de gauche nous retrouvons &lt;b&gt;les habituels dossiers&lt;/b&gt; de réception et d'émission d'emails (Réception, Corbeille, Tous, Spam...) ainsi que l'accès aux paramètres. Juste en dessous, une &lt;b&gt;liste de contact&lt;/b&gt; (pour l'instant ça ressemble beaucoup à Gmail). &lt;b&gt;La seconde colonne contient les waves&lt;/b&gt; avec un sujet, une icône pour les pièces jointes (le trombone gris) et les gadgets (la pièce de puzzle verte), les contacts y participant le nombre et l'heure des messages ainsi que le nombre de blip non lus (en blanc sur fond vert). En sélectionnant une wave, elle s'affiche dans la colonne de droite. On retrouve tout en haut l&lt;b&gt;a liste des participants&lt;/b&gt;, une &lt;b&gt;barre d'outils&lt;/b&gt; et &lt;b&gt;les blips&lt;/b&gt;. Jusqu'ici rien de très original.&lt;br /&gt;&lt;h3&gt;Que puis-je faire de plus avec Google Wave ?&lt;/h3&gt;L'intérêt de Google Wave est que chaque Wave est une façon unifiée de communiquer avec ses contacts. Qu'ils soient tous hors ligne, connectés à leur messagerie instantanée, ou un savant mélange des deux, &lt;b&gt;la façon de communiquer est TOUJOURS la même&lt;/b&gt; : il suffit de cliquer sur une vague et de commencer à taper (pour le texte), glisser déposer une image (pour l'uploader), coller un lien vers youtube, flickr, etc... pour insérer une galerie ou une vidéo automatiquement. Google Wave se charge alors du reste en temps réel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Un contact est connecté ?&lt;/b&gt; Il a voir en temps réel ce que vous marquez (si vous le souhaitez et qu'il fait partie de vos destinataires), caractère par caractère, sans qu'il soit nécessaire de cliquer sur "envoyer". Il pourra même répondre ou il le souhaite (avant, au milieu ou après votre contribution) et éditer ce que vous avez dit.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Un autre contact n'est pas connecté ?&lt;/b&gt; Pas de soucis, wave enregistre le tout en temps réel, et ce destinataire pourra revoir ce que vous avez tapé (mais aussi les autres participants) et dans quel ordre grâce à une barre de temps (timeline) similaire au visionnage d'une vidéo.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.zorgloob.com/uploaded_images/Google_Wave_concurrent_edit-746850.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="420" src="http://www.zorgloob.com/uploaded_images/Google_Wave_concurrent_edit-746844.PNG" width="373" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Un des contacts est japonais et ne parle pas un mot de français ? Invitez donc un robot de traduction à votre wave, il se chargera de traduire (toujours en temps réel) ce que vous dite. Vous parlez des cours des actions de MSFT et GOOG ? Un robot financier que vous aurez invité pourra ajouter les graphes temps réel des cours des actions pour les entreprises dont vous parlez. Assez parlé de travail, organisons une soirée ! Intégrez une carte Google maps et éditez la en temps réel avec les autres participants.&lt;br /&gt;&lt;br /&gt;Vous allez me dire que c'est du Google docs en temps réel. Oui ! Mais c'est aussi du Gmail, du Google Talk, du Google calendar, du Google Maps, du Youtube, du Picasa, du Gdrive du Google Translate et du Orkut en même temps. Et même d'avantage ! Un ami est sur &lt;b&gt;twitter&lt;/b&gt; ? Pas de soucis, un robot peut intégrer ses tweets dans la vague. Un autre ami est disponible via son &lt;b&gt;téléphone mobile&lt;/b&gt; ? Un sms pourra lui envoyer toutes les informations de la discussion.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.zorgloob.com/uploaded_images/Google_Wave_map_yes_no_maybe-716331.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.zorgloob.com/uploaded_images/Google_Wave_map_yes_no_maybe-716323.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;h3&gt;Que veut Google avec Wave ?&lt;/h3&gt;Google Wave a pour objectif de devenir 3 choses : un service, une plateforme et un protocole. &lt;b&gt;Le service&lt;/b&gt;, &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; est exactement ce que vous venez de découvrir via les paragraphes précédents et les captures d'écran. &lt;b&gt;La plateforme&lt;/b&gt; est l'application derrière Google Wave et son &lt;a href="http://code.google.com/apis/wave/"&gt;API&lt;/a&gt;, open source, disponibles pour être installés par tous (pour les entreprises par exemple). Google espère ainsi que ce système soit utilisés par plusieurs grosses entités pour atteindre une masse critique rapidement. Enfin, &lt;b&gt;le protocole&lt;/b&gt; (&lt;a href="http://www.waveprotocol.org/"&gt;brouillon&lt;/a&gt; disponible) a pour but de permettre à tous les waves installés de pouvoir communiquer. Ainsi si un utilisateur de Google Wave veut parler à un utilisateur de Microsoft Wave et inviter un robot de Yahoo Wave, le tout doit savoir comment communiquer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;L'espoir de Google&lt;/b&gt; est d'attirer les développeur dans leur API Google Wave afin de générer un cercle vertueux : des développeurs font des choses cool avec Wave, plus d'utilisateurs viennent sur le service, donc nouveaux développeurs et fournisseurs de service arrivent sur la plateforme...&lt;br /&gt;&lt;br /&gt;À en croire les réactions de l'auditoire de Google I/O, la chose a été TRÈS bien accueillie. Et il est fort probable que l'ouverture de l'API ce vendredi soit un grand succès pour Google.&lt;br /&gt;&lt;h3&gt;C'est tout ce que l'on peut faire avec Wave ? Communiquer ? Mais c'est nul ça ne change rien à ce que l'on peut faire avec Gmail par exemple...&lt;br /&gt;&lt;/h3&gt;Le potentiel (mon enthousiasme) étant très fort, je vais essayer de vous présenter un autre exemple de ce qui sera possible avec wave. J'ai omis plus haut de vous parler d'une fonctionnalité intéressante, la possibilité de publier une vague. Ainsi vous pourriez rendre public le contenu d'une vague de votre choix, faire qu'elle soit indexable même autoriser d'autres utilisateur a y prendre part.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.zorgloob.com/uploaded_images/embedsample-756336.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.zorgloob.com/uploaded_images/embedsample-756329.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ainsi une vague publique mais uniquement accessible en lecture pourra constituer un de vos billet sur votre blog, que vos lecteurs liront en temps réel alors que vous serez en train de le taper avec vos co-auteurs. Une autre vague publique mais accessible en écriture pourra faire office de flux de commentaires. Les possibilités sont quasiment infinies...&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-1624524570938737277?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/1624524570938737277/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/google-wave-thats-now.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1624524570938737277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/1624524570938737277'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/google-wave-thats-now.html' title='Google Wave - That&apos;s now !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2264674357410018477</id><published>2009-10-09T10:47:00.000+02:00</published><updated>2009-10-09T10:47:35.758+02:00</updated><title type='text'>Utiliser le debugger en PHP avec Eclipse</title><content type='html'>Nous allons ici découvrir comment utiliser le débugger pour n'importe quel projet php sous eclipse.&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #741b47;"&gt;Téléchargement et copie du fichier sur votre installation.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;D'abord téléchargez le "Zend Debugger" &lt;a href="http://downloads.zend.com/pdt/server-debugger/" target="_blank"&gt;ICI&lt;/a&gt;. Prenez la dernière version correspondante à votre système d'exploitation.&lt;br /&gt;Si ce lien ne fonctionne pas, allez directement sur le site zend.com et téléchargez "zend debugger".&lt;br /&gt;&lt;br /&gt;Ensuite lorsque vous avez téléchargé ce fichier, dézippez le et allez dans le répertoire correspondant à la version de php que vous avez.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Pour connaitre votre version de php, ouvrez une console et tapez la commande php --version.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Copiez le fichier ZendDebugger.so dans le fichier que vous voulez. Peu importe. Mieux vaut cependant que vous le mettiez dans un endroit stratégique, usuel et destiné à cet usage : le dossier de librairies de PHP.&lt;br /&gt;&lt;br /&gt;Si vous etes sous ubuntu, les librairies de php se trouvent dans le répertoire qui doit ressembler à /usr/lib/php5/20060613+lfs. Attention, Ce répertoire change en fonction de votre version de php.&lt;br /&gt;&lt;br /&gt;Si vous etes sous windows, c'est soit dans program files/php5 soit dans votre installation wamp.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #741b47;"&gt;&lt;b&gt;Parametrage de votre serveur web&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Il faut ensuite éditer votre fichier php.ini.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;astuce sous ubuntu pour le trouver, tapez "locate php.ini" dans une console.&lt;br /&gt;&lt;/blockquote&gt;Lorsque vous l'avez trouvé ( ubuntu :&amp;nbsp; /etc/php5/apache2/php.ini) lancez un éditeur de texte puis ajoutez ces lignes :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[Zend]&lt;br /&gt;zend_extension="/{chemincompletversvotrefichier}/ZendDebugger.so"&lt;br /&gt;zend_debugger.allow_hosts="127.0.0.1, {AJOUTEZ ICI UNE PLAGE D'ADRESSE AUTORISEE, par exemple 192.168.1.* si votre ip est de ce style}"&lt;br /&gt;zend_debugger.expose_remotely=always&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;un petit redémarrage du serveur web est de rigueur sous ubuntu :&lt;br /&gt;&lt;blockquote&gt;/etc/init.d/apache2 restart &lt;br /&gt;&lt;/blockquote&gt;vous pouvez vérifier si votr emodule est installé en créant une petite page avec ce code &amp;lt;?php&amp;nbsp; phpinfo(); ?&amp;gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div style="color: #741b47;"&gt;&lt;b&gt;Parametrage de votre Eclipse php&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Il faut ensuite paramétrer eclipse pour utiliser le debugger correctement.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_y2fyEhOegYQ/Ss73Oe5RsAI/AAAAAAAAAc4/VMRBOdB6BhM/s1600-h/bug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_y2fyEhOegYQ/Ss73Oe5RsAI/AAAAAAAAAc4/VMRBOdB6BhM/s320/bug.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Cliquez sur la fleche à coté de l'icone en forme d'insecte puis sélectionnez&amp;nbsp; "Debug configuration".&lt;br /&gt;&lt;br /&gt;Remplir les champs&lt;br /&gt;Name,&lt;br /&gt;PHP Server-&amp;gt;New et renseignez les informations de votre serveur,&lt;br /&gt;File en rensignant n'importe quel fichier (c'est un fichier pris au hasard, ce n'est pas important).&lt;br /&gt;&lt;br /&gt;Pour utiliser Firefox comme navigateur, allez dans le menu Window-&amp;gt;Préférences-&amp;gt;General-&amp;gt;WebBrowser puis sélectionnez Use external Web Browser.&lt;br /&gt;&lt;br /&gt;Votre debugger est maintenant pret à etre utilisé avec Eclipse, Php et firefox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2264674357410018477?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2264674357410018477/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/utiliser-le-debugger-en-php-avec.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2264674357410018477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2264674357410018477'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/utiliser-le-debugger-en-php-avec.html' title='Utiliser le debugger en PHP avec Eclipse'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_y2fyEhOegYQ/Ss73Oe5RsAI/AAAAAAAAAc4/VMRBOdB6BhM/s72-c/bug.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7287627131436337845</id><published>2009-10-07T17:31:00.001+02:00</published><updated>2010-06-05T16:17:17.218+02:00</updated><title type='text'>Un beau Nuage de compétence !!!</title><content type='html'>&lt;img src="http://www.leny-bernard.com/var/users/1998/portfolios/18524/image/image_3964_big.jpg"/&gt;&lt;br /&gt;Si ca vous interesse, vous pouvez faire le votre sur cet excellent site : &lt;a href="http://tagul.com/"&gt;tagul.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7287627131436337845?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7287627131436337845/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/un-beau-nuage-de-competence.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7287627131436337845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7287627131436337845'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/un-beau-nuage-de-competence.html' title='Un beau Nuage de compétence !!!'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7588030130998041885</id><published>2009-10-06T15:10:00.000+02:00</published><updated>2009-10-06T15:10:29.321+02:00</updated><title type='text'>nFriedly</title><content type='html'>Je viens de découvrir ce site qui m'a l'air vraiment extra en ce qui concerne les ressources AJAX et JS. Tuto à gogo, c'est pas ici : &lt;a href="http://nfriedly.com/techblog/2009/06/javascript-security-ajax-json-and-twitter-callbacks/"&gt;nfriedly&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7588030130998041885?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7588030130998041885/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/10/nfriedly.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7588030130998041885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7588030130998041885'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/10/nfriedly.html' title='nFriedly'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2817057870836432027</id><published>2009-09-11T17:34:00.000+02:00</published><updated>2009-09-11T17:59:26.648+02:00</updated><title type='text'>PETITE FICHE PRATIQUE DE TURBULENCES ET DE PHP OBJET</title><content type='html'>Voici un petit récapitulatif des petits trucs, de la syntaxe et des codes intéressants :&lt;br /&gt;&lt;br /&gt;Récupérer des informations dans une base de données :&lt;br /&gt;Ce code va récupérer tous les produits présents dans la table product&lt;br /&gt;&lt;blockquote&gt;$products = Product::getFor(&amp;#39;Product&amp;#39;, array(), &amp;#39;ORDER BY id&amp;#39;);&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Ce code va récupérer le produit qui a l'identifiant indiqué :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$product = Product::getByPKey('Product','1');&lt;/blockquote&gt;Ce code va récupérer un produit qui a un prix égal à 5&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$product-&gt;load('prix = 5');&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pour remplir automatiquement un objet à partir d'un tableau ($tab[] ou $_POST[]) :&lt;br /&gt;&lt;br /&gt;Exemple de Form :&lt;br /&gt;&lt;blockquote&gt;&amp;lt;form bla bla bla&amp;gt;&lt;br /&gt;    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;product[&amp;#39;titre&amp;#39;]&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;product[&amp;#39;prix&amp;#39;]&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Traitement dans le controlleur :&lt;br /&gt;&lt;blockquote&gt;$product = new Product();&lt;br /&gt;$product-&amp;gt;setFromArray($_POST['product']);&lt;/blockquote&gt;&lt;br /&gt;Enregistrer dans la base de données un objet :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$product-&amp;gt;save();&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;tester si un dossier existe déjà et sinon le créer :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;if(!is_dir($dossier))&lt;br /&gt;mkdir($dest, 0700);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Afficher une page :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$v = new ProductView();&lt;br /&gt;$v-&amp;gt;assign(&amp;#39;products&amp;#39;,$products);&lt;br /&gt;return $v-&amp;gt;html_product_list();&lt;/blockquote&gt;&lt;br /&gt;Inclure un fichier .js ou .css :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$v-&amp;gt;assign_js(&amp;#39;lib.js&amp;#39;);&lt;br /&gt;$v-&amp;gt;assign_css(&amp;#39;list_cart.css&amp;#39;);&lt;/blockquote&gt;Récupérer une variable :&lt;br /&gt;    passée par l'URL :&lt;br /&gt;&lt;br /&gt;$product_id = $_GET[&amp;#39;product_id&amp;#39;];&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   passée par formulaire :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$product_id = $_POST[&amp;#39;product_id&amp;#39;];&lt;/blockquote&gt;enregistrée en session :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;$product_id = $_SESSION[&amp;#39;product_id&amp;#39;];&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2817057870836432027?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2817057870836432027/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/09/petite-fiche-pratique-de-turbulences-et.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2817057870836432027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2817057870836432027'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/09/petite-fiche-pratique-de-turbulences-et.html' title='PETITE FICHE PRATIQUE DE TURBULENCES ET DE PHP OBJET'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-9041973008556858495</id><published>2009-08-11T10:03:00.000+02:00</published><updated>2009-08-11T10:51:19.443+02:00</updated><title type='text'>Gérer un projet sous eclipse avec SVN</title><content type='html'>&lt;span style="color: rgb(51, 102, 255);font-size:130%;" &gt;&lt;span style="font-weight: bold;"&gt;TUTORIEL ELCIPSE : Gestion d'un projet par Subversion&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b style="font-style: italic;"&gt;Subversion&lt;/b&gt;&lt;span style="font-style: italic;"&gt; (en abrégé &lt;/span&gt;&lt;b style="font-style: italic;"&gt;svn&lt;/b&gt;&lt;span style="font-style: italic;"&gt;) est un &lt;/span&gt;&lt;span style="font-style: italic;" class="mw-redirect"&gt;système de gestion de versions&lt;/span&gt;&lt;span style="font-style: italic;"&gt;, distribué sous licence Apache et BSD. Il sert à une équipe de pouvoir partager son travail et de réstaurer le travail à un état enregistré, envoyer les données sur le serveur pour pouvoir les sauvegarder et le tester.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Cela fonctionne avec un serveur (dépôt) et se trouve sur le serveur de developpement. http://monurl/SVN On peut interroger un serveur svn par http ou par svn.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lorsqu'on veut récupérer une version complete, il faut entrer cette commande :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;svn checkout -rHEAD http://mon_url&lt;br /&gt;&lt;/blockquote&gt;Lorsqu'on veut mettre à jour le serveur avec nos données :&lt;br /&gt;&lt;br /&gt;svn commit /monfichier // bien commenter le 'commit'&lt;br /&gt;&lt;br /&gt;Lorsqu'on veut récupérer les mises à jour, on tape :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;svn update /monfichier&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;S'il y a un conflit :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;svn revert /monfichier&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Installation de subvserion.&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;sudo apt-get install subversion&lt;/blockquote&gt;2. &lt;span style="font-weight: bold;"&gt;Installation d'eclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il faut télécharger la dernière version d'eclipse qui nous interesse (pour nous php)&lt;br /&gt;&lt;a href="http://www.eclipse.org/pdt/downloads/"&gt;http://www.eclipse.org/pdt/downloads/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Installation des plugins subclipse&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il faut ensuite télécharger le plugin. Il faut se rendre sur le site de subclipse tigris &lt;a href="http://subclipse.tigris.org/"&gt;http://subclipse.tigris.org/&lt;/a&gt; et copier le lien associé au plugin subclipse dans la section download.&lt;br /&gt;Maintenant, il faut aller dans l'onglet Help d'eclipse et cliquer sur Install new software. Il faut ajouter l'url et cocher Subclipse AINSI que l'option SVNKIT.&lt;br /&gt;Redémarrer ECLIPSE. Le tour est joué.&lt;br /&gt;&lt;br /&gt;4. Il faut désormais qu'un espace SVN soit alloué à votre projet. &lt;a href="http://fr.wikipedia.org/wiki/Comparaison_des_clients_pour_Subversion"&gt;VOIR Liste de serveurs&lt;/a&gt;&lt;br /&gt;Ensuite, il faut cliquer sur Fichier -&gt; importer puis sélection SVN-&gt;checkout projects from SVN. Il faut ensuite entrer l'URL du serveur SVN. Il faut entrer ses identifiants. Le reste se fait facilement et sans rien changer normalement.&lt;br /&gt;&lt;br /&gt;5. &lt;span style="font-weight: bold;"&gt;L'application est prête à être partagée et versionnée.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-9041973008556858495?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/9041973008556858495/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/gerer-un-projet-sous-eclipse-avec-svn.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9041973008556858495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/9041973008556858495'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/gerer-un-projet-sous-eclipse-avec-svn.html' title='Gérer un projet sous eclipse avec SVN'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3346958134487285636</id><published>2009-08-06T12:26:00.000+02:00</published><updated>2009-08-06T15:10:02.407+02:00</updated><title type='text'>Framework Turbulences : TUTO 5 - Intégration de script à l'application + Utilisation d'une fonction</title><content type='html'>&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;Intégration de script à l'application&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le script utilisé est &lt;a href="http://www.doyoubuzz.com/script/lib/jquery.js"&gt;jquery.js&lt;/a&gt; . Clic droit - enregistrer la cible sous pour obtenir le fichier.&lt;br /&gt;Pour utiliser une fonction présente dans le script JQuery.js (par exemple), il faut inclure la librairie.&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Soit la librairie est pour toute l'application&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;+ dans ce cas là, le fichier doit être copié dans le dossier &lt;span style="color: rgb(255, 0, 0);"&gt;/turbapp/public/script/lib/jquery/jquery.js&lt;/span&gt;.&lt;br /&gt;+ pour insérer ce script, il faut écrire dans le fichier /turbapp/modules/layout/LayoutView.php :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;        &lt;span style="color: rgb(153, 0, 0);"&gt;$this&lt;/span&gt;-&gt;assign_js(&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; 'lib:jquery/jquery.js'&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102);font-size:78%;" &gt;// de base il va chercher dans le dossier turbapp/public/script/&lt;/span&gt;&lt;br /&gt;);&lt;/blockquote&gt;* &lt;span style="font-weight: bold;"&gt;Soit la librairie est relative à un module en particulier &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;+ dans ce cas, le fichier doit être copié dans le dossier du module &lt;span style="color: rgb(255, 0, 0);"&gt;/turbapp/modules/administrator/views/script/jquery.js&lt;/span&gt;.&lt;br /&gt;+ pour insérer ce script, il faut écrire dans la vue du module /turbapp/modules/administrator/AdministratorView.php :&lt;br /&gt;&lt;blockquote&gt;        &lt;span style="color: rgb(153, 0, 0);"&gt;$this&lt;/span&gt;-&gt;assign_js(&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; 'jquery.js'&lt;/span&gt; &lt;span style="color: rgb(102, 102, 102);font-size:78%;" &gt;// de base il va chercher dans le dossier turbapp/modules/administrator/views/script/&lt;/span&gt;&lt;br /&gt;);&lt;/blockquote&gt;Le script est maintenant chargé. Il ne reste qu'à l'utiliser.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;Utilisation d'une fonction&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;LA TEMPLATE&lt;/span&gt;&lt;br /&gt;On veut pouvoir déplacer des éléments en direct sur la page. Pour cela, une fonction éxiste dans la librairie JQuery &lt;span style="color: rgb(0, 153, 0);"&gt;Sortable&lt;/span&gt;. Cette fonction a besoin de définir quels éléments sont susceptibles d'être déplacés (quels &lt;span style="color: rgb(204, 51, 204);"&gt;"items"&lt;/span&gt; et entre quels groupes d'items &lt;span style="color: rgb(204, 51, 204);"&gt;("boxes")&lt;/span&gt;) et par quelle poignée&lt;span style="color: rgb(204, 51, 204);"&gt; ("handle")&lt;/span&gt; ils se font déplacer.&lt;br /&gt;&lt;br /&gt;On ajoute donc dans la template list.tpl les élements dont on a besoin :&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;        /turbapp/modules/administrator/views/html/list.tpl&lt;/span&gt;.&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&amp;lt;div class="maDiv"&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;hr/&amp;gt;1ere série d'admins&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;div class="maBox"&amp;gt;&lt;/span&gt;&lt;br /&gt;  {if $administrators|@count neq 0}&lt;br /&gt;      {foreach from=$administrators item=i}&lt;br /&gt;          &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;div class="&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;monItem&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;" style="background-color: red"&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&amp;lt;div class="maPoignee"&amp;gt;o&amp;lt;/div&amp;gt; &lt;/span&gt;{$i-&amp;gt;id}-{$i-&amp;gt;level}-{$i-&amp;gt;address_id}&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;      {/foreach}&lt;br /&gt;  {else}&lt;br /&gt;      &amp;lt;p&amp;gt;Aucun élément dans la liste&amp;lt;/p&amp;gt;&lt;br /&gt;  {/if}&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;  &amp;lt;hr/&amp;gt;2eme série d'admins&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;div class="maBox"&amp;gt;&lt;/span&gt;&lt;br /&gt;  {if $administrators|@count neq 0}&lt;br /&gt;      {foreach from=$administrators item=i}&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;                &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;div class="monItem" style="background-color: green"&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;&amp;lt;div class="maPoignee"&amp;gt;o&amp;lt;/div&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;{$i-&amp;gt;id}-{$i-&amp;gt;level}-{$i-&amp;gt;address_id}&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;      {/foreach}&lt;br /&gt;  {else}&lt;br /&gt;      &amp;lt;p&amp;gt;Aucun élément dans la liste&amp;lt;/p&amp;gt;&lt;br /&gt;  {/if}&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Une fois que l'on a bien formaté la template, on peut passer à l'écriture du script.&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;&lt;br /&gt;LE SCRIPT&lt;/span&gt;&lt;br /&gt;Le script &lt;a href="http://www.doyoubuzz.com/script/lib/jquery.js"&gt;jquery&lt;/a&gt; est désormais intégré à l'application ou au module.&lt;br /&gt;On veut pouvoir déplacer les utilisateurs sur la plage et les trier à notre gré.&lt;br /&gt;On créé un fichier, ou &lt;span style="font-weight: bold; color: rgb(255, 153, 0);"&gt;script&lt;/span&gt;, dans le dossier script du module :&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;        /turbapp/modules/administrator/views/script/sortable.js&lt;/span&gt;.&lt;br /&gt;dans lequel on va mettre ce code :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;$('.&lt;span style="color: rgb(51, 102, 255);"&gt;maDiv&lt;/span&gt;').sortable(&lt;br /&gt;     {items:'.&lt;span style="color: rgb(51, 102, 255);"&gt;monItem&lt;/span&gt;', boxes:'.&lt;span style="color: rgb(51, 102, 255);"&gt;maBox&lt;/span&gt;', handle:'.&lt;span style="color: rgb(51, 102, 255);"&gt;maPoignee&lt;/span&gt;'}&lt;br /&gt;);&lt;/blockquote&gt;&lt;span&gt;Ce code signifie que l'on va effectuer la fonction &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;sortable&lt;/span&gt;&lt;span&gt; sur la classe &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;maDiv&lt;/span&gt;&lt;span&gt; (il s'agira ici d'une div), que l'on pourra déplacer les élements de classe &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;monItem&lt;/span&gt;&lt;span&gt; et que ces items seront déplacables en "cliquant/déplacant" la poignée de classe &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span&gt;maPoignee.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="color: rgb(204, 51, 204); font-weight: bold;"&gt;ESSAYONS SUR UNE AUTRE FONCTION, &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;la fonction autogrow (permet d'étirer automatiquement un textarea au besoin )&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;LA TEMPLATE&lt;/span&gt;&lt;br /&gt;On veut pouvoir étirer automatiquement un textarea dans un formulaire. Pour cela, une fonction éxiste dans la librairie JQuery &lt;span style="color: rgb(0, 153, 0);"&gt;Autogrow&lt;/span&gt;. Cette fonction n'a besoin que d'un textarea pour fonctionner.&lt;br /&gt;&lt;br /&gt;On ajoute donc dans la template list.tpl un textarea :&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;        /turbapp/modules/administrator/views/html/edit.tpl&lt;/span&gt;.&lt;span style=";font-family:arial;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&amp;lt;textarea &lt;span style="color: rgb(51, 102, 255);"&gt;id="&lt;span style="color: rgb(0, 153, 0);"&gt;autogrowableTA&lt;/span&gt;"&lt;/span&gt; name="name" style="overflow: hidden; height: 105px;"&amp;gt; Test you text, that wil autogrow&lt;br /&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);"&gt;LE SCRIPT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On créé un fichier, ou &lt;span style="font-weight: bold; color: rgb(255, 153, 0);"&gt;script&lt;/span&gt;, dans le dossier script du module :&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;        /turbapp/modules/administrator/views/script/autogrow.js&lt;/span&gt;.&lt;br /&gt;dans lequel on va mettre ce code :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;$('&lt;span style="color: rgb(51, 51, 255);"&gt;#autogrowableTA&lt;/span&gt;').&lt;span style="color: rgb(0, 153, 0);"&gt;autogrow()&lt;/span&gt;;&lt;/blockquote&gt;&lt;span&gt;Ce code signifie que l'on va effectuer la fonction &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;autogrow&lt;/span&gt;&lt;span&gt; sur l'id autogrowableTA.&lt;/span&gt;&lt;span&gt; Si on voulait le faire sur tous les textarea, on aurait pu mettre simplement textarea.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3346958134487285636?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3346958134487285636/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-5.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3346958134487285636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3346958134487285636'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-5.html' title='Framework Turbulences : TUTO 5 - Intégration de script à l&apos;application + Utilisation d&apos;une fonction'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7785230691311343113</id><published>2009-08-05T16:27:00.000+02:00</published><updated>2009-08-07T15:19:37.853+02:00</updated><title type='text'>Framework Turbulences : TUTO 4 - Validation de formulaire</title><content type='html'>&lt;b&gt;&lt;span style="color: rgb(51, 102, 255);font-size:180%;" &gt;VALIDATION DE FORMULAIRE  :&lt;br /&gt;&lt;/span&gt;Le but de ce tutoriel est de protéger l'envoi d'un formulaire. Les champs qui doivent être protégés sont écrits dans le modèle. Ainsi, par exemple, un utilisateur ne peut rentrer un prénom vide.&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Ce tutoriel vient à la suite du tutoriel 3. Le module &lt;span style="color: rgb(51, 255, 51);"&gt;administrator&lt;/span&gt; doit être joint avec les modules &lt;span style="color: rgb(51, 204, 0);"&gt;address&lt;/span&gt; et &lt;span style="color: rgb(51, 204, 0);"&gt;user&lt;/span&gt;&lt;b&gt;. &lt;/b&gt;De plus&lt;b&gt; &lt;/b&gt;le formulaire edit sert à modifier les champs prénom, nom, email, niveau d'administration, rue, ville et code postal.&lt;br /&gt;&lt;br /&gt;1.Formulaire&lt;br /&gt;2.Fonction edit&lt;br /&gt;3.Remplir le modèle avec les champs obligatoires&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Remplissons tout d'abord le formulaire edit.tpl&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Il faut faire un formulaire qui récupert les données enregistrées dans la base de donnée (&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;données bleues&lt;/span&gt;&lt;/span&gt;). On affiche les erreurs SI elles existent (&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;données rouges&lt;/span&gt;&lt;/span&gt;).&lt;br /&gt;Voici le code complet et final.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;blockquote&gt;&amp;lt;form name="" method="post" action="" enctype="multipart/form-data"&amp;gt;&lt;br /&gt;  &amp;lt;!-- keep the object id in form --&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" name="id" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;id}&lt;/span&gt;" /&amp;gt;&lt;br /&gt;  &amp;lt;!-- hardcode the user type --&amp;gt;&lt;br /&gt;  &amp;lt;input type="hidden" name="user[user_type]" value="administrator" /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;fieldset&amp;gt;&lt;br /&gt;      &amp;lt;legend&amp;gt;&lt;br /&gt;          &amp;lt;div class="title"&amp;gt;&lt;br /&gt;              &amp;lt;div class="title_right"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;              Administrateur&lt;br /&gt;          &amp;lt;/div&amp;gt;&lt;br /&gt;      &amp;lt;/legend&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="lastname"&amp;gt;Nom :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="user[lastname]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;user-&amp;gt;lastname}&lt;/span&gt;"/&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.user.lastname)}{$error.user.lastname}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="firstname"&amp;gt;Prénom :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="user[firstname]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;user-&amp;gt;firstname}&lt;/span&gt;"/&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.user.firstname)}{$error.user.firstname}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="email"&amp;gt;Email :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="user[email]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;user-&amp;gt;email}&lt;/span&gt;" /&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.user.email)}{$error.user.email}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="level"&amp;gt;Level :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;textarea name="administrator[level]" style="overflow: hidden;" &amp;gt;&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;level}&lt;/span&gt;&amp;lt;/textarea&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.administrator.level)}{$error.administrator.level}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;/fieldset&amp;gt;&lt;br /&gt;  &amp;lt;fieldset&amp;gt;&lt;br /&gt;      &amp;lt;legend&amp;gt;&lt;br /&gt;          &amp;lt;div class="title"&amp;gt;&lt;br /&gt;              &amp;lt;div class="title_right"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;              Adresse&lt;br /&gt;          &amp;lt;/div&amp;gt;&lt;br /&gt;      &amp;lt;/legend&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="address"&amp;gt;Rue :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="address[address]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;address-&amp;gt;address}&lt;/span&gt;"/&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.address.address)}{$error.address.address}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="city"&amp;gt;Ville :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="address[city]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;address-&amp;gt;city}&lt;/span&gt;"/&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.address.city)}{$error.address.city}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;&amp;lt;label for="zip_code"&amp;gt;Code postal :&amp;lt;/label&amp;gt;&lt;br /&gt;      &amp;lt;input type="text" name="address[zip_code]" value="&lt;span style="color: rgb(51, 102, 255);"&gt;{$administrator-&amp;gt;address-&amp;gt;zip_code}&lt;/span&gt;" /&amp;gt;&lt;span style="color: rgb(255, 0, 0);"&gt;{if isset($error.address.zip_code)}{$error.address.zip_code}{/if}&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/fieldset&amp;gt;&lt;br /&gt;  &amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;ul&amp;gt;&lt;br /&gt;      &amp;lt;li class="reset"&amp;gt;&amp;lt;input type="reset" value="Annuler" /&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;      &amp;lt;li class="submit"&amp;gt;&amp;lt;input type="submit" value="Enregistrer les modifications" /&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;  &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;2. Controlleur&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; &lt;span style="color: rgb(102, 102, 102);"&gt;   // function to save the object for all action&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    private function _edit($view)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        $v = new AdministratorView();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        // get the object from request&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        $obj = $this-&amp;gt;getAdministratorFromRequest();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        //$obj-&amp;gt;setAccessLevel($this-&amp;gt;_access_level); // transmission of the access level to the object&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        // if request type is post&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        if($this-&amp;gt;isPost())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            // on récupert les informations concernant l'administrateur dont l'ID est passé en paramètre.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            $administrator = Administrator::getByPKey('Administrator',$_POST['id']); &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            if(!is_null($administrator))&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $field_errors = array(); // on créé un tableau qui contiendra les erreurs sur les champs.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $answer_array =array();  // on créé un tableau de réponse qui va être envoyé à la vue.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                // on récupert les informations concernant l'utilisateur dont l'id est égal au user_id de l'admin&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $user=User::getByPKey('User',$administrator-&amp;gt;user_id);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $user-&amp;gt;setFromArray($_POST['user']); // on enregistre les données&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $address=Address::getByPKey('Address',$administrator-&amp;gt;address_id); // idem que pour les users&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $address-&amp;gt;setFromArray($_POST['address']);                           // idem&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $administrator-&amp;gt;setFromArray($_POST['administrator']); // idem&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $user-&amp;gt;validate();            // on effectue validate() ici pour les 3 modules. Cette fonction&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $address-&amp;gt;validate();          // vérifie que tous les champs qui doivent etre remplis le sont.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                $administrator-&amp;gt;validate();   // si ce n'est pas le cas, il renvoit faux, sinon vrai.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                        // de plus, la fonction validate(), si elle renvoit faux permet de passer dans la fonction getError().&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                        // C'est pour cette raison que l'on utilise 2 fois pour chaque module la fonction validate()&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                if($user-&amp;gt;validate() &amp;amp;&amp;amp; $address-&amp;gt;validate() &amp;amp;&amp;amp; $administrator-&amp;gt;validate())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $user-&amp;gt;save();          // si la fonction validate() a renvoyé TRUE pour les 3 modules, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $address-&amp;gt;save();        // on peut alors enregistrer dans la base de données&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $administrator-&amp;gt;save();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $field_errors['user'] = $user-&amp;gt;getError();                 // on remplit ensuite le tableau d'erreur&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $field_errors['address'] = $address-&amp;gt;getError();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $field_errors['administrator'] = $administrator-&amp;gt;getError();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $answer_array['administrator'] = $administrator;        // puis on remplit le tableau réponse avec l'objet $adminsitrator &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    $answer_array['error'] = $field_errors;                    // ainsi qu'avec le tableau d'érreur.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                    return $v-&amp;gt;html_edit($answer_array);//récupère et affiche les erreurs s'il y en a&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                // s'il n'y a pas d'erreurs , on redirige vers action_list&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                if(isset($obj-&amp;gt;id) &amp;amp;&amp;amp; !$obj-&amp;gt;hasError())&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;                return $this-&amp;gt;action_list();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        $view = 'html_'.$view;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;        return $v-&amp;gt;$view($obj);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;3- Ecrire la fonction validate() ainsi que les champs obligatoires : &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;    public function validate()&lt;br /&gt;   {&lt;br /&gt;       $this-&gt;error = array();&lt;br /&gt; &lt;br /&gt;       foreach( $this-&gt;getAttributeNames() as $key =&gt; $attr )&lt;br /&gt;       {&lt;br /&gt;           if ( $this-&gt;$attr == '' AND $this-&gt;isMandatoryValue($attr) === TRUE ){&lt;br /&gt;               $this-&gt;error[$attr] = sprintf("Merci de renseigner le %s.", $attr);&lt;br /&gt;           }&lt;br /&gt;           else&lt;br /&gt;           {&lt;br /&gt;               $val = parent::validateThisValue($attr, $this-&gt;$attr);&lt;br /&gt;               if ( $val['message'] !== TRUE AND !is_null($attr) AND $this-&gt;$attr!=$this-&gt;_original[$key] )&lt;br /&gt;                   $this-&gt;error[$attr] = $val['error'];&lt;br /&gt;               else&lt;br /&gt;                   $this-&gt;$attr = $val['value'];&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       if(count($this-&gt;error)&gt;0)&lt;br /&gt;       return false;&lt;br /&gt;       else&lt;br /&gt;       return true;&lt;br /&gt;   }&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;    /**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;    * retourne les erreurs&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;    */&lt;/span&gt;&lt;br /&gt;   function &lt;span style="color: rgb(0, 153, 0);"&gt;getError&lt;/span&gt;()&lt;br /&gt;   {&lt;br /&gt;   return $this-&gt;error;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var &lt;span style="color: rgb(51, 51, 255);"&gt;$_mandatory&lt;/span&gt; = array(&lt;br /&gt;   'default' =&gt; array('&lt;span style="color: rgb(51, 204, 0);"&gt;firstname&lt;span style="color: rgb(0, 0, 0);"&gt;','&lt;/span&gt;lastname&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;','&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;email&lt;/span&gt;')&lt;br /&gt;   );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7785230691311343113?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7785230691311343113/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-4-validation.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7785230691311343113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7785230691311343113'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-4-validation.html' title='Framework Turbulences : TUTO 4 - Validation de formulaire'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7895577618268567039</id><published>2009-08-05T14:38:00.000+02:00</published><updated>2009-11-10T16:28:54.513+01:00</updated><title type='text'>Framework Turbulences : TUTO 3 - Validation, relations entre modèles et ACL</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Turbulences Tutorial - Chapter 3 : More models : validation, model relationships and access control&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pré-requis&lt;br /&gt;Il faut que turbulences soit &lt;a href="http://lenybernard.blogspot.com/2009/08/framework-turbulences-tutoriel.html"&gt;installé&lt;/a&gt;. Il faut créer les modules user et address de cette manière :&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;$ cd /myapp&lt;br /&gt;$ php script/generate_module.php user&lt;br /&gt;$ php script/generate_module.php address&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;Puis il faut completer les fichiers user.schema.sql et address.schema.sql :&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXISTS `user`;&lt;br /&gt;CREATE TABLE `user` (&lt;br /&gt;`id` int(10) unsigned NOT NULL auto_increment,&lt;br /&gt;`firstname` varchar(30) NOT NULL,&lt;br /&gt;`lastname` varchar(30) NOT NULL,&lt;br /&gt;`email` varchar(30) NOT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=MyISAM  DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;DROP TABLE IF EXISTS `address`;&lt;br /&gt;CREATE TABLE `address` (&lt;br /&gt;`id` int(10) unsigned NOT NULL auto_increment,&lt;br /&gt;`address` varchar(30) NOT NULL,&lt;br /&gt;`city` varchar(30) NOT NULL,&lt;br /&gt;`zip_code` int(10) NOT NULL,&lt;br /&gt;PRIMARY KEY (`id`)&lt;br /&gt;) ENGINE=MyISAM  DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Dans ce chapitre, nous allons apprendre à :&lt;br /&gt;&lt;br /&gt;* Créer un nouveau module. Créer le module Administrator.&lt;br /&gt;o Un administrator a les mêmes attributs qu'un autre utilisateur du siteweb&lt;br /&gt;o Un administrator a des attributs spécifiques en plus (niveau d'administration et adresse)&lt;br /&gt;* Gérer toutes les erreurs (administrator, user and address) en même temps&lt;br /&gt;* Gérer l'accès aux attributs pour les modèles et pour les actions des controlleurs&lt;br /&gt;&lt;br /&gt;Generation du module administrator&lt;br /&gt;&lt;br /&gt;* Grace au script de génération de module, on créé le module administrator :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;php script/generate_module.php administrator&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Créer la table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On va ajouter une table pour les attributs spécifiques des administrators, incluant toutes les clés étrangères pour les utilisateurs(user) et les adresses(address). On va juste créer un script user.schema.sql et address.schema.sql&lt;br /&gt;modules/administrator/DB/administrator.schema.sql.&lt;br /&gt;&lt;br /&gt;DROP TABLE IF EXISTS `administrator`;&lt;br /&gt;CREATE TABLE `administrator` (&lt;br /&gt;`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,&lt;br /&gt;`user_id` INT( 10 ) NOT NULL ,&lt;br /&gt;`level` ENUM( 'super-admin', 'moyen-admin', 'petit-admin' ) NOT NULL ,&lt;br /&gt;`address_id` INT( 10 ) NOT NULL ,&lt;br /&gt;PRIMARY KEY ( `id` ) ,&lt;br /&gt;INDEX ( `user_id` , `level` )&lt;br /&gt;) ENGINE=MyISAM  DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;br /&gt;Pour installer la nouvelle table, vous devez executer le nouveau script ou l'installation complete par le script habituel.&lt;br /&gt;&lt;br /&gt;mysql &lt;name database="" of="" your=""&gt; &amp;lt;&amp;gt; var $_joins = array(&lt;br /&gt;'user' =&amp;gt; array('User', array('user_id' =&amp;gt; 'id')),&lt;br /&gt;'address' =&amp;gt; array('Address', array('address_id' =&amp;gt; 'id'))&lt;br /&gt;); &lt;br /&gt;On va utiliser les jointures dans notre code pour obtenir quel utilisateur correspond à tel administrator en écrivant une formule très simple : $admin-&amp;gt;user. En ce qui concerne les adresses, c'est la même chose : $admin-&amp;gt;address. Ceci est appelé une jointure directe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Créer le controlleur&lt;/span&gt;&lt;br /&gt;&lt;/name&gt; &lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;// cette fonction renvoi un objet administrator&lt;br /&gt;// si $_GET['id'] ou $_POST['id'] est vérifié, on charge l'objet correspondant&lt;br /&gt;// sinon on retourne un objet vide&lt;br /&gt;public function getAdministratorFromRequest()&lt;br /&gt;{&lt;br /&gt;if(isset($this-&amp;gt;__get['id']) &amp;amp;&amp;amp; is_numeric($this-&amp;gt;__get['id']))&lt;br /&gt;$id = $this-&amp;gt;__get['id'];&lt;br /&gt;elseif(isset($_POST['id']) &amp;amp;&amp;amp; is_numeric($_POST['id']))&lt;br /&gt;$id = $_POST['id'];&lt;br /&gt;else&lt;br /&gt;$id = NULL;&lt;br /&gt;if(!is_null($id))&lt;br /&gt;$u = Administrator::getByPKey('Administrator',$id);&lt;br /&gt;else&lt;br /&gt;$u = new Administrator();&lt;br /&gt;return $u;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// action for general editing&lt;br /&gt;public function action_edit()&lt;br /&gt;{&lt;br /&gt;return $this-&amp;gt;_edit('edit');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// action for access_level editing&lt;br /&gt;public function action_set_level()&lt;br /&gt;{&lt;br /&gt;return $this-&amp;gt;_edit('edit');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// function to save the object for all action&lt;br /&gt;private function _edit($view)&lt;br /&gt;{&lt;br /&gt;$v = new AdministratorView();&lt;br /&gt;&lt;br /&gt;// get the object from request&lt;br /&gt;$obj = $this-&amp;gt;getAdministratorFromRequest();&lt;br /&gt;&lt;br /&gt;// if request type is post&lt;br /&gt;if($this-&amp;gt;isPost())&lt;br /&gt;{&lt;br /&gt;$administrator = Administrator::getByPKey('Administrator',$_POST['id']);&lt;br /&gt;&lt;br /&gt;if(!is_null($administrator))&lt;br /&gt;{&lt;br /&gt;//mise à jour de ce champs avec les données send en POST&lt;br /&gt;$administrator-&amp;gt;setFromArray($_POST['administrator']);&lt;br /&gt;$administrator-&amp;gt;update();&lt;br /&gt;&lt;br /&gt;//maj du user associé au champ administrator modifié&lt;br /&gt;$user=User::getByPKey('User',$administrator-&amp;gt;user_id);&lt;br /&gt;$user-&amp;gt;setFromArray($_POST['user']);&lt;br /&gt;$user-&amp;gt;update();&lt;br /&gt;&lt;br /&gt;//maj de l'addresse associée au champ administrator modifié&lt;br /&gt;$address = Address::getByPKey('Address',$administrator-&amp;gt;address_id);&lt;br /&gt;$address-&amp;gt;setFromArray($_POST['address']);&lt;br /&gt;$address-&amp;gt;update();&lt;br /&gt;}&lt;br /&gt;// if no arrors , redirect to action_list&lt;br /&gt;if(isset($obj-&amp;gt;id) &amp;amp;&amp;amp; !$obj-&amp;gt;hasError())&lt;br /&gt;return $this-&amp;gt;action_list();&lt;br /&gt;}&lt;br /&gt;// render the asked view and pass the object&lt;br /&gt;$view = 'html_'.$view;&lt;br /&gt;return $v-&amp;gt;$view($obj);&lt;br /&gt;}&lt;br /&gt;// action for listing&lt;br /&gt;public function action_list()&lt;br /&gt;{&lt;br /&gt;$v = new AdministratorView();&lt;br /&gt;$objs = Administrator::getFor('Administrator');&lt;br /&gt;return $v-&amp;gt;html_list($objs);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;On peut maintenant tester la méthode de listage des administrators en tapant &lt;a href="http://turbapp/administrator/list"&gt;http://turbapp/administrator/list&lt;/a&gt;&lt;br /&gt;&lt;h2 id="SomeCRUD"&gt;Les actions basiques : C&lt;span style="font-size: 78%;"&gt;reate&lt;/span&gt;R&lt;span style="font-size: 78%;"&gt;ead&lt;/span&gt;U&lt;span style="font-size: 78%;"&gt;pdate&lt;/span&gt;D&lt;span style="font-size: 78%;"&gt;elete&lt;/span&gt;&lt;/h2&gt;* En ce qui concerne les vues, elles passent simplement l'objet entier ou un tableau d'objets&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;public function _edit($obj)&lt;br /&gt;{&lt;br /&gt;$this-&amp;gt;assign('administrator',$obj);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function _list($objs)&lt;br /&gt;{&lt;br /&gt;$this-&amp;gt;assign('administrators',$objs);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;* La template edit.tpl -- (les widgets sont des plugins smarty)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: 85%;"&gt;&amp;lt;!-- Widget to print all errors on our object, including dependant objects --&amp;gt;&lt;br /&gt;{wdgt_print_object_error object=$administrator}&lt;br /&gt;&lt;br /&gt;&amp;lt;form name="" method="post" action="" enctype="multipart/form-data"&amp;gt;&lt;br /&gt;&amp;lt;!-- keep the object id in form --&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="id" value="{$administrator-&amp;gt;id}" /&amp;gt;&lt;br /&gt;&amp;lt;!-- hardcode the user type --&amp;gt;&lt;br /&gt;&amp;lt;input type="hidden" name="user[user_type]" value="administrator" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;&lt;br /&gt;&amp;lt;div class="title"&amp;gt;&lt;br /&gt;&amp;lt;div class="title_right"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;Administrateur&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;!-- following widget print all inputs, regarding the access_level defined in models (cf following points) --&amp;gt;&lt;br /&gt;{wdgt_input object=$administrator-&amp;gt;user field='lastname' label='Nom'}&lt;br /&gt;{wdgt_input object=$administrator-&amp;gt;user field='firstname' label='Prénom'}&lt;br /&gt;{wdgt_input object=$administrator-&amp;gt;user field='email' label='Email'}&lt;br /&gt;{wdgt_select object=$administrator field='level' label='Niveau d\'admistration'}&lt;br /&gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;&lt;br /&gt;&amp;lt;div class="title"&amp;gt;&lt;br /&gt;&amp;lt;div class="title_right"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;Adresse&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;!-- following widget print all inputs, regarding the access_level defined in models (cf following points) --&amp;gt;&lt;br /&gt;{wdgt_input field=address object=$administrator-&amp;gt;address prefix_name=address label='Adresse'}&lt;br /&gt;{wdgt_input field=city object=$administrator-&amp;gt;address prefix_name=address label='Ville'}&lt;br /&gt;{wdgt_input field=zip_code object=$administrator-&amp;gt;address prefix_name=address label='Code postal'}&lt;br /&gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;&amp;lt;li class="reset"&amp;gt;&amp;lt;input type="reset" value="Annuler" /&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;li class="submit"&amp;gt;&amp;lt;input type="submit" value="Enregistrer les modifications" /&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;/pre&gt;* Maintenant, on peut tester le module insert/edit en tapant ceci : &lt;a href="http://turbapp/administrator/edit/?id=1"&gt;http://turbapp/administrator/edit/?id=1&lt;/a&gt;&lt;br /&gt;&lt;h2 id="Accesscontrol"&gt;Controle d'accès : ACL&lt;br /&gt;&lt;/h2&gt;* On va gerer les accès aux champs du modele. On va utiliser un simple modèle de sécurité : les Access Control List (ACL)&lt;br /&gt;&lt;br /&gt;Premièrement, le controlleur doit propager les _access_level aux objets (_access_level est le type d'utilisateur dans la session) &lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;private function _edit($view)&lt;br /&gt;{&lt;br /&gt;$v = new AdministratorView();&lt;br /&gt;&lt;br /&gt;$obj = $this-&amp;gt;getAdministratorFromRequest();&lt;br /&gt;&lt;br /&gt;// HERE&lt;br /&gt;&lt;span style="color: red;"&gt;$obj-&amp;gt;setAccessLevel($this-&amp;gt;_access_level); // transmission of the access level to the object&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;if($this-&amp;gt;isPost())&lt;br /&gt;{&lt;br /&gt;$obj-&amp;gt;setFromArray($_POST);&lt;br /&gt;$obj-&amp;gt;saveDependantObjects();&lt;br /&gt;if(isset($obj-&amp;gt;id) &amp;amp;&amp;amp; !$obj-&amp;gt;hasError())&lt;br /&gt;return $this-&amp;gt;action_list();&lt;br /&gt;}&lt;br /&gt;$view = 'html_'.$view;&lt;br /&gt;return $v-&amp;gt;$view($obj);&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;On doit définir les règles de lecture d'un champ d'édition. Si vous êtes admin, vous allez pouvoir lire et écrire : admin_read et admin_write. On voit que seul un administrateur ne peut parametrer le niveau d'un administrateur, le default_access ne peut le faire.&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;var $_access_limit = array(&lt;br /&gt;'default_read'      =&amp;gt; array(),&lt;br /&gt;'default_write'      =&amp;gt; array('level'),&lt;br /&gt;'admin_read' =&amp;gt; array(),&lt;br /&gt;'admin_write' =&amp;gt; array(),&lt;br /&gt;);&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;* On peut définir les access_level pour toutes les actions du controlleur. Si l'access_level courant ne peut acceder à l'action, il est redirigé vers &lt;span style="color: red;"&gt;ErrorController::access_not_allowed &lt;/span&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;administrator.php&lt;br /&gt;&lt;blockquote&gt;var $_allowed_access_level = array(&lt;br /&gt;'edit' =&amp;gt; array('admin','default'),&lt;br /&gt;'set_level' =&amp;gt; array('admin'),&lt;br /&gt;);&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;public function action_set_level()&lt;br /&gt;{&lt;br /&gt;return $this-&amp;gt;_edit('edit');&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;Vous pouvez maintenant tester l'ACL : seulement les administrateurs sont capable d'accéder à &lt;a href="http://turbapp/administrator/set_level"&gt;http://turbapp/administrator/set_level&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7895577618268567039?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7895577618268567039/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-3-validation.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7895577618268567039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7895577618268567039'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-3-validation.html' title='Framework Turbulences : TUTO 3 - Validation, relations entre modèles et ACL'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-3454264470894522474</id><published>2009-08-05T12:02:00.000+02:00</published><updated>2009-08-12T15:12:30.158+02:00</updated><title type='text'>Framework Turbulences : TUTO 2 - Connection Base de données</title><content type='html'>&lt;h1 id="TurbulencesTutorial-Chapter2:UsingmodelsandCRUDactions"&gt;&lt;blockquote&gt;Framework Turbulences :&lt;br /&gt;Connection Base de données&lt;/blockquote&gt;&lt;/h1&gt;&lt;p&gt;On va continuer à partir du premier tuto. &lt;/p&gt; &lt;p&gt;Dans ce tutoriel, on va apprendre : &lt;/p&gt; &lt;ul&gt;&lt;li&gt;Comment installer une table spécifique à un modèle&lt;/li&gt;&lt;li&gt;Comment effectuer les actions CRUD (create, read, update, delete)  : &lt;ul&gt;&lt;li&gt;Ajouter un objet &lt;/li&gt;&lt;li&gt;Lister les objets et en afficher un spécifique &lt;/li&gt;&lt;li&gt;Modifier les proprietés d'un objet &lt;/li&gt;&lt;li&gt;Détruire un objet&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;  Pour plus d'informations sur les CRUD, vous pouvez visiter ce site &lt;a class="ext-link" href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete"&gt;&lt;span class="icon"&gt;go!&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;h2 id="Schemaanddata"&gt;Schema et données&lt;br /&gt;&lt;/h2&gt; &lt;p&gt; Turbulences prend en charge les données de la base de données. Il les "serializes". Chaque modèle a sa propre table qui correspond à ses objets. &lt;/p&gt; &lt;p&gt;Pour créer une table qui va être ajoutée dans la base de données lors du lancement du script d'installation, vous devez créer/modifier les fichiers présents dans le dossier &lt;tt style="color: rgb(255, 0, 0);"&gt;modules/hello/db&lt;/tt&gt;. Voici les 2 fichiers présents et utiles ici :&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;schema - ce script créé la table : hello.schema.sql &lt;/li&gt;&lt;li&gt;data - ce script créé les données, il peuple la table : hello.data.sql&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; Pour que ces scripts soient lancées a l'installation, il faut bien avoir les scripts d'indiqués dans le fichier &lt;tt&gt;modules/hello/module.ini&lt;/tt&gt;  comme ceci &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;: &lt;/p&gt; &lt;pre class="wiki"&gt;[tables]&lt;br /&gt;hello=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;schema,data,trigger&lt;/span&gt;; important put the schema before the data&lt;/pre&gt;&lt;/blockquote&gt;&lt;pre class="wiki"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Tous les scripts sauf le schema sont optionnels. Le schema peut l'être si le module n'a pas besoin d'une table. &lt;/p&gt; &lt;h3 id="Sampledbfiles"&gt;Les fichiers de base de données&lt;br /&gt;&lt;/h3&gt; &lt;ul&gt;&lt;li&gt;hello.schema.sql &lt;pre class="wiki"&gt;-- table hello&lt;br /&gt;DROP TABLE IF EXISTS hello;&lt;br /&gt;CREATE TABLE hello (&lt;br /&gt;id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;name VARCHAR(255) NOT NULL,&lt;br /&gt;PRIMARY KEY (id),&lt;br /&gt;INDEX name(name),)&lt;br /&gt;) ENGINE=MyISAM DEFAULT CHARSET=utf8;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;hello.data.sql &lt;pre class="wiki"&gt;INSERT INTO `hello` ( `id` , `name` )&lt;br /&gt;VALUES ( 1, 'Test' );&lt;br /&gt;INSERT INTO `hello` ( `id` , `name` )&lt;br /&gt;VALUES ( 2, 'John' );&lt;br /&gt;INSERT INTO `hello` ( `id` , `name` )&lt;br /&gt;VALUES ( 3, 'Kate' );&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; Vous devez lancer une nouvelle fois le script d'installation (&lt;tt&gt;php myapp/script/install.php&lt;/tt&gt;). Allez vérifier ensuite dans phpmyadmin que la table hello soit bien créée. &lt;/p&gt; &lt;hr /&gt; &lt;h2 id="Listdata"&gt;Lister des données&lt;/h2&gt; &lt;p&gt; On va lister les données présents dans la table hello&lt;br /&gt;&lt;/p&gt; &lt;p&gt; Pour cela on va d'abord modifier le modèle du module &lt;tt&gt;Hello&lt;/tt&gt; dans &lt;tt&gt;modules/hello/Hello.php&lt;/tt&gt;: &lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;class Hello extends TURB_Object    // les modèles doivent etendre de TURB_Object&lt;br /&gt;{&lt;br /&gt;var $_table = 'hello';  // on défini ici le nom de la table&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;Ensuite il faut définir l'action &lt;tt&gt;list&lt;/tt&gt; dans notre controlleur (&lt;tt&gt;HelloController.php&lt;/tt&gt;); comme ceci :  &lt;pre class="wiki"&gt;&lt;blockquote&gt;/**&lt;br /&gt;* Une action est toujours définie comme ceci : action_nomDeLAction; donc ici : action_list&lt;br /&gt;*/&lt;br /&gt;public function action_list()&lt;br /&gt;{&lt;br /&gt;$names = Hello::getFor('Hello'); // see 1.&lt;br /&gt;$view   = new HelloView();&lt;br /&gt;return $view-&gt;html_list($names);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; La méthode &lt;tt&gt;getFor()&lt;/tt&gt; est un méthode statique de TURB_Object.  Elle retourne un tableau d'objets de la classe que l'on a interrogée (ici, la classe hello) en prenant en compte les conditions que l'on a passé (ici, aucune ). Vous pourriez très bien par exemple ne sélectionner que les entrée dont l'age est 12 et ou le nom est junior. Il faudrait entrer ceci:&lt;tt style="color: rgb(255, 0, 0);"&gt;&lt;/tt&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;Hello::getFor('Hello', array('age' =&gt; 12, 'name' =&gt; 'junior'));&lt;/tt&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;  &lt;p&gt; Maintenant, il faut créer la vue associée dans &lt;tt&gt;HelloView&lt;/tt&gt;:&lt;br /&gt;&lt;/p&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;protected function _list($names)&lt;br /&gt;{&lt;br /&gt;$this-&gt;assign('names', $names);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Ensuite, on enregistre la template de listage ( &lt;tt&gt;modules/hello/views/html/list.tpl&lt;/tt&gt;): &lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;{if $names|@count neq 0}&lt;br /&gt;{foreach from=$names item=name}&lt;br /&gt;{$name-&gt;id}-{$name-&gt;name|strip_tags}&lt;br /&gt;{/foreach}&lt;br /&gt;{else}&lt;br /&gt;&lt;p&gt;Nothing in the list.&lt;/p&gt;&lt;br /&gt;{/if}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Il est maintenant possible de tester le module de listage en tapant ceci  &lt;a href="http://turbapp/hello/list"&gt;http://turbapp/hello/list&lt;/a&gt; &lt;/p&gt; &lt;hr /&gt; &lt;h2 id="id_hello_affichage"&gt;Afficher un objet spécifique&lt;/h2&gt; &lt;p&gt;On va afficher un message dynamique "hello $name". Le nom va être lu depuis la base de données.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;On ajoute alors l'action &lt;tt&gt;show&lt;/tt&gt; dans le controlleur:&lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;// in HelloController&lt;br /&gt;public function action_show()&lt;br /&gt;{&lt;br /&gt;if  (isset($_GET['id']) &amp;amp;&amp;amp; is_numeric($_GET['id']))&lt;br /&gt;{&lt;br /&gt;$name = Hello::getByPKey('Hello',$_GET['id']);&lt;br /&gt;$view = new HelloView();&lt;br /&gt;return $view-&gt;html_show($name);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;HTTP::redirect('/');&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On ajoute la vue&lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;// in HelloView&lt;br /&gt;protected function _show($name)&lt;br /&gt;{&lt;br /&gt;$this-&gt;assign('name', $name);&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Et enfin, la template ( &lt;tt&gt;views/html/show.tpl&lt;/tt&gt;): &lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;&lt;p&gt;Hello {$name-&gt;name} !&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On peut tester le module &lt;a class="ext-link" href="http://turbapp/hello/show/1"&gt;&lt;span class="icon"&gt;http://turbapp/hello/show/1&lt;/span&gt;&lt;/a&gt;. C'est censé afficher "Hello Test !" &lt;/p&gt; &lt;h2 id="id_hello_ajout"&gt;Ajout d'objet&lt;br /&gt;&lt;/h2&gt; &lt;p&gt; On va ajouter un nouveau nom dans la base de données. D'abord, on va ajouter la méthode &lt;tt&gt;add&lt;/tt&gt; dans le controlleur :&lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;// in HelloController&lt;br /&gt;public function action_add()&lt;br /&gt;{&lt;br /&gt;if (isset($_GET['id']) &amp;amp;&amp;amp; is_numeric($_GET['id']))&lt;br /&gt;  $name = Hello::getByPKey('Hello',$_GET['id']);&lt;br /&gt;else&lt;br /&gt;  $name = new Hello();&lt;br /&gt;&lt;br /&gt;if (isset($_POST['name']))&lt;br /&gt;{&lt;br /&gt;  $name-&gt;name = $_POST['name'];&lt;br /&gt;  $name-&gt;save();&lt;br /&gt;  HTTP::redirect('/hello/show/?id='.$name-&gt;id);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;  $view = new HelloView();&lt;br /&gt;  $view-&gt;assign('name', $name);&lt;br /&gt;  return $view-&gt;html_add($name);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On créé la template comprenant le formulaire d'ajout :&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;/p&gt; &lt;pre class="wiki"&gt;// in modules/hello/views/html/add.tpl&lt;br /&gt;&amp;lt;form action="" method="post"&amp;gt;&lt;br /&gt;&amp;lt;label for="name"&amp;gt;Name: &amp;lt;/label&amp;gt;&amp;lt;input type="text" name="name" /&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Enregister" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; On peut dores et déjà tester le module &lt;a class="ext-link" href="http://turbapp/hello/add/"&gt;&lt;span class="icon"&gt;http://turbapp/hello/add/&lt;/span&gt;&lt;/a&gt;&lt;a href="http://turbapp/hello/add/"&gt; &lt;/a&gt;Envoyer une valeur. Un nouvel objet va être créé et enregistré dans la base de donnéeet la page va être redirigée vers l'action show (/hello/show/&lt;object_id&gt;). &lt;/object_id&gt;&lt;/p&gt; &lt;h2 id="id_hello_edition"&gt;Editer un objet&lt;/h2&gt; &lt;p&gt; On va modifier la méthode &lt;tt&gt;add()&lt;/tt&gt; pour que les mises à jour se passent bien. La méthode va recevoir l'id de l'objet dans l'URL comme ceci : &lt;tt&gt;/hello/add/?id=2&lt;/tt&gt;. &lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;// in HelloController&lt;br /&gt;public function action_add()&lt;br /&gt;{&lt;br /&gt;if (isset($_GET['id']) &amp;amp;&amp;amp; is_numeric($_GET['id']))&lt;br /&gt;$name = Hello::getByPKey('Hello',$_GET['id']);&lt;br /&gt;else&lt;br /&gt;$name = new Hello();&lt;br /&gt;&lt;br /&gt;if (isset($_POST['name']))&lt;br /&gt;{&lt;br /&gt;$name-&gt;name = $_POST['name'];&lt;br /&gt;$name-&gt;save();&lt;br /&gt;HTTP::redirect('/hello/show/?id='.$name-&gt;id);&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;$view = new HelloView();&lt;br /&gt;$view-&gt;assign('name', $name);&lt;br /&gt;$view-&gt;html_add($name);&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On ajoute le lien d'édition :&lt;/p&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote&gt;// in views/html/show.tpl&lt;br /&gt;{if $names|@count neq 0}&lt;br /&gt;{foreach from=$names item=name}&lt;br /&gt;{$name-&gt;id}-{$name-&gt;name|strip_tags}&lt;br /&gt;&amp;lt;a href="'/hello/add/{$name-"&amp;gt;id}/'&amp;gt;Edit&amp;lt;/a&amp;gt;&lt;br /&gt;{/foreach}&lt;br /&gt;{else}&lt;br /&gt;&lt;p&gt;Aucun élément dans la liste&lt;/p&gt;&lt;br /&gt;{/if}&lt;/blockquote&gt;On modifie aussi la valeur que doivent prendre les champs dans le&lt;br /&gt;formulaire &lt;span style="color: rgb(255, 0, 0);"&gt;add.tpl&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;lt;form action="" method="post"&amp;gt;&lt;br /&gt;&amp;lt;label for="name"&amp;gt;Name: &amp;lt;/label&amp;gt;&amp;lt;input type="text" name="name"&lt;br /&gt;value="{$name-&amp;gt;name}" /&amp;gt;&lt;br /&gt;&amp;lt;input type="submit" value="Enregister" /&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;On peut tester en entrant /hello/list, et en cliquant sur un des liens d'édition.&lt;/p&gt;&lt;p&gt;&lt;a href="http://turbulences.com/trac/wiki/Manual/Tutorial_2"&gt;Sources - turbulences.com&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-3454264470894522474?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/3454264470894522474/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-2-connection.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3454264470894522474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/3454264470894522474'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tuto-2-connection.html' title='Framework Turbulences : TUTO 2 - Connection Base de données'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4946105766181568063</id><published>2009-08-05T11:23:00.000+02:00</published><updated>2009-08-12T15:11:45.013+02:00</updated><title type='text'>Framework Turbulences : TUTO 1 - Hello</title><content type='html'>&lt;h1 id="TurbulencesTutorial-Chapter1:CreatinganHelloworldmodule"&gt;&lt;/h1&gt;&lt;blockquote&gt; &lt;h1 id="TurbulencesTutorial-Chapter1:CreatinganHelloworldmodule"&gt;Framework Turbulences :&lt;br /&gt;Premier module = Hello&lt;/h1&gt; &lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Pour utiliser ce tutoriel, votre installation de turbulences doit être faite. Si ce n'est pas le cas ou si vous ne savez pas, faites d'abord &lt;a href="http://lenybernard.blogspot.com/2009/08/framework-turbulences-tutoriel.html"&gt;ceci.&lt;/a&gt;&lt;/p&gt; &lt;h2 id="Modules"&gt;Les modules&lt;/h2&gt; &lt;p&gt; Tout le code relatif au module sera situé ici &lt;tt&gt;myapp/modules/nomdumodule&lt;/tt&gt; .Un module est un ensemble données/role. Il est divisé en 3 blocs selon le modèle &lt;a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur"&gt;MVC&lt;/a&gt;: &lt;/p&gt; &lt;ul&gt;&lt;li&gt;un controlleur qui va définir les actions et le comportement du module &lt;/li&gt;&lt;li&gt;un modèle qui va gérer les données, leur accès et la validation &lt;/li&gt;&lt;li&gt;une vue qui va définir les pages visibles du module &lt;/li&gt;&lt;/ul&gt; &lt;p&gt; Il s'agit du schéma classique du modèle MVC. Ce modèle permet la séparation de ces parties et est très utilisé dans le web et dans les frameworks les plus utilisés. Vous pouvez visiter &lt;a class="ext-link" href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;&lt;span class="icon"&gt;la page Wikipedia&lt;/span&gt;&lt;/a&gt; ou cet excellent site : &lt;a class="ext-link" href="http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/CocoaDesignPatterns.html#//apple_ref/doc/uid/TP40002974-CH6-SW1"&gt;&lt;span class="icon"&gt;ADC introduction&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt; Le fait de créer des modules permet la réutilisation des programmes du fait de leur séparation avec le reste des composants.&lt;/p&gt; &lt;h2 id="Howtocreateamodule"&gt;Comment créer un module&lt;br /&gt;&lt;/h2&gt; &lt;h3 id="Manually"&gt;Manuellement&lt;/h3&gt; &lt;p&gt; Un générateur de module existe et il est recommandé de l'utiliser, car il automatise toutes les taches de création du module. Son utilisation est décrité dans la section suivante. Ces instructions sont données pour comprendre totalement comment fonctionne un module.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;créer le répertoire &lt;tt&gt;hello&lt;/tt&gt; dans &lt;tt&gt;myapp/modules&lt;/tt&gt; &lt;pre class="wiki"&gt;$ cd myapp/modules&lt;br /&gt;$ mkdir hello&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;créer la hierarchie dans le dossier &lt;tt&gt;hello&lt;/tt&gt; : &lt;pre class="wiki"&gt;myapp/modules/hello&lt;br /&gt;+ HelloController.php  // hosts class HelloController extends TURB_Controller {}&lt;br /&gt;+ HelloView.php       // hosts class HelloView extends TURB_View_Smarty {}&lt;br /&gt;+ Hello.php        // hosts class Hello extends TURB_Object {}&lt;br /&gt;+ views&lt;br /&gt;   + html      // hosts Smarty HTML templates&lt;br /&gt;   + script    // hosts view specific javascript code&lt;br /&gt;   + style     // hosts view specific css code&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;a style="border: medium none ; padding: 0pt;" href="http://turbulences.com/trac/attachment/wiki/Manual/Tutorial_1/structure.png"&gt;&lt;img src="http://turbulences.com/trac/raw-attachment/wiki/Manual/Tutorial_1/structure.png" alt="file tree view" title="file tree view" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;h3 id="Usingthegeneratetool"&gt;Automatiquement&lt;br /&gt;&lt;/h3&gt; &lt;p&gt; Il faut juste taper&lt;br /&gt;&lt;/p&gt; &lt;pre class="wiki"&gt;&lt;blockquote&gt;$ cd /myapp&lt;br /&gt;$ script/generate_module hello&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Cela va créer la hierarchie des fichiers.&lt;/p&gt; &lt;h2 id="Createthemodel"&gt;Créer le modèle&lt;br /&gt;&lt;/h2&gt; &lt;p&gt; Nous allons désormais créer chaque composants du modèle MVC en commencant par le modèle : &lt;span style="color: rgb(153, 153, 153);"&gt;(le modèle du module est le fichier &lt;/span&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;modules/hello/Hello.php&lt;/tt&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;) &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;definir un modèle vide comme ceci : &lt;pre class="wiki"&gt;&lt;blockquote&gt;class Hello extends TURB_Object&lt;br /&gt;{&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="Createthecontroller"&gt;Créer le controlleur&lt;br /&gt;&lt;/h2&gt; &lt;span style="color: rgb(153, 153, 153);"&gt;(le controlleur du module est le fichier &lt;/span&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;modules/hello/&lt;/tt&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;HelloController&lt;/tt&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;.php&lt;/tt&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;) &lt;/span&gt;&lt;ul&gt;&lt;li&gt;definir le controlleur comme ceci :&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;class HelloController extends TURB_Controller&lt;br /&gt;{&lt;br /&gt; // must be declared; called after the constructor&lt;br /&gt; public function setup() {}&lt;br /&gt;&lt;br /&gt; public function action_default()&lt;br /&gt; {&lt;br /&gt;     $name = 'world';&lt;br /&gt;     $view = new HelloView();&lt;br /&gt;     $view-&gt;assign('firstname', 'Walt');&lt;br /&gt;     return $view-&gt;html_hello($name);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="Createthecontroller"&gt;Créer la vue&lt;br /&gt;&lt;/h2&gt;  &lt;span style="color: rgb(153, 153, 153);"&gt;(la vue du module est le fichier &lt;/span&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;modules/hello/&lt;/tt&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;HelloView&lt;/tt&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;.php&lt;/tt&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;) &lt;/span&gt; &lt;ul&gt;&lt;li&gt;definir la vue comme ceci:&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote&gt;class HelloView extends TURB_View_Smarty&lt;br /&gt;{&lt;br /&gt; public function _hello($arg)&lt;br /&gt; {&lt;br /&gt;     $this-&gt;assign('name', $arg);&lt;br /&gt; }&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="Createthetemplate"&gt;Créer la template&lt;br /&gt;&lt;/h2&gt; &lt;p&gt; La template est etroitement liée à la vue. Il s'agit du code HTML, de l'apparence de la page pour l'utilisateur.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;(le template hello du module hello se situe ici &lt;/span&gt;&lt;tt style="color: rgb(255, 0, 0);"&gt;modules/hello/views/html/hello.tpl&lt;/tt&gt;&lt;span style="color: rgb(153, 153, 153);"&gt;) &lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;définir la template comme ceci : &lt;pre class="wiki"&gt;&lt;blockquote&gt;&lt;a id="publishButton" class="cssButton" href="javascript:void(0)" target="" onclick="if (this.className.indexOf(&amp;quot;ubtn-disabled&amp;quot;) == -1) {var e = document['stuffform'].publish;(e.length) ? e[0].click() : e.click(); if (window.event) window.event.cancelBubble = true; return false;}"&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;Publier le message&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;Hello {$firstname} {$name}&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; Le fait d'appeler  &lt;tt&gt;$view-&gt;html_hello($name);&lt;/tt&gt; va controler et appeler la méthode &lt;tt&gt;_hello&lt;/tt&gt; présente dans la vue &lt;span style="color: rgb(102, 102, 102);"&gt;(HelloView)&lt;/span&gt;, dans une réponse HTML (on va y revenir) ; cette méthode va automatiquement chercher la template &lt;tt&gt;hello.tpl&lt;/tt&gt; pour le rendu. &lt;/p&gt; &lt;h2 id="TestyourHellomodule"&gt;Tester le module Hello&lt;br /&gt;&lt;/h2&gt; &lt;p&gt; Maintenant, entrez &lt;a class="ext-link" href="http://turbapp/hello/"&gt;&lt;span class="icon"&gt;http://turbapp/hello/&lt;/span&gt;&lt;/a&gt; - ce qui va afficher la nouvelle page.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Le chemin d'éxecution est le suivant : &lt;/p&gt; &lt;table class="wiki"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;tt&gt;index.php&lt;/tt&gt; &lt;/td&gt;&lt;td&gt; lance le dispatcher, instancie le controlleur du module &lt;tt&gt;hello&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;tt&gt;HelloController.php&lt;/tt&gt; &lt;/td&gt;&lt;td&gt; lance &lt;tt&gt;action_default()&lt;/tt&gt; qui instancie la vue &lt;tt&gt;HellowView&lt;/tt&gt;, attribue les variables qu'il faut et appelle &lt;tt&gt;html_hello()&lt;br /&gt;&lt;br /&gt;&lt;/tt&gt;  &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt; &lt;tt&gt;HellowView.php&lt;/tt&gt; &lt;/td&gt;&lt;td&gt; Lance &lt;tt&gt;html_hello()&lt;/tt&gt; qui va chercher la template &lt;tt&gt;html/hello.tpl&lt;/tt&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; Enfin, le dispatcher rend la vue et les données dans le navigateur du client  &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;hr /&gt; &lt;h2 id="Somenotes"&gt;Notes&lt;/h2&gt; &lt;ul&gt;&lt;li&gt;On utilise le moteur de template Smarty ; la doc est disponible ici -&gt;  &lt;a class="ext-link" href="http://smarty.php.net/manual/"&gt;&lt;span class="icon"&gt;http://smarty.php.net/manual/&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://turbulences.com/trac/wiki/Manual/Tutorial_1"&gt;Sources - turbulences.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4946105766181568063?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4946105766181568063/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/premier-tutoriel-permier-module-hello.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4946105766181568063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4946105766181568063'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/premier-tutoriel-permier-module-hello.html' title='Framework Turbulences : TUTO 1 - Hello'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-6420704904098971520</id><published>2009-08-05T10:52:00.001+02:00</published><updated>2010-01-25T15:13:12.385+01:00</updated><title type='text'>Framework Turbulences : TUTORIEL D'INSTALLATION</title><content type='html'>L'entreprise dans laquelle je fais mon stage utilise pour son application le framework &lt;a href="http://turbulences.com/"&gt;turbulences&lt;/a&gt;&lt;br /&gt;Le framework est très peu documenté donc plus on en parle, mieux ce sera. Voici comment installer Turbulences&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; sur votre machine ubuntu :&lt;br /&gt;&lt;br /&gt;&lt;h1 id="Turbulencesinstallation"&gt;Installation de Turbulences&lt;/h1&gt;&lt;h2 id="Prerequesites"&gt;Pré-requis&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Linux (Ubuntu 8.10 par exemple)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Apache 2  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;"mod rewrite" activé &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MySQL version 5 ou +&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.developpez.net/forums/d514143/c-cpp/bibliotheques/autres/tutoriel-dinstallation-dimagemagick-ide-choix-sous-linux-ubuntu/"&gt;ImageMagick&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;PHP version 5.2 ou + avec le module &lt;br /&gt;&lt;ul&gt;&lt;li&gt;mbstring &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="Install"&gt;Installation&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Se mettre en mode Super Utilisateur (commande : su )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Créer un répertoire pour le projet (par exemple sur le bureau)&lt;br /&gt;&lt;pre class="wiki"&gt;$ mkdir myproject&lt;br /&gt;$ cd myproject&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Installer une copie du framework&lt;br /&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;$ svn export -rHEAD svn://turb.ulenc.es/turb/trunk .&lt;br /&gt;$ ls -l&lt;br /&gt;trunk&lt;br /&gt;$ cd trunk&lt;br /&gt;$ ls -1&lt;br /&gt;base&lt;br /&gt;whitecopy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Vous avez 2 répertoires : &lt;tt&gt;base&lt;/tt&gt; qui contient toutes les librairies du framework et&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;tt&gt;whitecopy&lt;/tt&gt; qui est un squelette de votre application. Il faut donc renommer ce : &lt;br /&gt;&lt;pre class="wiki"&gt;$ rename whitecopy myapp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Créer une base de donnée dans http://localhost/phpmyadmin et appelez là &lt;tt&gt;turb_db&lt;/tt&gt; &lt;br /&gt;&lt;h2 id="Fixsymboliclinks"&gt;Faire les liens symbolics&lt;/h2&gt;&lt;pre class="wiki"&gt;Créer le dossier var dans votre dossier de projet. Dans votre dossier var, créez aussi le dossier data, log, tmp et users.&lt;/pre&gt;&lt;pre class="wiki"&gt;Dans le dossier logs, créez un fichier appelé app.log, dans tmp, créez un dossier appelé compile.&lt;/pre&gt;&lt;pre class="wiki"&gt;&amp;nbsp;&lt;/pre&gt;Créez les liens symboliques pour l'appli :&lt;br /&gt;#lien symb dans dyb_app/&lt;br /&gt;ln -s var/tmp tmp&lt;br /&gt;&lt;br /&gt;#lien symb dans dyb_app/public&lt;br /&gt;ln -s ../var/data/public var&lt;br /&gt;&lt;br /&gt;#lien symb dans dyb_app/public/script&lt;br /&gt;ln -s ../../tmp/cache/script cache&lt;br /&gt;&lt;br /&gt;#lien symb dans dyb_app/public/style&lt;br /&gt;ln -s ../../tmp/cache/style cache&lt;h2 id="Configure"&gt;Configurer&lt;/h2&gt;Maintenant, on va configurer l'application&lt;br /&gt;&lt;br /&gt;&lt;h3 id="Apachevirtualhost"&gt;Le virtualhost&lt;br /&gt;&lt;/h3&gt;Configurer un virtualhost dans la config d'apache (/etc/apache2/httpd.conf)  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vérifiez que ces variables soient bien parametrées : &lt;/li&gt;&lt;li&gt;&lt;tt&gt;            AllowOverride -&amp;gt; All&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;            DocumentRoot to myproject/myapp/public&lt;/tt&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Voici le code à entrer pour définir le virtualhost :&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;blockquote style="color: #666666; font-family: courier new;"&gt;NameVirtualHost dyb.local&lt;br /&gt;&amp;lt;VirtualHost dyb.local&amp;gt;&lt;br /&gt;ServerAdmin l.bernard@doyoubuzz.com&lt;br /&gt;&lt;br /&gt;DocumentRoot /home/leny/workspace/dybmig/public/&lt;br /&gt;&amp;lt;Directory /home/leny/workspace/dybmig/public/&amp;gt;&lt;br /&gt;Options Indexes FollowSymLinks MultiViews&lt;br /&gt;AllowOverride All&lt;br /&gt;Order allow,deny&lt;br /&gt;allow from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/&lt;br /&gt;&amp;lt;Directory "/usr/lib/cgi-bin"&amp;gt;&lt;br /&gt;AllowOverride All&lt;br /&gt;Options  ExecCGI -MultiViews  SymLinksIfOwnerMatch&lt;br /&gt;Order allow,deny&lt;br /&gt;Allow from all&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;LogLevel warn&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;virtualhost&gt;&lt;br /&gt;&lt;/virtualhost&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="varhost"&gt;Le fichier myapp/var/&lt;span style="color: red;"&gt;host&lt;/span&gt;&lt;/h3&gt;Créer le fichier host dans le dossier var du dossier myapp et l'éditer. Mettre le nom du virtualhost et le nomero du port si besoin dans le fichier&lt;span style="font-family: monospace;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;touch /myapp/var/host&lt;br /&gt;gedit /myapp/var/host&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;écrirer &lt;span style="color: #666666;"&gt;turbapp &lt;span style="color: black;"&gt;et quitter&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3 id="conf.yaml"&gt;Le fichier myapp/conf/&lt;span style="color: red;"&gt;conf.yaml&lt;/span&gt;&lt;/h3&gt;Mettre à jour le fichier de configuration conf.yaml( &lt;tt&gt;myproject/myapp/conf/conf.yaml&lt;/tt&gt;): &lt;br /&gt;&lt;ul&gt;&lt;li&gt;la section "env" permet de définir la liste des environnements (dev, test, prod), La liste commence par &lt;tt&gt;"vhost:port": nom_de_lenvironnement&lt;/tt&gt; &lt;/li&gt;&lt;li&gt;Ensuite, il faut définir la configuration détaillée comme ci-dessous :&lt;br /&gt;&lt;pre class="wiki"&gt;&lt;span style="color: #666666;"&gt;&lt;span style="font-size: 180%;"&gt;&lt;span style="font-family: georgia;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #666666;"&gt;app:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;    id: myapp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;    name: myapp&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;    version: 0.1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;env:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;    vhosts:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;        'turbapp': dev&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;    dev:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;        public_url: http://$vhost/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;        db:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;            user: root&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;            pass: &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;            base: turb_db&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;            host: localhost&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;            privileges: ALL&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;        imagemagick_path: /usr/bin/&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666666;"&gt;        mysql_filename: /usr/bin/mysql&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="FSpermissions"&gt;Permissions FS&lt;br /&gt;&lt;/h2&gt;Maintenant, assurez vous que les permissions de myapp/var sont correctement parametrés : &lt;br /&gt;&lt;pre class="wiki"&gt;$ chgrp -R www-data myapp/var&lt;br /&gt;$ chmod -R g+w myapp/var&lt;br /&gt;$ find myapp/var -type d -exec chmod g+s {} \;&lt;br /&gt;&lt;/pre&gt;&lt;h2 id="Runinstallscript"&gt;Lancez le script d'installation :&lt;br /&gt;&lt;/h2&gt;&lt;pre class="wiki"&gt;$ php myapp/script/install&lt;br /&gt;&lt;/pre&gt;Le script va controler que tout est bien parametré et va installer la base de données correctement.&lt;br /&gt;&lt;br /&gt;Modifiez maintenant le fichier /etc/hosts et ajouter à la suite de localhost trubapp ou le nom de votre vhost&lt;br /&gt;&lt;blockquote&gt;$ sudo gedit /etc/hosts&lt;br /&gt;127.0.0.1    localhost turbapp&lt;br /&gt;&lt;/blockquote&gt;L'installation est finie. Testez en allant sur &lt;tt&gt;http://&lt;span style="font-family: Georgia,serif;"&gt;turbapp &lt;/span&gt;&lt;/tt&gt;dans firefox. Si une page avec un logo rosé écrit turbulences apparait et que le message suivant apparait : &lt;br /&gt;&lt;div id="header"&gt;&lt;h1&gt;&lt;a href="http://turbapp/"&gt;&lt;img alt="Turbulences" src="http://turbapp/images/turb/log_turb_trac2.jpg" /&gt;&lt;/a&gt;&lt;/h1&gt;&lt;/div&gt;&lt;h1&gt;Your setup succeeded!&lt;/h1&gt;Vous pouvez alors vous attaquer au premier tutoriel. Sinon, relisez attentivement le tutoriel d'installation et au besoin écrivez un ticket sur le site de &lt;a href="http://turbulences.com/trac"&gt;tubulences.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tubulences.com/"&gt;&lt;/a&gt;&lt;a href="http://turbulences.com/trac/wiki/Manual/Installation"&gt;Sources : turbulences.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-6420704904098971520?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/6420704904098971520/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tutoriel.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6420704904098971520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/6420704904098971520'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/framework-turbulences-tutoriel.html' title='Framework Turbulences : TUTORIEL D&apos;INSTALLATION'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-2805358063477972720</id><published>2009-08-05T10:22:00.001+02:00</published><updated>2009-10-28T15:54:09.640+01:00</updated><title type='text'>Les meilleures applications iPhone !</title><content type='html'>&lt;span style="font-weight: bold;"&gt;//TODO : faire du dernier iPhone le smart &lt;span style="color: #3333ff;"&gt;le plus complet du marché !&lt;br /&gt;&lt;br /&gt;LOGICIELS&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; TOMTOM (le meilleur GPS) et NAVIGON&lt;/span&gt;&lt;br /&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;*** &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;IM+ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(client de messagerie et de réseaux sociaux comme msn, gtalk, facebook, twitter, Y!, etc toujours connecté en arrière plan. Vous recevez des messages comme des sms)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; WinterBoard &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Pour installer des thèmes sur l'iPhone)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; FastSketch &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet à partir d'une photo de faire un effet dessin au crayon de bois ou au crayon de couleur vraiment épatant)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; AutoStitch &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet de faire des diaporamas à partir de plusieurs photos qui se suivent)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; ezShare &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet d'avoir ses fichiers présents sur un espace de stockage sur internet ou sur le réseau local)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Air Mouse &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Remplace souris et clavier pour piloter l'ordinateur)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Fame &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet d'insérer une photo dans une autre photo pour lui affecter un effet vraiment sympa)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Peeps &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Une sorte d'alternative au carnet de contact avec les photos des contacts qui s'affiche, peu utile mais sympa)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Print n Share &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet le partage de fichiers et la mise en impression directe depuis l'iPhone vers les imprimantes partagées du réseau WIFI)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Quickoffice &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet de gérer et modifier ses fichiers de style office (WORD, EXCEL, PPT etc) et de les envoyer par mail ou de les enregistrer sur un espace de stockage défini)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Poof &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet de cacher des icones du genre Bourse,Boussole,Freeze, Maps,iTunes,VoiceMemos,Météo)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Camera Zoom &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet de zoomer en prenant une photo)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; dismoiou &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(lorsque l'on recherche quelque chose de particulier, cette application est utile)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; PdaNet &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Permet de partager ou d'utiliser la connexion internet avec le PC)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;JEUX :&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Worms &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(incarnez votre équipe de petits vers de terre et dominez le monde)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Les sims 3 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de simulation de vie)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Asphalt4 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de simulation de course de voiture)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Need for Speed Underground &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de simulation de course de voiture)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Yetisports &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu délirants entre pingouins et yéti)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Manager &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de gestion d'équipe de football)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; RSoccer09 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Meilleur jeu de Foot)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Brick3D &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de casse brique trop bien)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Tetris &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(faut il une description ?)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; Spore &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de simulation de l'évolution de votre espèce)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; iCombat &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de combat de tank)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; RealTennis &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de Tennis)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; ResidentEvil4 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de zombie bien fait)&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: red;"&gt;***&lt;/span&gt; FaceFighter &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3333ff;"&gt;&lt;span style="color: black;"&gt;(Jeu de boxe délirant)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #3333ff;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-2805358063477972720?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/2805358063477972720/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/les-meilleures-applications-iphone.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2805358063477972720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/2805358063477972720'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/les-meilleures-applications-iphone.html' title='Les meilleures applications iPhone !'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-224660549983632799</id><published>2009-08-05T09:47:00.000+02:00</published><updated>2009-10-28T15:52:33.659+01:00</updated><title type='text'>Jailbreak/Désimlockage de l'iPhone 3GS 3.1.2</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Ce sujet va vous permettre d'utiliser n'importe quelle application même payante gratuitement. Ce n'est cependant pas légal. Vous êtes avertis. Cela vous permet aussi de modifier votre iPhone en personnalisant l'apparence ou en débloquant de nouvelles fonctionnalités comme l'accès SSH ou le désimlockage.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JAILBREAK&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cette méthode fonctionne pour toutes les générations d'iPhone. Si vous avez un iPhone déjà jailbreaké et que par conséquent vous avez une multitude d'applications pirates installées sur votre téléphone, sachez que grace à cette méthode, vous récupererez tout ca ainsi que votre configuration (code wifi, contacts, etc).&lt;br /&gt;&lt;br /&gt;La première étape si ce n'est pas un iPhone vierge est de synchroniser/enregistrer votre iPhone avec iTunes.&lt;br /&gt;Cette étape sera peut etre un peu long si vous ne l'avez jamais fait (ce serait étonnant tout de même) mais est primordiale pour récupérer les informations stockées sur l'iPhone.&lt;br /&gt;&lt;br /&gt;Une connexion WIFI est préférée pour une bonne installation.&lt;br /&gt;&lt;br /&gt;*Mettez à jour votre iPhone avec la version 3.1.2&lt;br /&gt;*Téléchargez ce logiciel : &lt;a href="http://isisko.frid.fr/index.php?link=blackra1n"&gt;Pour windows&lt;/a&gt; ou &lt;a href="http://isisko.frid.fr/index.php?link=macra1n"&gt;Pour Mac&lt;/a&gt;&lt;br /&gt;*Installez la dernière version d'&lt;a href="http://www.apple.com/itunes/"&gt;iTunes&lt;/a&gt;&lt;br /&gt;*Branchez l'iPhone au PC grace au cable USB fourni avec le téléphone&lt;br /&gt;*Pour mac, dézippez le fichier.&lt;br /&gt;*Lancez le fichier.&lt;br /&gt;*Cliquez sur "Make it rain".&lt;br /&gt;//L'iphone affiche une photo du pirate et redémarre.&lt;br /&gt;// Une nouvelle application est apparue : BlackRa1n&lt;br /&gt;*Paramétrez votre wifi pour accélerer la procédure. &lt;br /&gt;*Lancez l'application blackra1n et cliquez sur "Cydia"&lt;br /&gt;// L'application Cydia est opérationnelle et apparait sous forme d'une icone dans vos applications*Lancez Cydia puis dans l'onglet Gestion : touchez Source -&amp;gt; Editer -&amp;gt; Ajouter&lt;br /&gt;puis entrez cette source :&lt;span style="color: #3333ff; font-weight: bold;"&gt;http://cydia.hackulo.us&lt;/span&gt;&lt;br /&gt;// La source s'ajoute à Cydia, ses paquets sont désormais disponibles&lt;br /&gt;*Touchez l'onglet recherche puis tapez : "appsync". Une seule application apparait normalement, l'application AppSync for OS 3.1&lt;br /&gt;*Installez la, redémarrez ensuite le springboard(ou l'iPhone).&lt;br /&gt;// Votre iPhone est désormais capable d'installer des applications présentes en téléchargement sur certains sites sans vérifier que vous ayez bien le droit de les installer. A vous Navigon, IM+, Les sims 3 etc.&lt;br /&gt;*Allez sur &lt;a href="http://appulo.us/"&gt;http://appulo.us/&lt;/a&gt; ou &lt;a href="http://ihacks.ru/"&gt;http://ihacks.ru&lt;/a&gt; pour obtenir des liens d'applications craquées.&lt;br /&gt;*Choisissez l'application que vous désirez obtenir en cliquant sur l'icone puis choisissez un lien disponible pour les dernieres version proposées de préférence.&lt;br /&gt;//Soit le fichier téléchargé est un fichier ***.ipa et dans ce cas, il s'ouvre directement avec iTunes, soit c'est un fichier ***.ipa.rar ou ***.ipa.zip et dans ce cas il faut renommer le fichier en ***.ipa et l'ouvrir ensuite avec iTunes (un simple double clique doit suffir), iTunes sait qu'il doit ouvrir les fichiers finissant par ipa&lt;br /&gt;*Il faut alors synchroniser l'iPhone avec iTunes à l'aide d'un clique droit sur l'icone de l'iPhone dans iTunes (bandeau gauche) -&amp;gt; Synchroniser.&lt;br /&gt;//L'iPhone se synchronise, les applications s'installent sur l'iPhone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DESIMLOCKAGE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;// Cette partie était vraie pour le jailbreak avec le logiciel &lt;a href="http://purplera1n.com/purplera1n.exe"&gt;purplera1n&lt;/a&gt; qui jailbreak les iPhone sous OS 3.0&lt;br /&gt;// Elle ne l'est plus pour blackra1n.&lt;br /&gt;*Il faut ajouter la source :  http://repo666.ultrasn0w.com&lt;br /&gt;(attention c'est http://repo666.ultrasn(ZERO)w.com   )&lt;br /&gt;*Ensuite, il faut cliquer sur la source repo666.ultrasn0w.com, un seul paquet s'affiche, le paquet "ultrasn0w", il faut l'installer. L'iPhone redémarre, il est désimlocké (vous pouvez l'utiliser avec n'importe quel opérateur).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-224660549983632799?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/224660549983632799/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/jailbreakdesimlockage-de-liphone-3gs-et.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/224660549983632799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/224660549983632799'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/jailbreakdesimlockage-de-liphone-3gs-et.html' title='Jailbreak/Désimlockage de l&apos;iPhone 3GS 3.1.2'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4457418272704419928</id><published>2009-08-04T17:44:00.000+02:00</published><updated>2009-08-04T17:56:40.371+02:00</updated><title type='text'>L'élu : Apple iPhone 3GS</title><content type='html'>Et voilà, j'ai fait mon choix, me voilà dans la grande  famille des mac-users. J'ai succombé à l'attraction de l'iPhone 3GS. Plus rapide que le prédecesseur, plus complet et surtout qui comporte plus d'applications interessantes (malgré le fait qu'elles soient payantes) que chez Nokia, Android ou autre.&lt;br /&gt;J'ai pris le forfait IDEO de Bouygues Telecom, qui coute 45€/mois ce qui fait un forfait sms/mms/internet/mail/TV illimités + 2h de communication à 15€/mois + un forfait internet à la maison BBOX à 30€/mois... L'affaire de l'année en ce qui concerne les offres téléphoniques.&lt;br /&gt;&lt;br /&gt;VOUS AVEZ BIEN ENTENDU : 15€/mois pour tout illimité + 2h de communication&lt;br /&gt;&lt;br /&gt;Ensuite, je l'ai jailbreaké et désimlocké. Méthode très facile, en 5 minutes, tout est fait. Il faut brancher l'iPhone à l'ordinateur, télécharger et lancer le fichier purplera1n.exe. Le tour est joué. L'icone freeze qui permet d'installer cydia apparait après le redémarage de l'appareil. Une fois cydia installé, pour avoir accès à toutes les applications payantes, il faut ajouter la source cydia.hackulo.us puis chercher sur cydia et installer le paquet "appsync". Ensuite on peut allez télécharger les applications sur des sites de piratage com http://ihacks.ru ou http://hakulo.us/appdb.&lt;br /&gt;&lt;br /&gt;C'est à partir de ce moment, lorsque l'on installe les applications payantes gratuitement que l'iPhone montre son interet et pourrie literalement tous les autres téléphones.&lt;br /&gt;&lt;br /&gt;DONC, voici mon conseil, NE PAS HESITER !! L'iPHONE 3GS EST MONSTRUEUX ! Allez-y !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4457418272704419928?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4457418272704419928/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/08/lelu-apple-iphone-3gs.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4457418272704419928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4457418272704419928'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/08/lelu-apple-iphone-3gs.html' title='L&apos;élu : Apple iPhone 3GS'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-4190161821778716353</id><published>2009-06-16T12:37:00.000+02:00</published><updated>2009-06-16T12:59:12.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone  Bouygues Telecom'/><title type='text'>Quel smartphone ?</title><content type='html'>Bonjour,&lt;br /&gt;&lt;br /&gt;Je vais changer de téléphone en Juillet et je vais inévitablement succomber à la tentation des smartphone. Mon choix est fait ce sera l'iPhone 3G ou  l'iPhone 3G S, le dernier né d'Apple.&lt;br /&gt;&lt;br /&gt;Si vous avez des critiques à faire au sujet de l'iPhone, allez-y, pour moi c'est le meilleur des smartphone et j'attendais beaucoup de l'HTC Magic pour le détronner mais il n'est pour moi pas à la hauteur. Cela dit, je ne l'ai pas testé directement alors c'est un jugement inégal en faveur de l'iPhone. Cependant, j'ai vraiment du mal avec les NOKIA... Je ne les trouve pas beau et pas ergonomiques. Qu'en pensez vous ?&lt;br /&gt;&lt;br /&gt;En ce qui concerne les features du nouvel iPhone 3G S, on peut citer un appareil &lt;span style="font-weight: bold;"&gt;photo de meilleure qualité 3Mo auto-focus avec focus manuel sur simple toucher de l'écran de ce que l'on veut rendre net, caméra vidéo mais apparement qui ne fait pas de longs films (à voir), commande vocale performante, bousole intégrée pour un &lt;span style="color: rgb(51, 102, 255);"&gt;GPS et un guidage plus performant&lt;/span&gt;, le clavier en mode paysage n'importe quand (sms), l'arrivée enfin des mms (il était temps ! même si je trouve ca inutile) , une batterie plus performante, une technologie qui s'appuye sur l'OPENGL pour des &lt;span style="color: rgb(51, 102, 255);"&gt;jeux comparables à une PSP&lt;/span&gt; ,un processeur &lt;span style="color: rgb(51, 102, 255);"&gt;2x plus rapide&lt;/span&gt; pour la rapidité de navigation et la vraie 3G + pour un &lt;span style="color: rgb(51, 102, 255);"&gt;internet à presque 10Mbit/S&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Et toujours les caratéristiques completement géniales de l'iPhone 3G que l'on ne cite plus !&lt;br /&gt;&lt;br /&gt;Alors avec un tel forfait, il est inutile de dire qu'il est préférable de prendre un forfait adéquat ! Mais, il n'est cependant pas util de se ruiner. NE PAS ALLER CHEZ ORANGE.&lt;br /&gt;Vous pouvez faire les calculs comme moi, si c'est le budget qui vous interesse tout en profitant au mieux du téléphone, il n'est pas nécessaire de payer un forfait spécial iPhone, c'est une simple et horrible arnaque. Par exemple, chez Bouygues Telecom, qui sont les moins chers (contre ORANGE et SFR), il existe un forfait bloqué à &lt;span style="font-weight: bold;"&gt;24,90€&lt;/span&gt; pendant 2 ans qui permet d'avoir 1h30 de forfait avec sms/mms illimités, internet et mail par 3G+ et la TV, et tout ca en illimité (bande passante max : 2GO/mois) ! Sinon, et c'est ce que je vais faire, il existe l'offre IDEO en ce moment de Bouygues Telecom aussi qui permet pour 59€90 d'avoir un forfait non bloqué 2h voix + internet-mail-tv illimités ET un forfait ADSL. Il faut bien faire les calculs pour chaque personnes mais c'est en général moins cher chez Bouygues ou sfr. ORANGE = escrocs. Brefs, vive l'iPhone 3G S, disponible en France le 24 Juin !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-4190161821778716353?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/4190161821778716353/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/06/quel-smartphone.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4190161821778716353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/4190161821778716353'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/06/quel-smartphone.html' title='Quel smartphone ?'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5471968564169463653.post-7671424533894267784</id><published>2009-06-16T11:56:00.000+02:00</published><updated>2009-06-16T12:37:04.417+02:00</updated><title type='text'>Pourquoi créer un blog</title><content type='html'>Bonjour à tous et bienvenue sur mon blog,&lt;br /&gt;&lt;br /&gt;Tout d'abord, pourquoi un blog ? Je souhaite utiliser cet espace pour y poster certains de mes travaux de programmation. J'y écrirais des petits tuto pour expliqué ce que je fais et pour qu'ainsi il soit facile d'accès pour les lecteurs de mon blog.&lt;br /&gt;Les tutos seront de plusieurs domaines, &lt;span style="font-weight: bold;"&gt;J2E&lt;/span&gt; (Struts, Tiles, connexion base de données, sessions etc), &lt;span style="font-weight: bold;"&gt;PHP&lt;/span&gt; (+ framework turbulences), &lt;span style="font-weight: bold;"&gt;JQuery&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;CSS &lt;/span&gt;et peut être sur d'autres sujets divers et variés.&lt;br /&gt;&lt;br /&gt;De plus, je parlerais ici (avec vous si vous le désirez), d'autres sujets de technologie du moment comme les smartphones.&lt;br /&gt;&lt;br /&gt;En attendant, j'y retourne !&lt;br /&gt;à Bientôt,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5471968564169463653-7671424533894267784?l=lenybernard.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lenybernard.blogspot.com/feeds/7671424533894267784/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://lenybernard.blogspot.com/2009/06/pourquoi-creer-un-blog.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7671424533894267784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5471968564169463653/posts/default/7671424533894267784'/><link rel='alternate' type='text/html' href='http://lenybernard.blogspot.com/2009/06/pourquoi-creer-un-blog.html' title='Pourquoi créer un blog'/><author><name>Leny</name><uri>http://www.blogger.com/profile/01009114269024976596</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_y2fyEhOegYQ/S4OqX_K5wuI/AAAAAAAAA2A/6cGUyLDIHVk/S220/leny-avatar.png'/></author><thr:total>0</thr:total></entry></feed>
