<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">

<channel>
	<title>DEVBLOG :: Le blog d'Alexandre BALMES, jeune chef de projet</title>
	
	<link>http://dev.pockyworld.com</link>
	<description>Enfin j'essaie</description>
	<lastBuildDate>Fri, 30 Jul 2010 10:37:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/juniorduweb" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="juniorduweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle>Enfin j'essaie</itunes:subtitle><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">juniorduweb</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Peanut Semaine… peanutPosts disponible en téléchargement !</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html#comments</comments>
		<pubDate>Fri, 30 Jul 2010 10:37:43 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=243</guid>
		<description><![CDATA[Et non le projet n&#8217;est pas mort Ceux qui me suivent sur Twitter ont pu voir que les choses c&#8217;étaient un peu compliqués ces derniers temps même si tout est revenu dans l&#8217;ordre pour le moment. Le plugin peanutPosts a été ajouté à son propre repository Git et est utilisable en l&#8217;état. Au passage, un [...]]]></description>
			<content:encoded><![CDATA[<p>Et non le projet n&#8217;est pas mort <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Ceux qui me suivent sur Twitter ont pu voir que les choses c&#8217;étaient un peu compliqués ces derniers temps même si tout est revenu dans l&#8217;ordre pour le moment. Le plugin peanutPosts a été ajouté <a href="http://github.com/pocky/peanutPostsPlugin">à son propre repository Git</a> et est utilisable en l&#8217;état.</p>

<p>Au passage, un grand nettoyage a été effectué <a href="http://github.com/pocky/peanut">sur le repository principal</a> au niveau des branches et le readme a été mis à jour (avec des fautes d&#8217;orthographes).</p>

<p>A noter que vous pouvez utiliser ce plugin indépendamment de peanut sans aucun problème puisqu&#8217;il n&#8217;a que deux pré-requis : <a href="http://github.com/pocky/sfDoctrineGuardPlugin">sfDoctrineGuardPlugin</a> (<a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin">version officielle</a>) et <a href="http://www.symfony-project.org/plugins/sfDoctrineActAsTaggablePlugin">sfDoctrineActAsTaggablePlugin</a>.</p>

<p>Le validateur du formulaire de contact <a href="http://github.com/pocky/sfValidatorSimpleCaptcha">sfValidatorSimpleCaptcha</a> a également son repository et sera prochainement remplacé sur le formulaire de contact par un autre validateur sfValidatorHiddenCaptcha.</p>

<p>Et pour finir, parce que je ne le dirait jamais assez, Symfony est un régal à pratiquer !
A bientôt !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-peanutposts-disponible-en-telechargement.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 7 – peanutPosts</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html#comments</comments>
		<pubDate>Mon, 31 May 2010 21:22:48 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=236</guid>
		<description><![CDATA[Bonsoir ! Itération 7 cette semaine avec la création de la branche peanutPosts. Cette branche contient non pas un mais trois modules qui sont en cours de préparation : Le module peanutCategories : gestion des catégories Le module peanutPosts : gestion des articles dynamiques Le module tag : via le behavior Taggable Il y a [...]]]></description>
			<content:encoded><![CDATA[<p>Bonsoir !</p>

<p>Itération 7 cette semaine avec la création de <a href="http://github.com/pocky/peanut">la branche peanutPosts</a>. Cette branche contient non pas un mais trois modules qui sont en cours de préparation :</p>

<ul>
<li>Le module peanutCategories : gestion des catégories</li>
<li>Le module peanutPosts : gestion des articles dynamiques</li>
<li>Le module tag : via le behavior Taggable</li>
</ul>

<p>Il y a donc pas mal de travail à faire et tout avance au fur et à mesure dans l&#8217;ordre précédent. La création de ce module m&#8217;a également permit de découvrir le behavior Doctrine nestedSet permettant de gérer un arbre et ainsi éviter beaucoup de problèmes de récursivité (avec une gestion des catégories plus classique). Je compte d&#8217;ailleurs bien utiliser ce behavior sur le module peanutPage lors de sa refactorisation</p>

<p>Cette itération a également connue un petit bug avec le module Doctrine sfGuardForgotPassword alors vous pouvez remercier tight qui a apporté une réponse au <a href="http://github.com/pocky/peanut/issues/closed#issue/1">ticket de bug</a>.</p>

<p>La semaine dernière, un site de présentation a été mis en ligne à l&#8217;adresse suivante <a href="http://www.peanut.fr">http://www.peanut.fr</a>. Une personne c&#8217;est déjà amusée avec le formulaire de contact et vous pouvez faire de même. Vous n&#8217;aurez cependant pas accès au backoffice pour le moment, je l&#8217;ouvrirais un peu plus tard sur un site de demo. Ce site sera bien entendu amené à évoluer avec les différents modules.</p>

<p>Et pour conclure, je suis toujours aussi motivé par ce projet alors n&#8217;hésitez pas à me faire part de vos bugs ou envie, j&#8217;essaierai de faire le plus d&#8217;heureux possible !</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-7-peanutposts.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 6 – peanutPage (fin et bonus)</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html#comments</comments>
		<pubDate>Tue, 25 May 2010 20:40:02 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[contact]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=232</guid>
		<description><![CDATA[Bonjour à tous, Pour cette sixième semaine, la fin de la version 1.0 du module peanutPage. Ce module est donc fonctionnel et vous pouvez d&#8217;ors et déjà l&#8217;utiliser. Un petit passage en intégration (sur un vrai-faux site) m&#8217;à même permis d&#8217;ajouter quelques fonctions bien utiles pour le commun des mortels. Avec ce module, le plugin [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>

<p>Pour cette sixième semaine, la fin de la version 1.0 du module peanutPage. Ce module est donc fonctionnel et vous pouvez d&#8217;ors et déjà l&#8217;utiliser. Un petit passage en intégration (sur un vrai-faux site) m&#8217;à même permis d&#8217;ajouter quelques fonctions bien utiles pour le commun des mortels.</p>

<p>Avec ce module, le plugin <a href="http://www.symfony-project.org/plugins/csDoctrineActAsSortablePlugin">csDoctrineActAsSortable</a> a été ajouté ainsi que le plugin <a href="http://www.symfony-project.org/plugins/sfCKEditorPlugin">sfCKEditorPlugin</a>.</p>

<p>Quelques ajouts xHTML/CSS ont été faits afin d&#8217;améliorer un peu le tout au niveau graphique et rendre le backend un peu plus sexy.</p>

<p>Bonus, le module contact a également été ajouté. Rien de bien exceptionnel à ce niveau puisque le formulaire de contact met tout simplement en place le <a href="http://www.symfony-project.org/forms/1_4/fr/">tutoriel symfony forms in action</a>. J&#8217;ai tout de même créé un petit validateur au passage baptisé sfValidatorSimpleCaptcha permettant de valider un captcha simple (sur la base d&#8217;un addition avec deux opérateurs).</p>

<p>Le module contact est donc également en version 1.0</p>

<p>Le plus important étant que maintenant, vous pouvez utiliser peanut pour créer un site simple de quelques pages même si cela reviendra à utiliser une grosse berline pour aller acheter votre pain.</p>

<h3>Le wiki</h3>

<p>J&#8217;ai ajouté quelques pages au <a href="http://wiki.github.com/pocky/peanut/">wiki</a> github afin de vous donner quelques informations sur la suite et le programme en perspective. Si vous repérez des bugs mais que vous ne voulez pas forcément proposer une solution, n&#8217;hésitez pas à utiliser <a href="http://github.com/pocky/peanut/issues">la gestion de ticket github</a>. Tout est bon à prendre pour moi avec ce projet.</p>

<h3>Modification de l&#8217;utilisation de Git</h3>

<p>J&#8217;ai décidé d&#8217;utiliser <a href="http://book.git-scm.com/5_submodules.html">les submodules git</a> afin de gérer les plugins dans le projet. Les submodules Git sont un peu l&#8217;équivalent des externals de SVN. Concrètement cela permet d&#8217;ajouter des projets git à l&#8217;intérieur même d&#8217;un superprojet git et donc de pouvoir faciliter les updates.</p>

<p>Dans notre cas, cela permettra de gérer les plugins du projet en offrant à tous la possibilité de télécharger directement le plugin (ou proposer des modifications) sur le repository associé.</p>

<p>Deux submodules ont été ajoutés pour le moment, <a href="http://github.com/vjousse/symfony-1.4">symfony</a> et mon fork de <a href="http://github.com/pocky/sfDoctrineGuardPlugin">sfDoctrineGuardPlugin</a>.</p>

<h3>Oups!</h3>

<p>J&#8217;ai fait une &laquo;&nbsp;petite&nbsp;&raquo; erreur de manipulation avec mes branches Git suite à l&#8217;utilisation des submodules. Git a en effet quelques problèmes pour gérer l&#8217;ajout de submodule sur une branche lors d&#8217;un checkout sur une branche sans submodules (d&#8217;après ce que j&#8217;ai compris). Résultat des courses, une fausse manip en essayant de faire fonctionner le tout et ma branche master disparait. Il m&#8217;a donc fallu la recréer et&#8230; Il faut forger pour être forgeron <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<p>Un cours de Git m&#8217;attends vendredi soir pour régler les petits problèmes associés à cette erreur (rien de méchant). J&#8217;aurais donc tendance à vous conseiller d&#8217;attendre samedi pour faire une mise à jour (ou alors de ne pas oublier de créer un répertoire &laquo;&nbsp;cache&nbsp;&raquo; à la racine du projet. Au passage, peanut sera tagué en version 1 et un site demo sera mis en ligne dans la semaine.</p>

<h3>Modification de la roadmap</h3>

<p>Etant donné que j&#8217;ai besoin d&#8217;utiliser peanut pour un projet, je vais un peu modifier la roadmap annoncé la semaine dernière.  Le projet va donc évoluer de la façon suivante :</p>

<ul>
<li>Création du module peanutCategories</li>
<li>Création du module peanutPosts</li>
<li>Création du plugin peanutPosts</li>
<li>Création du module peanutComments</li>
<li>Création du plugin peanutComments</li>
<li>Création du module peanutSEO</li>
<li>Création du plugin peanutSEO</li>
</ul>

<p>Si tout se passe bien, le tout devrait prendre de 3 à 4 itérations pour les v1 de ses modules/plugins.</p>

<p>Je passerais ensuite au refactoring/amélioration/debug de l&#8217;ensemble des modules. Chacun de ses modules (à travers leurs plugins) auront leurs propres repository Git et seront intégrés sous la forme de submodules dans le projet principal. Cela permettra au passage de pouvoir profiter d&#8217;un ou plusieurs plugins de son choix sans utiliser la base (même si certains plugins comme le module peanutSEO seront dépendants d&#8217;autres plugins).</p>

<p>Ce sera tout pour cette semaine !
A la semaine prochaine <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Et pour rappel, vous pouvez récupérer le projet <a href="http://github.com/pocky/peanut">sur Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-6-peanutpage-fin-et-bonus.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 5 – peanutPage (1ere partie)</title>
		<link>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html#comments</comments>
		<pubDate>Mon, 17 May 2010 21:34:54 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=224</guid>
		<description><![CDATA[Bonjour à tous, Cette semaine a permis d&#8217;assurer la création du premier &#171;&#160;vrai&#160;&#187; module pour peanut à savoir le module peanutPage. Ce module a été pour moi l&#8217;occasion de me mettre aux tests unitaires. Je dois dire que j&#8217;ai vraiment trouvé ça intéressant non-seulement pour les avantages &#171;&#160;connus&#160;&#187; des tests unitaires mais aussi d&#8217;un point [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>

<p>Cette semaine a permis d&#8217;assurer la création du premier &laquo;&nbsp;vrai&nbsp;&raquo; module pour peanut à savoir le module <a href="http://github.com/pocky/peanut/tree/PeanutPage">peanutPage</a>. Ce module a été pour moi l&#8217;occasion de me mettre aux tests unitaires. Je dois dire que j&#8217;ai vraiment trouvé ça intéressant non-seulement pour les avantages &laquo;&nbsp;connus&nbsp;&raquo; des tests unitaires mais aussi d&#8217;un point de vue intellectuel. Mes tests ne sont pas forcément les plus complets pour le moment mais je pense que tout cela s&#8217;améliorera avec mon niveau.</p>

<p>Comme j&#8217;aborde le sujet, sachez que je vous encourage à vous lancer dans ce genre de projet. J&#8217;ai vraiment appris en 5 semaines un nombre conséquent de nouvelles &laquo;&nbsp;choses&nbsp;&raquo; et pourtant cela ne va pas encore très loin au niveau des fonctionnalités. Mais voila, cette espèce d&#8217;obligation de ne pas livrer à tous le monde quelque chose d&#8217;innutilisable aide forcément à faire de son mieux et à respecter les bonnes pratiques dans leur ensemble. Je ne vous parle même pas de l&#8217;auto-formation et de la documentation relative à tous ce travail même si cela ne se reflête pas de façon flagrante pour le moment dans le projet. Par contre, c&#8217;est une autre histoire au niveau professionnel avec des projets interne techniquement plus solide et abouti (notamment à travers un projet d&#8217;extranet dont je suis entrain de créer les bases).</p>

<p>Et je me demande vraiment pourquoi j&#8217;ai autant attendu pour me mettre à dev&#8230; <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Ceci dit, revenons à nos moutons. Pour l&#8217;instant le module page est complet au niveau du backoffice (avec la personnalisation des formulaires) et des fonctions ont été créées dans le model (on dit merci au TDD). Un module frontend a été créé mais n&#8217;est pas du tout adapté au besoin. Cela viendra dans la prochaine itération.</p>

<p>J&#8217;ai un peu affiné mes itérations, un module devrait être livré en deux à trois itérations au minimum (mon emploi du temps profesionnel l&#8217;oblige). C&#8217;est en tout cas ce qui me parait le plus sage à l&#8217;heure actuelle car je mange vraiment beaucoup de documentation en ce moment (petite pensée pour les tests fonctionnels qui arrivent). Cela devrait donc donner quelque chose dans le genre :</p>

<ul>
<li>Semaine 1 : Création du module, des fonctions de bases et de la partie administration</li>
<li>Semaine 2 : Création du frontend et si besoin, ajout de fonctions dans le model</li>
<li>Semaine 3 : Création du plugin correspondant au module</li>
</ul>

<p>Au niveau des modules, je part à priori la dessus :</p>

<ul>
<li>Création du module page</li>
<li>Création d&#8217;un module contact (avec un formulaire de contact type)</li>
<li>Création du module post (aka articles/catégories)</li>
<li>Création du module SEO</li>
</ul>

<p>Une fois ces modules créés :</p>

<ul>
<li>Refactorisation du model et des différentes fonctions afin d&#8217;optimiser le tout au niveau technique</li>
<li>Ajout de fonctionnalités type AJAX pour le backoffice</li>
</ul>

<p>Et enfin, création de nouveaux modules selon le même principe : commentaires, FAQ&#8230; Le projet sera ouvert à ce niveau. Il sera bien évidemment possible de créer son propre plugin pour améliorer peanut. Il faudra également que l&#8217;on parle à un moment de la tournure du projet au niveaux des fonctionnalités, il y aura une question ouverte <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Nous pourrons donc considérer que peanut sera d&#8217;ici deux semaines utilisable en tant que CMS lite (par exemple 5 pages et un formulaire de contact) même si cela reviendra à sortir la grosse artillerie pour un petit besoin. Une fois les modules post/SEO créé, je m&#8217;occuperais de faire tourner mon blog sur peanut histoire d&#8217;avoir une démo &laquo;&nbsp;live&nbsp;&raquo;.</p>

<p>Pour terminer, un petit lien vers un article du blog de <a href="http://prendreuncafe.com/blog/post/2010/02/17/User-Dependant-Forms-with-Symfony">n1k0</a> qui m&#8217;a été utile pour ne pas utiliser getInstance dans la gestion I18n des formulaires du backoffice. Un blog incontournable à ajouter à ses flux RSS.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut-semaine-5-peanutpage.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peanut : Semaine 4 – sfDoctrineGuardPlugin</title>
		<link>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html#comments</comments>
		<pubDate>Sun, 09 May 2010 19:57:50 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[peanut]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=216</guid>
		<description><![CDATA[Il c&#8217;est passé un peu de temps depuis le dernier article et je continue tranquillement à avancer au rythmefixé (au moins un lot de fonctionnalités par semaine) mais j&#8217;ai eu énormément de travail ces derniers temps et donc&#8230; Aucune nouvelle. Semaine 3 &#8211; template, template, template La semaine dernière a essentiellement servie à créer le [...]]]></description>
			<content:encoded><![CDATA[<p>Il c&#8217;est passé un peu de temps depuis le dernier article et je continue tranquillement à avancer au rythmefixé (au moins un lot de fonctionnalités par semaine) mais j&#8217;ai eu énormément de travail ces derniers temps et donc&#8230; Aucune nouvelle.</p>

<h3>Semaine 3 &#8211; template, template, template</h3>

<p>La semaine dernière a essentiellement servie à créer le layout du backend. Pas grand chose à dire à ce niveau, j&#8217;ai essayé de me faire un peu plaisir avec un peu de CSS3, un peu de jQuery et du xHTML (et oui, pas de HTML5 pour le backend). Je n&#8217;ai par contre pas encore pris le temps de valider les pages. Il peut donc y avoir quelques erreurs d&#8217;intégration. Le backoffice n&#8217;a également pas été testé sur la famille Internet Explorer mais je m&#8217;en occuperais dans quelques itérations au maximum car inutile de vous le cacher, mon prochain blog tournera bel et bien sur peanut (quitte à devoir évoluer avec).</p>

<h3>Semaine 4 &#8211; spéciale sfDoctrineGuardPlugin</h3>

<p>Comme je l&#8217;avais dis au début du projet, je comptais bien modifier sfDoctrineGuardPlugin. Lors de la création du projet, je suis parti sur la base du <a href="http://svn.symfony-project.com/plugins/sfDoctrineGuardPlugin/trunk/">trunk de sfDoctrineGuardPlugin</a> qui ajoute certaines fonctionnalités avec deux modules : sfGuardForgotPassword et sfGuardRegister permettant respectivement de récupérer son mot de passe et de se créer un compte.</p>

<p>Malheureusement, les process utilisés lors de ces étapes ne sont pas &laquo;&nbsp;corrects&nbsp;&raquo; dans le sens ou si effectivement ils fonctionnent, ils ne font pas forcément les choses correctement. Je me suis donc efforcé de modifier ces éléments afin de corriger un peu le tir, tout du moins à mon sens. Rassurez-vous, les modifications ne sont pas nombreuses mais en voici quelques unes.</p>

<p><strong>sfGuardAuth</strong></p>

<ul>
<li>Possibilité via le fichier app.yml d&#8217;autoriser ou non la connection via le nom d&#8217;utilisateur et le mot de passe</li>
</ul>

<p><strong>sfGuardUser</strong></p>

<ul>
<li>Modification du fichier schema.yml afin qu&#8217;un utilisateur ne soit pas actif par défaut</li>
</ul>

<p><strong>sfGuardRegister</strong></p>

<ul>
<li>Modification de la route afin de pouvoir gérer le process d&#8217;inscription</li>
<li>Lors de la création de compte, un email est envoyé à l&#8217;utilisateur afin de confirmer la création du compte</li>
<li>Modification du process d&#8217;inscription qui va se charger de vérifier certains points importants avant d&#8217;activer le compte</li>
</ul>

<p><strong>sfGuardForgotPassword</strong></p>

<ul>
<li>L&#8217;email envoyé par défaut indique un délai de 24H pour valider son compte mais le code n&#8217;imposait pas de limite et n&#8217;enregistrait même pas la limite correctement</li>
<li>Ajout d&#8217;une tache permettant via cronjob de supprimer tous les utilisateurs n&#8217;ayant pas validé leur compte</li>
</ul>

<p><strong>De façon générale</strong>
- Ajout de traductions (uniquement en français)</p>

<h4>Parce qu&#8217;il faut tout de même le dire</h4>

<p>Ce qui est actuellement en place est bien entendu perfectible. Le process d&#8217;inscription par exemple va générer une chaine sha1 basée sur le nom d&#8217;utilisateur, son adresse email et le csrf token de l&#8217;application et comme vous pouvez vous en douter&#8230; Il y a mieux (mais il y a aussi largement pire).</p>

<p>Pour moi, il faudrait créer une nouvelle table permettant de stocker les utlisateurs en cours d&#8217;inscription avec une clé unique en base de donnée afin de vraiment garantir la sécurité à ce niveau. L&#8217;autre option pourrait être de générer le sha1 sur la base du timestamp de création du compte qui pourrait ainsi (puisque stocké en bdd via created_at) servir de base un peu plus fiable. Autre solution, enregistrer l&#8217;utilisateur, récupérer l&#8217;objet utilisateur et générer quelque chose d&#8217;unique basé sur le salt par exemple.</p>

<p>Ceci dit je préfère attendre quelqu&#8217;uns de vos retours et mettre tout ça dans ma todolist pour un (éventuel et certains) refactoring dans le futur.</p>

<p>Autre chose, l&#8217;ensemble de ce travail a directement été fait dans le plugin sfDoctrineGuard car cela fais vraiment parti pour moi des fonctions à assurer au minimum et non à rajouter à la volée suivant les besoins de chaques projets (contrairement à la personnalisation des templates par exemple). Vous pouvez donc très bien surcharger ce qui est fait mais par défaut, une personne s&#8217;inscrit, reçoit un email de confirmation puis confirme son compte et cela tiens quand même plus la route qu&#8217;une inscription directe sans plus de vérification que ça.</p>

<p>Enfin, les tests unitaires ne sont pas complets et il faut vraiment que je m&#8217;y mette. Cela me dépasse encore un peu pour le moment. Je vois bien le principe mais je ne sais pas si c&#8217;est parce que j&#8217;ai l&#8217;habitude de chercher à faire tout de suite compliqué mais la&#8230; Je ne serais pas contre un petit cours à l&#8217;oral avec démo et questions connes en direct.</p>

<p>Ceci dit et si jamais j&#8217;arrive (ou nous arrivons via vos éventuelles contributions) à améliorer le plugin sfDoctrineGuard, j&#8217;aimerais le proposer afin qu&#8217;il soit intégré aux plugins (voir remplacer la version actuelle). Certaines conversations lues sur IRC me font dire que ce ne serait pas une mauvaise chose.</p>

<p>Petit détail d&#8217;importance, il faut que vous sachiez que mon anglais est encore moins bon que mon français à l&#8217;écrit en ce moment. Si jamais vous voulez modifier ça parce que&#8230; Hum&#8230; Okay mais bon il y a mieux, n&#8217;hésitez pas. Il faudrait également s&#8217;occuper de la traduction espagnole (puisqu&#8217;il y en a une pour le plugin) pour ne pas faire de malheureux mais la&#8230; Je vous laisse faire.</p>

<h4>A quoi peut servir peanut actuellement ?</h4>

<p>Si jamais vous vous posez la question, peanut peut vous servir (dans l&#8217;état actuel) à tout et à rien puisqu&#8217;il n&#8217;assure rien d&#8217;autre que la gestion de vos utilisateurs, groupes et permissions. Il est donc envisageable de faire n&#8217;importe quoi autour de ça : Réseau social, trombinoscope, intranet, extranet&#8230; Et j&#8217;en passe.</p>

<p>J&#8217;essaierai de vous donner ce genre d&#8217;exemples à chaque itération.</p>

<h4>Le débat de la semaine</h4>

<p>Le débat de la semaine porte sur la traduction i18n pour les setFlash(). <a href="http://gist.github.com/395109">Un gist</a> a donc été créé et de la même façon que lors de la précédente question ouverte, je vous invite à l&#8217;enrichir via vos différentes méthodes afin de trouver les différentes façons de faire. Vous en trouverez actuellement trois, plus ou moins sexy mais qui fonctionnent toutes.</p>

<h4>A venir</h4>

<p>Le premier module du CMS permettant tout simplement de créer des &laquo;&nbsp;pages&nbsp;&raquo; (comprendre pages dynamiques peu modifiées du type CGU/CGV/&#8230;) pour votre site Internet.</p>

<h4>Et pour finir</h4>

<p>J&#8217;ai activé le système de donation sur le projet. A défaut d&#8217;aller directement dans mes poches, tout sera stocké sur un compte paypal dédié dans le but de m&#8217;offrir certaines formations dispensées par <a href="http://trainings.sensiolabs.com/fr">SensioLabs Trainings</a> qui seraient à priori :</p>

<ul>
<li>PHP niveau 1 : bases</li>
<li>PHP niveau 2 : POO</li>
<li>Symfony 1.4 + Doctrine</li>
<li>Symfony et REST</li>
<li>Doctrine</li>
</ul>

<p>Bien entendu, cela pourra évoluer (je l&#8217;espère bien) avec ce projet puisque le but pour moi est de pratiquer encore et encore  afin de m&#8217;améliorer jusqu&#8217;au moment où je pourrais trashtalk sur PHP <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<p>Et pour rappel, <a href="http://github.com/pocky/peanut">un lien vers le projet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/peanut-semaine-4-sfdoctrineguardplugin.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Question ouverte : Le meilleur moyen de tester le contenu d’un objet Doctrine ?</title>
		<link>http://dev.pockyworld.com/developpement/php/question-ouverte-le-meilleur-moyen-de-tester-le-contenu-dun-objet-doctrine.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/question-ouverte-le-meilleur-moyen-de-tester-le-contenu-dun-objet-doctrine.html#comments</comments>
		<pubDate>Wed, 21 Apr 2010 19:31:10 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[question]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=203</guid>
		<description><![CDATA[Le problème avec les questions ouvertes, c&#8217;est que l&#8217;on ne sait pas toujours comment formuler correctement la question. Alors de mieux qu&#8217;un peu de code pour illustrer mes propos. Le contexte Nous avons une table post dans laquelle nous n&#8217;avons pas encore d&#8217;articles. On va donc faire les choses simplement sans se poser trop de [...]]]></description>
			<content:encoded><![CDATA[<p>Le problème avec les questions ouvertes, c&#8217;est que l&#8217;on ne sait pas toujours comment formuler correctement la question. Alors de mieux qu&#8217;un peu de code pour illustrer mes propos.</p>

<h3>Le contexte</h3>

<p>Nous avons une table <em>post</em> dans laquelle nous n&#8217;avons pas encore d&#8217;articles. On va donc faire les choses simplement sans se poser trop de questions. À la wordpress <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>

<h3>Le code</h3>

<p><strong>/lib/model/doctrine/postsTable.class.php</strong></p>

<pre><code>&lt;?php

  class postsTable extends Doctrine_Table
  {

    public function getPosts()
    {
      $t = $this-&gt;createQuery('c')
        -&gt;where('c.status = ?', 'publish');

      return $t-&gt;execute();
    }

  }
</code></pre>

<p><strong>/apps/frontend/modules/posts/actions/actions.class.php</strong></p>

<pre><code>&lt;?php

  /**
   * posts actions
   */

   class postsActions extends sfActions
   {

     public function executeIndex(sfWebRequst $request)
     {
       $this-&gt;entries = Doctrine::getTable('Posts')-&gt;getPosts();

       $this-&gt;forward404Unless($this-&gt;entries);
     }

   }
}
</code></pre>

<p>Et enfin dans notre template : <strong>/apps/frontend/modules/posts/templates/indexSuccess.php</strong></p>

<pre><code>[...]

&lt;?php if($entries) {

  foreach($entries as $entry) { ?&gt;

    &lt;h2&gt;&lt;?php echo $entry-&gt;getTitle() ?&gt;&lt;/h2&gt;
    [...]

  &lt;?php }

} else { ?&gt;

  &lt;h2&gt;Oups! Aucun article n'a été trouvé&lt;/h2&gt;

&lt;?php } ?&gt;
</code></pre>

<h3>Le résultat</h3>

<p>La première fois que j&#8217;ai fait ce code, je m&#8217;attendais vraiment à trouver mon &laquo;&nbsp;Oups&#8230;&nbsp;&raquo;. Ca me paraissait logique, table vide, la requête ne peut pas renvoyer de résultats à l&#8217;action et donc dans la vue mais non. Toujours et encore toujours du vide et aucun &laquo;&nbsp;Oups&#8230;&nbsp;&raquo;.</p>

<p>Et je ne comprends pas.</p>

<p>Je me suis donc &laquo;&nbsp;amusé&nbsp;&raquo; (c&#8217;est vite dit sur Doctrine) avec un <em>var_dump</em> afin de voir ce qui pouvait bien être stocké dans ma variable <em>$entries</em>. Après avoir décortiqué la soupe issue du <em>var_dump</em>, j&#8217;ai pu voir que ma variable contenait un <em>Doctrine_collection</em> vide et donc au final quelque chose &laquo;&nbsp;plein de vide&nbsp;&raquo;.</p>

<p>C&#8217;est donc la que l&#8217;on peut commencer à réfléchir.</p>

<h3>Version 1 &#8211; getFirst</h3>

<p>La première solution consiste à tester via Doctrine si il y a au moins un enregistrement :</p>

<p>Dans <strong>/apps/frontend/modules/posts/templates/indexSuccess.php</strong></p>

<pre><code>[...]

&lt;?php if($entries-&gt;getFirst()) {

  foreach($entries as $entry) { ?&gt;

    &lt;h2&gt;&lt;?php echo $entry-&gt;getTitle() ?&gt;&lt;/h2&gt;
    [...]

  &lt;?php }

} else { ?&gt;

  &lt;h2&gt;Oups! Aucun article n'a été trouvé&lt;/h2&gt;

&lt;?php } ?&gt;
</code></pre>

<h3>Version 2 &#8211; count()</h3>

<p>Seconde solution, compter avec un bon vieux <em>count()</em> en PHP :</p>

<p>Dans <strong>/apps/frontend/modules/posts/templates/indexSuccess.php</strong></p>

<pre><code>[...]

&lt;?php if(count($entries) &gt; 0)) {

  foreach($entries as $entry) { ?&gt;

    &lt;h2&gt;&lt;?php echo $entry-&gt;getTitle() ?&gt;&lt;/h2&gt;
    [...]

  &lt;?php }

} else { ?&gt;

  &lt;h2&gt;Oups! Aucun article n'a été trouvé&lt;/h2&gt;

&lt;?php } ?&gt;
</code></pre>

<h3>Analyse des versions 1 et 2</h3>

<p>Les deux solutions fonctionnent mais la méthode ne me semble pas correcte. Si je donne le tout à intégrateur++ qui peut intégrer n&#8217;importe quel template WordPress, saura-t&#8217;il faire la même chose avec le mien ?</p>

<p>Réponse négative à mon sens, on ne va pas penser à un <em>count()</em> ou un <em>getFirst()</em> de Doctrine. C&#8217;est encore plus vrai dans le sens où venant de cet univers, je n&#8217;ai absolument pas pensé à faire cette &laquo;&nbsp;opération&nbsp;&raquo;. Il faut donc trouver autre chose.</p>

<h3>Version 3 &#8211; count() dans l&#8217;action</h3>

<pre><code>&lt;?php

  /**
   * posts actions
   */

   class postsActions extends sfActions
   {

     public function executeIndex(sfWebRequst $request)
     {
       $entries = Doctrine::getTable('Posts')-&gt;getPosts();

       if(count($entries) &gt; 0)
       {
         $this-&gt;entries = $entries;
       }

       else
       {
         $this-&gt;entries = false;
       }

       $this-&gt;forward404Unless($entries);
     }

   }
}
</code></pre>

<h3>Version 4 &#8211; count() dans le model</h3>

<pre><code>&lt;?php

  class postsTable extends Doctrine_Table
  {

    public function getPosts()
    {
      $t = $this-&gt;createQuery('c')
        -&gt;where('c.status = ?', 'publish')
        -&gt;execute();

      if(count($t) &gt; 0)
      {
        return $t;
      }

      else
      {
        return NULL;         
      }

    }

  }
</code></pre>

<h3>Analyse des versions 3 et 4</h3>

<p>Avec ces deux versions, je peux renvoyer <em>NULL</em> et tester ma variable beaucoup plus simplement (et pour tout le monde). La question est donc de savoir si cela doit être fait dans l&#8217;action ou dans le model.</p>

<p>J&#8217;y ai donc réfléchis un peu et je trouve que le faire dans le model est plus simple car permet également de vérifier le contenu d&#8217;une requête plus rapidement et avec moins de ligne de code dans l&#8217;action. De plus, on peut mettre en place des tests comme <em>is_object()</em> ou <em>is_null()</em> à tous les niveaux ce qui ne me semble pas plus mal.</p>

<p>Mais vous, qu&#8217;en pensez-vous ? Où avez-vous d&#8217;autres moyens ?</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/question-ouverte-le-meilleur-moyen-de-tester-le-contenu-dun-objet-doctrine.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Premier push pour peanut</title>
		<link>http://dev.pockyworld.com/projets/peanut/premier-push-pour-peanut.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut/premier-push-pour-peanut.html#comments</comments>
		<pubDate>Sun, 18 Apr 2010 16:04:46 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[peanut]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=199</guid>
		<description><![CDATA[C&#8217;est maintenant chose faite, le premier push sur le projet peanut a été fait vendredi soir. Ce premier push n&#8217;a pas encore beaucoup d&#8217;utilité mais je vais tout de même expliquer certaines choses. Le projet et son .gitignore Je ne suis pas encore un expert de Git mais j&#8217;ai essayé de créer un fichier .gitignore [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est maintenant chose faite, <a href="http://github.com/pocky/peanut" title="liens vers le projet sur GitHub">le premier push</a> sur le projet <strong>peanut</strong> a été fait vendredi soir. Ce premier push n&#8217;a pas encore beaucoup d&#8217;utilité mais je vais tout de même expliquer certaines choses.</p>

<h3>Le projet et son .gitignore</h3>

<p>Je ne suis pas encore un expert de Git mais j&#8217;ai essayé de créer un fichier <em>.gitignore</em> qui tienne à peu près la route afin de me permettre ainsi qu&#8217;à toutes les personnes qui pourraient utiliser ce projet de ne pas avoir à faire &laquo;&nbsp;plus que nécessaire&nbsp;&raquo;.</p>

<ul>
<li>Les contenus des répertoires /cache/, /log/ et /web/uploads/ sont ignorés</li>
<li>Le fichier /config/databases.yml a été envoyé mais ne devrais plus l&#8217;être afin de ne pas à avoir modifier le mot de passe de connexion à votre base de donnée</li>
<li>Le fichier /config/properties.ini est dans le même cas que le fichier databases.yml</li>
<li>Le contenu du répertoire /lib/vendor/symfony/ (oubli à rajouter dans le prochain push)</li>
</ul>

<p>Viens ensuite une petite subtilité. J&#8217;ai pour habitude de créer un lien symbolique /web/sf afin de ne pas avoir à rajouter un alias dans le fichier vhost. Cette habitude a été prise suite à différentes aventures avec certains clients et le fameux &laquo;&nbsp;non, je garderai mon serveur actuel et vous allez devoir faire avec&nbsp;&raquo;. Pour le coup, cela n&#8217;est pas plus mal et j&#8217;ai donc conservé cette habitude. Ce lien est donc ignoré.</p>

<p>Ma petite expérience m&#8217;a également montrée qu&#8217;il était possible après un <em>git merge</em> de devoir refaire un <em>chmod 777</em> sur les deux répertoires log/ et cache/. Il faudra également faire un <em>php symfony cc</em> et un <em>php symfony plugin:publish-assets</em> afin d&#8217;être sur d&#8217;éviter tout problèmes. Nous verrons bien dans le futur si ces deux opérations se confirment <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>

<h3>Coté Plugin</h3>

<p>Deux plugins ont pour le moment été intégrés. Il y en aura au moins un autre mais j&#8217;ai préféré ne pas l&#8217;intégrer trop tôt.</p>

<h4>sfFormExtraPlugin</h4>

<p><a href="http://www.symfony-project.org/plugins/sfFormExtraPlugin" title="Voir le plugin">sfFormExtraPlugin</a> permet d&#8217;ajouter un certains nombre de widgets et validators ainsi que sfFormLanguage afin de proposer un site multilingue. Ce plugin fait pour moi parti du must have à toujours intégrer.</p>

<h4>sfDoctrineGuardPlugin</h4>

<p>Autre must have, le plugin <a href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin" title="Voir le plugin">sfDoctrineGuardPlugin</a> qui permet de gérer utilisateurs, groupes et permissions. Petite nuance, le plugin installé n&#8217;est pas celui accessible via le lien <em>Download Package</em> mais est celui du <a href="http://svn.symfony-project.com/plugins/sfDoctrineGuardPlugin/trunk/" title="Accéder au répertoire">trunk</a> car il apporte de nouvelles fonctionnalités qui sont pour moi indispensable.</p>

<p>Nous verrons cependant qu&#8217;il faudra modifier ce plugin afin de changer un peu son fonctionnement mais j&#8217;y reviendrais plus tard.</p>

<h3>Et maintenant ?</h3>

<p>Il faudra tout d&#8217;abord commencer par la découpe et l&#8217;intégration de la charte du backoffice composé d&#8217;un simple layout basé sur l&#8217;admin-generator car je ne pense pas aller plus loin à ce niveau pour le moment. Faire le maximum avec l&#8217;admin-generator est d&#8217;ailleurs un bon exercice <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<p>Seconde étape, la mise en place et la modification de sfDoctrineGuardPlugin afin de le compléter ou reprendre certaines parties de son fonctionnement. On verra à ce moment la si j&#8217;arrive vraiment à me faire au TDD ou si je commencerai à mettre en place ça pour mon propre code par facilité (et oui).</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut/premier-push-pour-peanut.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lancement du projet peanut</title>
		<link>http://dev.pockyworld.com/projets/peanut/lancement-du-projet-peanut.html</link>
		<comments>http://dev.pockyworld.com/projets/peanut/lancement-du-projet-peanut.html#comments</comments>
		<pubDate>Sun, 11 Apr 2010 20:11:49 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[peanut]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=196</guid>
		<description><![CDATA[Si certains ne l&#8217;avaient pas encore compris, l&#8217;année 2010 sera pour moi une grosse année en terme de développement web. Je vous annonce donc aujourd&#8217;hui le lancement du projet peanut. Alors explications. Peanut, c&#8217;est quoi ? Peanut est mon CMS basé sur symfony (branche 1.4), ce CMS est mon labo/expérience me permettant tout simplement d&#8217;apprendre [...]]]></description>
			<content:encoded><![CDATA[<p>Si certains ne l&#8217;avaient pas encore compris, l&#8217;année 2010 sera pour moi une grosse année en terme de développement web. Je vous annonce donc aujourd&#8217;hui le lancement du projet peanut. Alors explications.</p>

<h3>Peanut, c&#8217;est quoi ?</h3>

<p>Peanut est mon CMS basé sur symfony (branche 1.4), ce CMS est mon labo/expérience me permettant tout simplement d&#8217;apprendre les langages web. Le code de peanut n&#8217;est donc pas forcément le meilleur du monde mais compte bien l&#8217;être avec le temps.</p>

<p>Ce CMS ainsi que la démarche s&#8217;inscrit complètement dans mon apprentissage du &laquo;&nbsp;Web&nbsp;&raquo; en général. Je compte effectivement me mettre à toutes ces choses que je connais uniquement de nom à travers ce CMS, l&#8217;apprentissage par la pratique.</p>

<p>Premier défi pour moi, le TDD ainsi que les tests fonctionnels qui me dépassent encore beaucoup. Viendra ensuite tout ce qui &laquo;&nbsp;logistique&nbsp;&raquo; à travers l&#8217;utilisation de différents types de diagrammes UML ce qui me permettra au passage de m&#8217;améliorer au niveau de la gestion de plus gros projets professionnels. Nous verrons donc jusqu&#8217;où tout cela pourra me mener.</p>

<h3>L&#8217;organisation du projet</h3>

<p>Le projet sera organisé de la façon suivante :</p>

<ol>
<li>Création de la charte graphique du back-office (utilisant l&#8217;admin-generator)</li>
<li>Mise en place du coeur (symfony 1.4.x et plugins)</li>
<li>Modification de certains plugins afin d&#8217;avoir une base saine</li>
<li>Création des modules sur la base d&#8217;un TDD</li>
<li>Transformation d&#8217;un module en plugin</li>
</ol>

<p>Les modules ne seront pas forcément documentés, il se peut d&#8217;ailleurs qu&#8217;il n&#8217;y ai qu&#8217;un simple billet annonçant la livraison d&#8217;un nouveau module et son fonctionnement. Ce sera à voir suivant le type de module et son utilité.</p>

<p>Cela se fera également selon une démarche XP, le code mis en ligne à travers <a href="http://github.com/">GitHub</a> ne sera donc pas forcément complet à chaque fois mais sera garanti &laquo;&nbsp;en état de fonctionnement&nbsp;&raquo;. La démarche XP est donc vraiment une priorité pour moi cette année. Reste à voir comment m&#8217;organiser à ce niveau mais les itérations devraient à priori être de deux semaines.</p>

<h3>Peanut vs Crumblr</h3>

<p>Peanut ne sera absolument pas en concurrence avec <a href="http://www.crumblr-project.com">Crumblr</a> pour plusieurs raisons. La première étant que je ne suis absolument pas développeur sur le projet Crumblr, vous ne pourrez donc pas retrouver quelque chose ici puis sur Crumblr. Il ne faudra, de la même façon pas s&#8217;attendre à des tutoriels expliquant pas par pas le pourquoi du comment mais plus à des questions ouvertes puis la création d&#8217;un module et sa livraison avant d&#8217;améliorer le tout.</p>

<p>A l&#8217;inverse, je pourrais très bien réutiliser du code créé via Crumblr pour l&#8217;intégrer. Le sens du projet sera d&#8217;ailleurs conservé puisque la façon de travailler sur Crumblr et ici ne sera absolument pas la même. Il me faudra donc bel et bien taper le code moi-même.</p>

<h3>Coté licence</h3>

<p>Le moteur ainsi que tout ce qui sera publié en relation avec le projet sera sous licence MIT. Pourquoi cette licence ? Tout simplement parce que je ne voulais pas mettre la société dans laquelle je travaille actuellement en porte-à-faux. Le moteur est donc créé sur mon temps personnel et uniquement sur celui-ci. Le code peut être exploité par tous le monde et n&#8217;oblige à rien tout en évitant tous débats interne ou externe qui auraient une raison d&#8217;être à travers d&#8217;autres licences.</p>

<h3>Conclusion</h3>

<p>Le code sera disponible à tous sur <a href="http://github.com/pocky/peanut">GitHub</a>. J&#8217;espère vraiment à travers cette démarche vous intéresser à créer un fork du projet non seulement pour pouvoir (pourquoi pas) utiliser le moteur pour vos besoins personnels mais aussi pour me corriger et me signaler tous problèmes éventuels ce qui me permettra vraiment d&#8217;atteindre mon objectif.</p>

<p>Pour terminer avec la présentation, j&#8217;espère donc pouvoir livrer à l&#8217;issu de ce projet quelque chose de correct et complet (documentation et mise à disposition de tous les diagrammes) qui pourra être utilisé par tous (et au moins par moi). Nous verrons bien si cela sera le cas <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/projets/peanut/lancement-du-projet-peanut.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Réflexion autour de l’admin-generator symfony</title>
		<link>http://dev.pockyworld.com/developpement/php/reflexion-autour-de-ladmin-generator-de-symfony.html</link>
		<comments>http://dev.pockyworld.com/developpement/php/reflexion-autour-de-ladmin-generator-de-symfony.html#comments</comments>
		<pubDate>Wed, 31 Mar 2010 22:36:11 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[admin-generator]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=148</guid>
		<description><![CDATA[Chose promise, chose due. Voici la premier article d’une longue série sur les différentes approches de développement et le web en général. Cette article fait suite à trois événements : La conférence BeZend et une réflexion sur l’admin-generator Un article publié chez Maxime Un sujet interne à Crumblr Comme vous pouvez vous en douter, cet [...]]]></description>
			<content:encoded><![CDATA[<p>Chose promise, chose due. Voici la premier article d’une longue série sur les différentes approches de développement et le web en général.</p>

<p>Cette article fait suite à trois événements :</p>

<ul>
    <li>La conférence <a title="Accéder au site" href="http://www.be-zend.org/">BeZend</a> et une réflexion sur l’admin-generator</li>
    <li>Un article publié chez <a title="Faille SQL : LoL Guru, je LIKE." href="http://maxime.sh/2010/03/faille-sql-lol-guru-je-like/">Maxime</a></li>
    <li>Un sujet interne à <a title="Accéder au site" href="http://www.crumblr-project.com">Crumblr</a></li>
</ul>

<p>Comme vous pouvez vous en douter, cet article tournera essentiellement autour de l’admin-generator de <a title="Accéder au site" href="http://www.symfony-project.com">symfony</a>.</p>

<h3 id="1_prsentation_de_l8217admin_generator">1. Présentation de l’admin-generator</h3>

<p>Faisons simple pour cette explication, l’admin-generator vous permet très simplement via le biais d’une simple commande symfony de créer une interface d’administration pour votre site. Cela se passe de la façon suivante dans votre terminal. Je pars du principe que vous avez déjà généré votre projet et que vous avez déjà construit votre base de donnée, formulaires, votre model…</p>

<h4 id="11_cration_d8217un_module_avec_l8217admin_generator">1.1 Création d’un module avec l’admin-generator</h4>

<p>Première étape, nous allons créer une application pour le backoffice :</p>

<p><code>php symfony generate:app backend</code></p>

<p>Puis après créer un module géré par l’admin-generator</p>

<p><code>php symfony doctrine:generate-admin backend <em>matable</em> --module=<em>le nom du module</em></code></p>

<p>Et voila, tout est créé. Comme vous pourrez le constater, la démarche est relativement simple.
Le résultat obtenu sera proche de l’exemple ci-dessous :</p>

<p><a href="http://dev.pockyworld.com/wp-content/uploads/2010/03/look_and_feel.png"><img class="alignnone size-full wp-image-193" title="look_and_feel" src="http://dev.pockyworld.com/wp-content/uploads/2010/03/look_and_feel.png" alt="" width="500" height="268" /></a></p>

<p><em>D’autres exemples sur le tutoriel <a title="Jour 12 : L'Admin Generator" href="http://www.symfony-project.org/jobeet/1_4/Doctrine/fr/12">Jobeet</a></em></p>

<h4 id="12_les_fonctionnalits_de_l8217admin_generator">1.2 Les fonctionnalités de l’admin-generator</h4>

<p>L’admin-generator vous créer donc une interface graphique complète avec un certains nombres de fonctionalitées attendues dans un backoffice :</p>

<ul>
    <li>Une interface graphique complète</li>
    <li>Un CRUD complet (Create &#8211; Read &#8211; Update &#8211; Delete)</li>
    <li>Des filtres</li>
    <li>Des actions batchs/lists</li>
    <li>Des messages de validations/erreurs</li>
    <li>Une pagination</li>
</ul>

<p>Ajoutez ensuite à cette liste la possibilité de personnaliser très simplement les différents éléments de l’interface via un fichier <em>generator.yml</em>.</p>

<h4 id="13_conclusion">1.3 Conclusion</h4>

<p>Rapidement, nous pouvons tirer une première conclusion : l’admin-generator est très simple de création. Rien à redire à ce niveau.</p>

<p>Mais l’admin-gen est-il une solution idéale ?</p>

<h3 id="2_l8217aspet_graphique">2. L’aspet graphique</h3>

<p><em>Une petite pensée pour ce cher LoL Guru</em></p>

<p>Il est très facile pour une personne technique de négliger un backoffice sur le plan graphique. Personnellement, tous mes backoffice sont accessible par mes clients. Il faut donc pouvoir livrer quelque chose de correct graphiquement à ce niveau et il m’a donc fallu me pencher très rapidement sur ce problème.</p>

<p>Graphiquement, il faut tout d’abord distinguer deux éléments : le template global de l’application et le template de chacun des modules. Il est donc possible dans un premier temps d’appliquer un style graphique via le fichier <em>apps/backend/templates/layout.php</em>. Cela permettra déjà d’offrir une cure de jouvence à l’interface créée par l’admin-generator.</p>

<p>De la même façon, vous pouvez personnaliser l’admin-generator via le fichier <em>apps/backend/config/view.yml</em> en ajoutant un fichier css qui viendrais remplacer certaines propriétés. Par exemple pour déplacer les filtres en haut du document et pour agrandir les champs input text, il vous suffira très simplement d’appliquer les styles suivants :</p>


<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#sf_admin_bar</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">20px</span> <span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#sf_admin_container</span> input<span style="color: #00AA00;">&#91;</span>type<span style="color: #00AA00;">=</span><span style="color: #993333;">text</span><span style="color: #00AA00;">&#93;</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">400px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>


<p>La encore, rien de bien compliqué. Vous pourrez donc personnaliser un certains nombres d’éléments de cette façon.</p>

<h4 id="21_oui_mais_moi_je_veux_vraiment_tout_personnaliser_">2.1 Oui mais moi, je veux vraiment tout personnaliser !</h4>

<p>C’est un peu la que tout commence à se gâter. Si l’envie vous prenais de commencer à vouloir personnaliser les templates, vous pourriez vous apercevoir d’une chose : Il n’y a aucun fichier dans le repertoire templates des modules générés.</p>

<p>wow.</p>

<p>Mais ils sont ou alors ?</p>

<p>Et voila, nous venons de poser le doigt sur le principal inconvénient de l’admin-generator. La simplicité a donc bel et bien un revers. Il vous faudra en effet surcharger un certain nombre d’éléments de l’admin-generator pour pouvoir en profiter pleinement. Et pour retrouver tout ses fichiers, il vous faudra aller dans le repertoire cache de votre application et les ouvrir tour à tour pour mettre le doigt sur le contenu de l’élément concerné.</p>

<p>Cela peut être très simple, la personnalisation minimale étant à mon sens étant celle du fichier <em>generator.yml</em> dans le module concerné afin de réorganiser l’affichage.</p>

<p>Autre exemple avec un plugin <em>must-have</em>. Pour personnaliser le formulaire d’authentification de <a title="Voir le plugin" href="http://www.symfony-project.org/plugins/sfDoctrineGuardPlugin">sfDoctrineGuardPlugin</a>, il vous faudra créer un répertoire <em>templates</em> dans un module <em>sfGuardAuth</em> pour enfin faire un fichier <em>signinSuccess.php</em> qui vous permettra de reprendre le code.</p>

<p>Heureusement pour nous, il existe une liste de tous les templates utilisés :</p>

<ul>
    <li><strong>_assets.php</strong> Rendre lees CSS et les JS pour les utiliser dans les Templates</li>
    <li><strong>_filters.php</strong> Rendre la zone des filtres</li>
    <li><strong>_filtersfield.php</strong> Rendre un seul champ du filtre</li>
    <li><strong>_flashes.php</strong> Rendre les messages flash</li>
    <li><strong>_form.php</strong> Afficher le formulaire</li>
    <li><strong>_form_actions.php</strong> Afficher les actions du formulaire</li>
    <li><strong>_form_field.php</strong> Afficher un seul champ du formulaire</li>
    <li><strong>_form_fieldset.php</strong> Afficher un jeu de champs du formulaire</li>
    <li><strong>_form_footer.php</strong> Afficher le formulaire pied de page</li>
    <li><strong>_form_header.php</strong> Afficher le formulaire d’entête</li>
    <li><strong>_list.php</strong> Afficher la liste</li>
    <li><strong>_list_actions.php</strong> Afficher les actions de la liste</li>
    <li><strong>_list_batch_actions.php</strong> Afficher les actions batch de la liste</li>
    <li><strong>_list_field_boolean.php</strong> Afficher un seul champ booléen dans la liste</li>
    <li><strong>_list_footer.php</strong> Afficher le pied de page de la liste</li>
    <li><strong>_list_header.php</strong> Afficher l’entête de la liste</li>
    <li><strong>_list_td_actions.php</strong> Afficher les actions d’un objet pour une ligne</li>
    <li><strong>_list_td<em>batch</em>actions.php</strong> Afficher le checkbox pour une ligne</li>
    <li><strong>_list_td_stacked.php</strong> Afficher le layout stacked pour une ligne</li>
    <li><strong>_list_td_tabular.php</strong> Afficher un seul champ pour la liste</li>
    <li><strong>_list_th_stacked.php</strong> Afficher un seul nom de colonne pour l’entête</li>
    <li><strong>_list_th_tabular.php</strong> Afficher un seul nom de colonne pour l’entête</li>
    <li><strong>_pagination.php</strong> Afficher la pagination de la liste</li>
    <li><strong>editSuccess.php</strong> Afficher la vue edit</li>
    <li><strong>indexSuccess.php</strong> Afficher la vue list</li>
    <li><strong>newSuccess.php</strong> Afficher la vue new</li>
</ul>

<p>Cela représente donc un certain nombre de fichiers et il vous faudra prendre en compte la problématique qui pour faire simple sera la suivante :</p>

<ul>
    <li>Est-ce que j’ai un ou plusieurs templates à surcharger ?</li>
    <li>Est-ce que cette modification est redondante à l’ensemble des modules ?</li>
</ul>

<p>Enfin et pour conclure avec cette partie, ce travail de personnalisation complète du backoffice n’est fondamentalement pas plus complexe que pour le backoffice d’un Joomla, d’un Drupal, d’un WordPress et j’en passe. Si vous savez intégrer pour votre front-office, vous saurez le faire pour le back-office.</p>

<h3 id="3_cot_code_maintenant">3. Coté code maintenant</h3>

<p>N’y allons pas par quatre chemins, la encore vous aurez le bonheur de trouver des fichiers actions.class.php complètement vide qui vous permettront de surcharger tout ce que vous pourrez retrouver dans les fichiers stockés dans le cache.</p>

<p>La liste complète des actions est la suivante (attention les traductions sont un peu aléatoires <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) :</p>

<ul>
    <li><strong>executeIndex()</strong> Action de la vue list</li>
    <li><strong>executeFilter()</strong> Mettre à jour les filtres</li>
    <li><strong>executeNew()</strong> Action de la vue new</li>
    <li><strong>executeCreate()</strong> Création d’un enregistrement</li>
    <li><strong>executeEdit()</strong> Edition d’un enregistrement</li>
    <li><strong>executeUpdate()</strong> Mise à jour d’un enregistrement</li>
    <li><strong>executeDelete()</strong> Supprimer un enregistrement</li>
    <li><strong>executeBatch()</strong> Executer une action batch</li>
    <li><strong>executeBatchDelete()</strong> Executer l’action batch _delete</li>
    <li><strong>processForm()</strong> Processer le formulaire emploi</li>
    <li><strong>getFilters()</strong> Retourner le filtre actuel</li>
    <li><strong>setFilters()</strong> Définir le filtre</li>
    <li><strong>getPager()</strong> Retourner la pagination de la liste</li>
    <li><strong>getPage()</strong> Obtenir la page de la pagination</li>
    <li><strong>setPage()</strong> Définir la page de la pagination</li>
    <li><strong>buildQuery()</strong> Construire la requête pour la liste</li>
    <li><strong>addSortQuery()</strong> Ajouter la requête de tri pour la liste</li>
    <li><strong>getSort()</strong> Retourner la colonne triée actuelle</li>
    <li><strong>setSort()</strong> Définit la colonne triée actuelle</li>
</ul>

<p>La encore, beaucoup d’éléments à prendre en compte.</p>

<h4 id="31_les_form_ulaires_et_relations">3.1 Les formulaires et relations</h4>

<p>Qui dit backoffice dit interraction avec la base de donnée et donc beaucoup de formulaires ce qui me permet de répondre à l’une des plus belles idioties entendue au Be-Zend sur l’admin-generator : Non, un module créé avec l’admin-generator n’intérragie pas forcément avec une seule des tables de votre base de donnée. Je tairais même le nom de l’auteur de cette remarque afin de préserver sa réputation <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (jusqu’à ce que les vidéos arrivent).</p>

<p>Créer un module via la commande doctrine:generate-admin c’est très basiquement créer un module avec un template généré et des fonctions prédéfinies. Vous pouvez donc intéragir de la même façon qu’avec un module classique et vous pourrez avec un seul formulaire “en apparence” travailler avec un nombre X de tables avec autant de formulaires. Je vous conseille d’ailleurs d’aller lire un article de <a title="Embedding relations in Forms" href="http://prendreuncafe.com/blog/post/2009/11/29/Embedding-Relations-in-Forms-with-Symfony-1.3-and-Doctrine">Niko</a> expliquant les embedForms et embedRelations.</p>

<p>Un embedForm pourra donc être intégré via le <em>generator.yml</em> en l’appelant tout simplement par son nom. Tous les champs seront appelés et vous pourrez très simplement les exploiter. Une même page d’édition/création pourra par exemple vous permettre de travailler sur votre table <em>post</em> et votre table <em>seo</em> pour une plus grande souplesse. La limite étant uniquement humaine : est-ce que vos formulaires à ralonge ne vont pas déstabiliser l’utilisateur ? (ce qui sera d’autant plus vrai dans le cadre de l’utilisation de plusieurs langue via I18n)</p>

<p>Inutile de le préciser, l’ensemble des champsdes formulaire sont bien évidemment personnalisable via les fichiers correpondant dans <em>/lib/form/doctrine/xxxForm.class.php</em></p>

<h4 id="32_les_actions_batch_et_list">3.2 Les actions batch et list</h4>

<p>La encore, tout est très simple. Nous retrouvons vraiment une philosophie symfony dans l’admin generator. Créer une action batch/list consiste donc en un minimum de deux étapes :</p>

<ol>
    <li>Ajout d’un batch dans le fichier generator.yml</li>
    <li>Création de l’action correpondante dans le fichier actions.class.php de type : public function executeBatchXXX(sfWebRequest $request) { } OU public function executeListXXX(sfWebRequest $request) { }</li>
</ol>

<p>Cerise sur le gateau, le code que vous ferez à travers vos batchs/lists pourra être utilisé pour créer une tache symfony avec très peu de code à modifier. Cela permettra par exemple de pouvoir appeler une tache automatiquement via Cron tout en offrant la possibilité à l’utilisateur de faire la même chose via une action batch/list.</p>

<h4 id="33_et_ce_n8217est_pas_fini">3.3 Et ce n’est pas fini</h4>

<p>Vous pouvez rapidement faire un tour de l’ensemble des possibilités dans le chapitre dédié à l’<a href="http://www.symfony-project.org/jobeet/1_4/Doctrine/fr/12">admin-generator</a> du tutoriel Jobeet.</p>

<h3 id="4_alors_l8217admin_generator_killer_admin_">4. Alors l’admin-generator killer admin ?</h3>

<p>Par moments oui tandis que d’autres non.</p>

<p>Comme vous avez pu le remarquer, un nombre conséquent de possibilités sont facilement accessible via l’admin-generator mais cela implique un nombre plus ou moins important de changements. Il faudra donc avant tout chose peser le pour et le contre vis à vis du projet.</p>

<ul>
    <li>A quoi va me servir l’admin-generator (interaction complète avec le front comme un CMS ou partielle comme Jobeet par exemple)</li>
    <li>Quel va être le niveau de personnalisation graphique ?</li>
    <li>Quel sont les attentes en terme de fonctionnalités à surcharger ?</li>
</ul>

<p>Les réponses à ces différentes questions vous permettront d’établir un pourcentage variable allant (à mon niveau) de 10% à presque 70% d’éléments à surcharger. L’utilisation de l’admin-generator doit donc être un élément réfléchi dont il faut peser l’impact et penser l’utilisation. Dans le cadre d’applications simples, l’admin-generator sera un outil idéal vous permettant de gagner énormément de temps mais si vous devez commencer à ajouter des fonctionnalités importantes ou de l’AJAX par exemple, les surcharges pourront devenir très importantes et le routage pourra même être impacté. Dans ce cas, un backoffice créé de toute pièce sera donc plus adapté.</p>

<p>Quant à la mixité admin-generator/module classique, j’ai un peu de mal à y croire car il faudra expliquer les différences graphiques entre les templates maison et ceux générés. Pour mettre à niveau le tout, il faudra donc prévoir la personnalisation de l’ensemble et donc la encore un certain nombre d’heures de travail.</p>

<p>Quoi qu’il en soit, l’admin-generator n’est pas à sous-estimer car il peut rendre service dans de nombreux cas en vous permettant de gagner énormément de temps. Après tout, c’est exactement ce à quoi il destiné.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/developpement/php/reflexion-autour-de-ladmin-generator-de-symfony.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Le billet du retour ?</title>
		<link>http://dev.pockyworld.com/edito/le-billet-du-retour.html</link>
		<comments>http://dev.pockyworld.com/edito/le-billet-du-retour.html#comments</comments>
		<pubDate>Mon, 29 Mar 2010 22:14:39 +0000</pubDate>
		<dc:creator>Alexandre</dc:creator>
				<category><![CDATA[Edito]]></category>
		<category><![CDATA[crumblr]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://dev.pockyworld.com/?p=143</guid>
		<description><![CDATA[Bonjour à tous, Long moment d&#8217;absence sur ce blog (et les autres) mais l&#8217;envie commence à revenir alors autant en profiter. Pour ce (re)nouveau premier billet, un petit récapitulatif de l&#8217;année 2009, un petit topo concernant les projets en cours pour terminer avec un peu d&#8217;avenir. En 2009, je suis développeur web Ceux qui connaissent [...]]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>

<p>Long moment d&#8217;absence sur ce blog (et les autres) mais l&#8217;envie commence à revenir alors autant en profiter. Pour ce (re)nouveau premier billet, un petit récapitulatif de l&#8217;année 2009, un petit topo concernant les projets en cours pour terminer avec un peu d&#8217;avenir.</p>

<h3>En 2009, je suis développeur web</h3>

<p>Ceux qui connaissent mon parcours savent que si j&#8217;en suis venu au web, c&#8217;est surtout grâce à de bonnes rencontre et un peu de travail personnel. Pendant environ deux ans, je me suis cantonné au rôle d&#8217;intégrateur touche à tout. Tour à tour intégrateur, webdesigner ou encore développeur WordPress (et blagueur) je n&#8217;ai que peu touché au développement &laquo;&nbsp;from scratch&nbsp;&raquo;. A la mi 2009, tout à changé et j&#8217;ai créé mon premier fichier avec l&#8217;extension php. Tout seul. Comme un grand.</p>

<p>Alors avant d&#8217;aller plus loin, quelques remerciements. C&#8217;est Romain aka <a title="voir son blog" href="http://palleas.com/">Palleas</a> qui ouvre le bal car c&#8217;est vraiment lui qui m&#8217;a supporté au début. Viens ensuite indirectement <a title="voir son site" href="http://www.hugohamon.com/">Hugo</a> à travers son site pour débutant <a title="voir le site" href="http://www.apprendre-php.com/">apprendre-php.com</a> et le duo <a title="voir le site" href="http://www.eexit.net/">Joris</a>/<a title="voir son blog" href="http://pioupioum.fr/">Mehdi</a> via leurs différentes relectures/debug/conseils sur quelques pastie.</p>

<p>A tout ça c&#8217;est rajouté différents ouvrages : <a href="http://www.eyrolles.com/Informatique/Livre/php-5-avance-9782212113235">PHP5 avancé</a>, <a href="http://www.eyrolles.com/Informatique/Livre/php-5-9782212114072">PHP5 cours et exercices</a> et <a href="http://www.eyrolles.com/Informatique/Livre/best-practices-php-5-9782212116762">PHP5 Best Practices</a>. Je pense d&#8217;ailleurs prendre quelques actions chez Eyrolles.</p>

<p>L&#8217;apprentissage c&#8217;est déroulé de la façon suivante : Il y avait un besoin client auquel je ne pouvais pas répondre via les différentes solutions CMS existentes. Quelque chose qui devait être &laquo;&nbsp;from scratch&nbsp;&raquo; et un contexte qui rendait impossible la sous-traitance. C&#8217;est donc ce besoin qui après un bon paquet de bonnes excuses a été le déclencheur. Paradoxalement, j&#8217;ai tout de suite écarté les frameworks car j&#8217;avais peur de ne pas pouvoir comprendre leurs fonctionnement et passer trop de temps que je n&#8217;avais pas sur une problématique.</p>

<p>La démarche à donc été ma démarche habituelle :</p>

<ul>
    <li>Trouver un maximum de ressources pertinentes afin de cibler directement les bonnes pratiques</li>
    <li>Segmenter l&#8217;application en différentes parties et trouver une solution aux différents problèmes</li>
    <li>S&#8217;appuyer sur des projets existants, notamment au niveau de l&#8217;organisation des fichiers et les différents appels entre les fichiers afin d&#8217;optimiser au maximum</li>
</ul>

<p>Cela a rapidement donné une première version. Trop chaotique à mon gout qui n&#8217;est jamais sortie de l&#8217;environnement de développement. Une seconde version à donc été faite en prenant quelques bonnes idées issues du Zend Framework. Le moteur était donc plus souple et ouvert à de nouvelles fonctionnalités ce qui a permit de créer l&#8217;application complète avec des process métiers cohérents. Ceci dit, il était encore perfectible.</p>

<p>La v3 du moteur est donc arrivée peu de temps après avec pour objectif d&#8217;exploiter la POO au maximum. Après quelques lignes de codes, je me suis surtout rendu compte d&#8217;une chose : il était complètement stupide de faire cette v3. Cette v3 aurait effectivement eu un sens si l&#8217;objectif avait été celui de réinventer la roue pour mieux la comprendre mais ce n&#8217;était pas le cas. J&#8217;ai donc commencé à benchmarker quelques frameworks.</p>

<p>Fin Aout, le choix était arrêté : Symfony. Ce choix a essentiellement été fait grâce au bien connu <a title="voir le tutoriel" href="http://www.symfony-project.org/jobeet/1_4/Doctrine/fr/">Jobeet</a>, tutoriel d&#8217;apprentissage du Framework. A noter qu&#8217;à la même époque, la ferme du web débutait la publication de son application <a href="http://www.lafermeduweb.net/tutorial/symfony-creer-un-site-web-avec-le-framework-php-symfony-14.html">Watch My Desk</a>. L&#8217;idée de pouvoir exploiter d&#8217;autres framework, notamment Zend de façon simple et pertinente a également été un gros plus.</p>

<p>L&#8217;apprentissage à cependant été difficile, beaucoup d&#8217;éléments à prendre en compte dès le début : la philosophie MVC en tête qui est déstabilisante au début mais dont je n&#8217;arrive plus à me séparer. Viennent ensuite la syntaxe Doctrine aka DQL et le Yaml (notamment au niveau de la création de la base). Cela c&#8217;est somme toute bien passé puisque je travail actuellement uniquement avec symfony et certains composants du <a href="http://framework.zend.com/" title="Le site du framework">Zend Framework</a>.</p>

<p>Depuis la fin Septembre, beaucoup d&#8217;apprentissage sur symfony et surtout, surtout, beaucoup de refactoring <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<h3>En 2010, je suis Chef de Projet</h3>

<p>Car après tout, c&#8217;est encore l&#8217;intitulé sur ma feuille de paie.</p>

<p>L&#8217;étape 2009 a donc permis de créer une base suffisamment fiable et une série de plugins permettant de répondre à 3/4 des besoins de mes clients et me contenter de refactorer mon code dans le but de l&#8217;optimiser. Je peux donc me dégager du temps pour reprendre les process et la démarche web de l&#8217;entreprise dans le but de la perfectionner.</p>

<p>Le fonctionnement et la taille de la société étant tout à fait adapté à l&#8217;eXtreme Programming, je suis entrain de tourner toute l&#8217;approche dans ce sens. Le but étant de commencer à proposer une approche agile d&#8217;ici environ un à deux mois.</p>

<p>Ceci dit, il ne faut pas s&#8217;endormir sur ses lauriers alors&#8230;</p>

<h3>En 2010, de nombreux projets personnels</h3>

<h4>Crumblr : Cooking for developers</h4>

<p>Certainement LE projet 2010, <a href="http://crumblr-project.com/">Crumblr</a> est né suite à série de constats professionnels et des réflexions communes entre Romain, <a href="http://www.2cool4school.fr/">Xavier</a> et moi. Avec un peu de recul, nous nous sommes bien rendu compte que finalement peu de personnes arrivaient à se rendre compte des différents aboutissants du projet. Si je devais les résumer dans les grandes lignes, cela donnerai à peu près ceci :</p>

<ul>
    <li>Guider un débutant à travers une suite de tutoriels pertinents</li>
    <li>Aiguiller le professionnel en lui montrant des applications/technologies concrètes répondant à un réél besoin client</li>
    <li>Expliciter les différentes approches web : philosophie de travail, bonne pratiques, réutilisabilité du code, &#8230;</li>
    <li>Ouvrir à tous les professionnels du métier la possibilité de créer un tutoriel ou même de reprendre une partie déjà publiée dans le but de l&#8217;améliorer aussi bien au niveau code qu&#8217;au niveau des fonctionnalités</li>
    <li>Ne surtout pas faire le travail à votre place car cela ne vous servirait absolument pas sur le long terme</li>
</ul>

<p>Le dernier point est d&#8217;importance, il sera en effet impossible de télécharger les sources des projets car la réflexion de base nous a directement fait remonter l&#8217;un des points les plus importants : rien ne vaux la pratique. Un &laquo;&nbsp;feignant&nbsp;&raquo; devra donc au minimum copier/coller l&#8217;ensemble du code publié dans les tutoriels pour arriver à son objectif. Cela devrait donc contribuer à son apprentissage en espérant que l&#8217;envie de commencer à développer &nbsp;&raquo;correctement&nbsp;&raquo; le démange assez vite. Quitte à ce que ce soit sur un second projet.</p>

<p>D&#8217;un point de vu personnel, le projet est pour moi le parfait petit labo me permettant d&#8217;essayer différentes choses correctement et trouver un juste milieu entre l&#8217;idéal professionnel et la réalité du terrain. Mon coté multi-tache me permettra également de pouvoir aider sur à peu près tous les postes ou presque ce qui permettra également de me perfectionner.</p>

<h4>Tous les &laquo;&nbsp;a cotés&nbsp;&raquo;</h4>

<p>Plusieurs projets personnels à coté de tout ça. Ces projets auront pour but de continuer à me faire progresser en développement tout en mêlant utile, agréable et surtout fun (moteur essentiel en ce qui me concerne au cas ou vous ne l&#8217;auriez pas encore remarqué). Il y aura donc la refonte de tous mes blogs autour de symfony, un projet fun et un petit réseau social pour la famille (hellotipi like) au programme de 2010 si le temps me le permet. J&#8217;ai beaucoup de progrès à faire au niveau des tests, tous ces projets devraient donc être en TDD.</p>

<h3>Et ce blog ?</h3>

<p>Le constat est le suivant : je n&#8217;ai pas le temps pour le mettre à jour au niveau &laquo;&nbsp;technique&nbsp;&raquo; à proprement parlé. Tout ce qui serait commencé ici serait donc plus ou voué à s&#8217;étaler sur une période plus ou moins longue voir même ne jamais être terminé.</p>

<p>Je pense donc réorienter ce blog autour de réflexions techniques sans pour autant négliger deux trois bouts de codes quand le coeur m&#8217;en dira. Un certains nombres de réflexions devraient donc être abordées ici afin de laisser la place au dialogue dans les commentaires avant d&#8217;être appliquées sur Crumblr. Les deux blogs seront donc pour moi un parfait complément sur le plan professionnel et personnel.</p>

<p>Ne reste plus qu&#8217;à savoir si je m&#8217;y tiendrais&#8230; Ceci dit le nombre de fautes que je fais actuellement commence sérieusement à m&#8217;énerver et écrire comme je le faisait avant est donc un parfait remède au problème alors&#8230; <img src='http://dev.pockyworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://dev.pockyworld.com/edito/le-billet-du-retour.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	<media:rating>nonadult</media:rating></channel>
</rss>
