<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://fashion.hosmoz.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Digital Fashion - organisation</title>
  <link>http://fashion.hosmoz.net/</link>
  <description>Rien de grand ne se fit jamais sans enthousiasme.</description>
  <language>en</language>
  <pubDate>Wed, 23 Jul 2008 21:28:31 +0200</pubDate>
  <copyright>2003-2007 &amp;copy; Geoffrey Bachelet</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Le firebug nouveau est arrivé</title>
    <link>http://fashion.hosmoz.net/post/2006/12/05/Le-firebug-nouveau-est-arrive</link>
    <guid isPermaLink="false">urn:md5:d5a923255f62f471634bbd7f45301cd0</guid>
    <pubDate>Tue, 05 Dec 2006 11:05:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>firebug</category><category>firefox</category><category>javascript</category><category>optimisation</category><category>organisation</category><category>way of life</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://www.getfirebug.com/&quot;&gt;Firebug 1.0b1&lt;/a&gt; est sorti. Et il est bien (tm).&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/12/05/Le-firebug-nouveau-est-arrive#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/12/05/Le-firebug-nouveau-est-arrive#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/729</wfw:commentRss>
      </item>
    
  <item>
    <title>Linux + gVim + Rox-filer = Mon IDE.</title>
    <link>http://fashion.hosmoz.net/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE</link>
    <guid isPermaLink="false">urn:md5:024270855ec063e421b28cf4d62f4906</guid>
    <pubDate>Tue, 28 Nov 2006 22:39:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>clichés</category><category>configuration</category><category>environnement</category><category>interfaces utilisateurs</category><category>opinions</category><category>organisation</category><category>php</category><category>svn</category><category>ubuntu</category><category>unix</category><category>vim</category><category>way of life</category>    
    <description>&lt;p&gt;Une des questions cruciales qui se pose à tout développeur à au moins un moment de sa vie (souvent plusieurs en fait) est le choix d'un environnement de développement. J'en ai testé pas mal, plus ou moins longtemps, et bien que je ne sois jamais complètement satisfait, l'idée de &lt;em&gt;perdre du temps&lt;/em&gt; à développer le mien m'indispose. J'ai donc opté pour l'environnement qui me va le mieux: Linux + gVim + Rox-filer.&lt;/p&gt;


&lt;p&gt;Note: je ne couvre pas ici les fonctionnalités de débuging avancé, que je n'utilise pas encore, mais pour lesquelles j'ai déjà en tête des solutions qui me conviendront bien mieux que les outils intégrés à un quelconque &lt;acronym&gt;IDE&lt;/acronym&gt; (je pense fortement à Xdebug).&lt;/p&gt;    &lt;h3&gt;Comment définir un IDE ?&lt;/h3&gt;


&lt;p&gt;Commençons par le début: qu'est-ce qu'un &lt;acronym&gt;IDE&lt;/acronym&gt; ? Acronyme de &lt;em&gt;Integrated Development Environment&lt;/em&gt;, le terme peut prendre pas mal de signification selon la personne à laquelle on s'adresse. Pour certains, &lt;em&gt;le plus c'est le mieux&lt;/em&gt;, alors que pour d'autre, &lt;em&gt;le moins c'est le pas plus mal finalement&lt;/em&gt;. On pourra citer quelques exemples connus d'&lt;acronym&gt;IDE&lt;/acronym&gt; &lt;em&gt;full-featured&lt;/em&gt;, tels que les incournables &lt;em&gt;Zend Studio&lt;/em&gt;, &lt;em&gt;Eclipse&lt;/em&gt; et autres &lt;em&gt;phpEdit&lt;/em&gt;, mais ce n'est pas le but de cet article. Ici, je vais vous expliquer pourquoi et comment j'utilise quotidiennement gVim et Rox-filer, et le tout sous Ubuntu.&lt;/p&gt;


&lt;p&gt;Revenons en à nos moutons, un environnement de développement, c'est constitué de quelques briques primordiales:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un éditeur de code&lt;/li&gt;
&lt;li&gt;Un navigateur de fichier&lt;/li&gt;
&lt;li&gt;Un truc qui fait tourner tout ça&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Peu importe qu'ils soient &lt;em&gt;intégrés&lt;/em&gt; ou non, finalement. Personnellement, je suis un fervent adepte du précepte &lt;em&gt;une tâche, un outil&lt;/em&gt;, donc je preferre qu'ils soient dissociés.&lt;/p&gt;


&lt;h3&gt;L'éditeur de code: gVim&lt;/h3&gt;


&lt;p&gt;Certains perdent leurs moyens à la simple évocation de son nom, &lt;em&gt;vim&lt;/em&gt; n'est pourtant rien de plus que le plus puissant des éditeurs de fichier aujourd'hui disponible dans le monde (un troll s'est malicieusement glissé dans cette affirmation, saurez-vous le retrouver ?). Ce qui déroute au premier abord dans &lt;em&gt;vim&lt;/em&gt;, c'est finalement ce qui fait toute sa puissance: le mode &lt;em&gt;commande&lt;/em&gt;. J'ai longtemps utilisé &lt;a href=&quot;http://bluefish.openoffice.nl/index.html&quot;&gt;bluefish&lt;/a&gt;, et finalement las de ses quelques bugs bien énervants (wtf syntax color ?), j'ai décidé de faire le grand pas, et d'utiliser &lt;em&gt;vim&lt;/em&gt;. J'avais bien sur déjà une expérience de cet éditeur, mais retenez bien que le meilleur moyen de maitriser un outil aussi puissant que &lt;em&gt;vim&lt;/em&gt;, ce n'est pas de se jeter à corps perdu dans la doc, mais c'est d'investir du temps incrémentiellement: commencer à utiliser &lt;em&gt;vim&lt;/em&gt;, et quand on souhaite faire quelque chose qu'on ne sait pas faire, lire &lt;a href=&quot;http://vimdoc.sf.net/&quot;&gt;la doc correspondante&lt;/a&gt;&lt;sup&gt;[&lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/28/#pnote-723-1&quot; id=&quot;rev-pnote-723-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. Pour finir, j'ai traduit il y a quelque temps un excellent tutoriel sur &lt;em&gt;vim&lt;/em&gt;: &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2004/05/08/150-ledition-efficace-avec-vim&quot;&gt;L'édition efficace avec vim&lt;/a&gt;, donc n'hésitez pas.&lt;/p&gt;


&lt;h4&gt;Un .vimrc qu'il est joli&lt;/h4&gt;


&lt;p&gt;Comme la plupart des applications &lt;em&gt;*nix&lt;/em&gt;, &lt;em&gt;vim&lt;/em&gt; autorise l'utilisation d'un fichier &lt;em&gt;~/.vimrc&lt;/em&gt;. S'il peut paraitre compliqué au premier abord d'élaborer un &lt;em&gt;.vimrc&lt;/em&gt; efficace, il ne faut pas se décourager, car comme d'habitude, il y a tout ce qu'il faut sur le net. J'en veux pour preuve &lt;a href=&quot;http://schlitt.info/applications/blog/index.php?/archives/488-Comfortable-PHP-editing-with-VIM-5.html&quot;&gt;les excellents articles&lt;/a&gt; de &lt;a href=&quot;http://schlitt.info/&quot;&gt;Tobias Schlitt&lt;/a&gt; à ce sujet.&lt;/p&gt;


&lt;p&gt;Pour info, quelques directives de configuration utiles qu'on peut trouver dans mon &lt;em&gt;.vimrc&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;quot; Supprime un buffer de la mémoire via le raccourci clavier Ctrl+W
noremap &amp;lt;C-W&amp;gt; :bdel!&amp;lt;CR&amp;gt;

&amp;quot; Active l'indentation automatique
set autoindent

&amp;quot; Active les plugins de type de fichier
filetype plugin on

&amp;quot; Active la coloration syntaxique
syntax on

&amp;quot; Thème de couleur pour gVim
colorscheme desert

&amp;quot; Utiliser des tabs de 4 caractères pour l'indentation
set noexpandtab tabstop=4 shiftwidth=4

&amp;quot; Activer la souris (molette, sélection, etc)
set mouse=a

&amp;quot; Afficher des infos dans la barre de status
set ruler
set laststatus=2

&amp;quot; Activer la numérotation des lignes
set number

&amp;quot; Utiliser la recherche incrémentielle
set incsearch

&amp;quot; Ne pas surligner les résultats de recherche
set nohlsearch
&lt;/pre&gt;


&lt;p&gt;Quelques unes (beaucoup en fait) de ces directives sont tirées du &lt;em&gt;.vimrc&lt;/em&gt; de Tobias.&lt;/p&gt;


&lt;p&gt;Dernier détail pour les réfractaires de la ligne de commande, &lt;em&gt;gVim&lt;/em&gt; s'execute en &lt;em&gt;mode graphique&lt;/em&gt;, avec une interface &lt;acronym&gt;GTK&lt;/acronym&gt; conviviale qui permet d'apprendre les raccourcis aisément, et qui gère la souris (défilement à la molette, etc, et d'ailleurs, même en console ça gère la souris, il suffit d'un &lt;code&gt;:set mouse=&amp;quot;a&amp;quot;&lt;/code&gt; pour l'activer).&lt;/p&gt;


&lt;h4&gt;Un ftplugin pour le PHP&lt;/h4&gt;


&lt;p&gt;Ce qu'on appelle &lt;em&gt;ftplugin&lt;/em&gt; dans &lt;em&gt;vim&lt;/em&gt; permet de configurer &lt;em&gt;vim&lt;/em&gt; en fonction du type de fichier que l'on édite. Tobias fournit un &lt;em&gt;ftplugin&lt;/em&gt; spécialisé dans l'édition du &lt;acronym&gt;PHP&lt;/acronym&gt; plutôt bien foutu, qui gère la plupart des &lt;em&gt;features convi-enabled&lt;/em&gt; des soit disants &lt;acronym&gt;IDE&lt;/acronym&gt; évolués:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complétion des fonctions&lt;/li&gt;
&lt;li&gt;Complétion des mots-clés&lt;/li&gt;
&lt;li&gt;Auto-fermeture des crochets, parenthèses, etc.&lt;/li&gt;
&lt;li&gt;Auto-génération des docblocks PHPDoc&lt;/li&gt;
&lt;li&gt;Vérification de syntaxe du fichier édité&lt;/li&gt;
&lt;li&gt;Et d'autres trucs merveilleux !&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La classe non ?&lt;/p&gt;


&lt;h3&gt;Un navigateur de fichier kirox (tm)&lt;/h3&gt;


&lt;p&gt;C'est pas moi qui le dit, en fait c'est comme le port-salut, &lt;a href=&quot;http://rox.sf.net/&quot;&gt;rox-filer&lt;/a&gt; rox, c'est tout. Pour ceux que ma puissance de persuasion ne suffit pas, et bien &lt;em&gt;rox-filer&lt;/em&gt; offre tout ce que vous pourriez attendre d'un gestionnaire de fichier moderne:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigation spatiale avec technologie &lt;em&gt;oupas&lt;/em&gt; (tm)&lt;/li&gt;
&lt;li&gt;Prévisualisation des images&lt;/li&gt;
&lt;li&gt;Personnalisation (aisée !) des applications utilisées pour lancer les fichiers (en fonction du mimetype)&lt;/li&gt;
&lt;li&gt;Navigation one-click (&lt;em&gt;oupas&lt;/em&gt; (tm))&lt;/li&gt;
&lt;li&gt;Navigation aisée au clavier&lt;/li&gt;
&lt;li&gt;Monitorage des fichiers en cours d'utilisation (ils apparaissent en &lt;strong&gt;gras&lt;/strong&gt;, ce qui est pratique).&lt;/li&gt;
&lt;li&gt;Et j'en passe et des meilleurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, il fait tout ce que ferait un &lt;em&gt;filebrowser&lt;/em&gt; intégré, mais en mieux, puisqu'il est dédié dès le début à cette tache. Afin de le faire interragir au mieux avec gVim, j'utilise la &lt;em&gt;Run action&lt;/em&gt; suivante sur le mimetype &lt;code&gt;text/*&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;gvim --servername ash0 --remote-silent-tab &amp;quot;$@&amp;quot;&lt;/pre&gt;


&lt;p&gt;Qui permet d'ouvrir le fichier dans un nouveau tab de &lt;em&gt;vim&lt;/em&gt;, en créant une instance d'un server &lt;em&gt;vim&lt;/em&gt; à la volée si il n'existe pas déjà (ici le server s'appelle &lt;code&gt;ash0&lt;/code&gt;, mais vous pouvez bien évidemment en changer le nom).&lt;/p&gt;


&lt;h3&gt;Une distribution du bien: Ubuntu&lt;/h3&gt;


&lt;p&gt;Et parcequ'il faut bien faire tourner tout ça, j'utilise un système d'exploitation &lt;em&gt;du bien&lt;/em&gt; (tm): GNU/Linux. Mais comme j'ai la flemme, j'utilise une configuration &lt;em&gt;convi-enabled&lt;/em&gt;: &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;. Pas besoin de s'étaler je pense, Ubuntu c'est &lt;strong&gt;bien&lt;/strong&gt;, tout le monde en conviendra.&lt;/p&gt;


&lt;h3&gt;Un window-manager léger et puissant: fluxbox&lt;/h3&gt;


&lt;p&gt;Le choix du gestionnaire de fenêtre peut par contre préter a controverse. En effet, c'est ici avant tout une question de gout et de puissance de machine. J'ai personellement un penchant pour les logiciels puissants et légers. Là je vous vois venir avec vos gros sabots: &lt;em&gt;tout le monde veut ce genre de logiciel&lt;/em&gt;. Et bien j'ai envie de répondre que non. La majorité des &lt;em&gt;neo-geeks&lt;/em&gt; de la génération Ubuntu s'en donnent à coeur joie sous Gnome et/ou KDE, qui est loin de ce qu'il convient d'appeler un logiciel &lt;em&gt;puissant et léger&lt;/em&gt;, sous prétexte que les autres &lt;acronym&gt;WM&lt;/acronym&gt; (à part &lt;acronym&gt;KDE&lt;/acronym&gt;), &lt;em&gt;saitrocomplicai&lt;/em&gt;. Bon là ok, j'amalgame surement un peu (beaucoup même, tous les gens sous Gnome ne sont pas des &lt;em&gt;neo-geek&lt;/em&gt;, et l'inverse également), mais il manquait un peu de trollitude dans cet article. Bref, quand on veut, on peut, et comme les gens ne switchent pas de Gnome à un &lt;acronym&gt;WM&lt;/acronym&gt; plus puissant et plus léger, j'en conclus (peut-être à tord hein) qu'ils ne veulent pas.&lt;/p&gt;


&lt;p&gt;Tout ça pour dire que j'utilise &lt;a href=&quot;http://www.fluxbox.org/&quot;&gt;fluxbox&lt;/a&gt;, et ce depuis ma plus tendre enfance. Fluxbox est léger (osez prétendre le contraire...) et puissant: il permet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;de reconfigurer l'intégralité du comportement de vos fenêtres&lt;/li&gt;
&lt;li&gt;une gestion fine et puissante des raccourcis claviers (j'ai pu reconfigurer les touches &lt;em&gt;convi&lt;/em&gt; de mon clavier &lt;em&gt;convi&lt;/em&gt; en quelques minutes dans mon &lt;code&gt;.fluxbox/keys&lt;/code&gt; grâce à &lt;code&gt;xev&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;de controler facilement quelles applications se lancent au démarrage&lt;/li&gt;
&lt;li&gt;de controler encore plus facilement sur quels bureaux se lancent les sus-citées applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par exemple, mon &lt;code&gt;.fluxbox/startup&lt;/code&gt; démarre sur le premier bureau quelques terminaux, un gaim et un exaile; sur le deuxième bureau un firefox sur le troisième bureau: sylphee, et sur le quatrième bureau, un rox-filer. A coté de ça, je dispose de raccourcis claviers conviviaux pour lancer mes logiciels favoris: le terminal (Mod4&lt;sup&gt;[&lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/28/#pnote-723-2&quot; id=&quot;rev-pnote-723-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;+e), rox-filer (Mod4+r), etc. J'ai également à ma disposition des raccourcis claviers pour gérer mes fenêtres: maximiser (horizontalement (Ctrl+Alt+H), verticalement -Ctrl+Alt+V), ou les deux (Ctrl+Alt+M)), &lt;em&gt;enrouler&lt;/em&gt; (Mod4+S), &lt;em&gt;sticker&lt;/em&gt; (Ctrl+Alt+S), enlever les décorations (Ctrl+Alt+T), et j'en passe.&lt;/p&gt;


&lt;p&gt;Enfin, et le plus important pour moi, fluxbox est &lt;em&gt;non-intrusif&lt;/em&gt;. Par défaut, un bureau standard de mon fluxbox ne contient rien. Pas de barre des taches, pas d'icones, pas de menu, &lt;strong&gt;rien&lt;/strong&gt;. Question de gout je vous l'accorde, mais là encore, notez que &amp;quot;c'est faisable&amp;quot;: fluxbox ne vous impose rien, et surtout pas les choix discutables car subjectifs des développeurs.&lt;/p&gt;


&lt;h3&gt;Subversion en ligne de commande&lt;/h3&gt;


&lt;p&gt;Enfin, j'utilise le client subversion en ligne de commande. D'une part parceque je ne connais pas de client digne de ce nom en &lt;acronym&gt;GTK&lt;/acronym&gt; (ma religion m'interdit d'utiliser &lt;acronym&gt;Qt&lt;/acronym&gt;), d'autre part pour profiter pleinement de la puissance qu'offre un shell quand on sait un minimum s'en servir. Pouvoir passer mes commandes &lt;code&gt;svn&lt;/code&gt; dans des &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;sed&lt;/code&gt;, et autres &lt;code&gt;grep&lt;/code&gt; (surtout &lt;code&gt;grep&lt;/code&gt; en fait), ça n'a pas de prix, et je pense vraiment qu'aucune interface graphique n'arrivera jamais à la cheville de la puissance d'un shell.&lt;/p&gt;


&lt;p&gt;Deuxième avantage à utiliser &lt;code&gt;svn&lt;/code&gt; en ligne de commande: le jour où je serais obligé de le faire, je saurais le faire.&lt;/p&gt;


&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;Voilà, vous savez (presque) tout de mes habitudes de travail (il reste pas mal de domaines à couvrir quand même, je n'ai pas parlé par exemple de mes extensions firefox favorites, ni de mon utilisation intensive de trac, et encore moins des tests unitaires, peut-être une prochaine fois), et j'espère vous avoir donné l'envie de regarder d'un peu plus près ces outils à la réputation peut-être un peu geek, mais d'une puissance incomparable une fois maitrisés :-)&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/28/#rev-pnote-723-1&quot; id=&quot;pnote-723-1&quot;&gt;1&lt;/a&gt;] :help &lt;em&gt;commande&lt;/em&gt; est en général d'une grande utilité&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/28/#rev-pnote-723-2&quot; id=&quot;pnote-723-2&quot;&gt;2&lt;/a&gt;] Le petit nom de la touche Windows&lt;/p&gt;&lt;/div&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/28/Linux-gVim-Rox-filer-Mon-IDE#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/723</wfw:commentRss>
      </item>
    
  <item>
    <title>ViewHelper de génération d'urls</title>
    <link>http://fashion.hosmoz.net/post/2006/11/24/ViewHelper-de-generation-durls</link>
    <guid isPermaLink="false">urn:md5:c86ea8dd7be65bd1b6c3bd524fa962e3</guid>
    <pubDate>Fri, 24 Nov 2006 20:27:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>configuration</category><category>howto</category><category>i18n</category><category>organisation</category><category>php</category><category>zend framework</category>    
    <description>    &lt;p&gt;Pré-requis: &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/10/31/Howto%3A-Utiliser-Zend_Controller_RewriteRouter-avec-Zend_Config&quot;&gt;Zend_Controller_RewriteRouter&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Nous allons voir aujourd'hui comment générer automagiquement des &lt;acronym&gt;URL&lt;/acronym&gt;s à partir des routes définies dans le &lt;em&gt;RewriteRouter&lt;/em&gt;, ainsi que les avantages que cela présente. Le &lt;code&gt;Helper&lt;/code&gt; que nous allons utiliser nécessite le stockage du routeur dans le registre:&lt;/p&gt;

&lt;pre&gt;
Zend::register('router', $router);
&lt;/pre&gt;


&lt;p&gt;Avant de voir le &lt;code&gt;Helper&lt;/code&gt; lui même, un petit &lt;em&gt;Use Case&lt;/em&gt;. Admettons que vous développiez une application de gestion de petites annonces, vous aurez à un moment ou un autre à créer un lien quelconque pour, par exemple, créer une annonce, et en voir les détails. Disons que vous ayez des routes route du genre (je zappe les &lt;code&gt;defaults&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;
announceCreate.route = /announce/create
announceDetails.route = /announce/:id/details
&lt;/pre&gt;


&lt;p&gt;L'objectif est de pouvoir créer les liens grâce au code suivant (à partir de la view):&lt;/p&gt;

&lt;pre&gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $this-&amp;gt;href('announceCreate'); ?&amp;gt;&amp;quot;&amp;gt;Créer une annonce&amp;lt;/a&amp;gt;
&amp;lt;a href=&amp;quot;&amp;lt;?php echo $this-&amp;gt;href('announceDetails', array('id' =&amp;gt; $announce-&amp;gt;id)); ?&amp;gt;&amp;quot;&amp;gt;Voir l'annonce&amp;lt;/a&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Et comme le &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt; est bien fait, c'est très simple à réaliser sous forme de &lt;code&gt;ViewHelper&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
class Zend_View_Helper_Href {
	
	/**
	 * Returns the href to a given route
	 *
	 * @param string $routeName
	 * @param array $args
	 * @return string
	 */
	
	public function href($routeName, $args = array()) {
		try {
			return Zend::registry('router')-&amp;gt;getRoute($routeName)-&amp;gt;assemble($args);
		} catch (Zend_Controller_Router_Exception $e) {
			return '#404';
		}
	}
}
&lt;/pre&gt;


&lt;p&gt;Tellement simple que pour combler un peu je vous offre le &lt;em&gt;docblock&lt;/em&gt; qui va avec ;-)&lt;/p&gt;


&lt;p&gt;Là où ça devient &lt;strong&gt;très&lt;/strong&gt; pratique, c'est quand on souhaite localiser les &lt;acronym&gt;URL&lt;/acronym&gt;s. Par exemple, imaginons que vous souhaitiez &lt;em&gt;françiser&lt;/em&gt; les &lt;acronym&gt;URL&lt;/acronym&gt;s pour, par exemple, améliorer votre référencement. Vous n'avez qu'a définir un jeu de routes &lt;em&gt;fr_FR&lt;/em&gt;, par exemple ainsi:&lt;/p&gt;

&lt;code class=&quot;routes_fr_FR&quot;&gt;announceCreate.route = /annonce/creer&lt;br /&gt;
announceDetails.route = /annonce/:id/details&lt;br /&gt;
&lt;br /&gt;
[routes_en_UK]&lt;br /&gt;
announceCreate.route = /announce/create&lt;br /&gt;
announceDetails.route = /announce/:id/details&lt;br /&gt;
&lt;br /&gt;
[routes:route_fr_FR]&lt;br /&gt;
announceCreate.defaults.controller = announce&lt;br /&gt;
announceCreate.defaults.action = create&lt;br /&gt;
&lt;br /&gt;
announceDetails.defaults.controller = announce&lt;br /&gt;
announceDetails.defaults.action = details&lt;/code&gt;


&lt;p&gt;L'utilisation de l'héritage géré par &lt;code&gt;Zend_Config&lt;/code&gt; nous permet ici d'éviter la redondance des &lt;code&gt;defaults&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Elle est pas belle la vie ?&lt;/p&gt;


&lt;p&gt;Note: cette fonctionnalitée est prévue pour être &lt;em&gt;builtin&lt;/em&gt; plus tard.&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/24/ViewHelper-de-generation-durls#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/24/ViewHelper-de-generation-durls#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/725</wfw:commentRss>
      </item>
    
  <item>
    <title>Discussion sur l'optimisation en PHP chez NiKo</title>
    <link>http://fashion.hosmoz.net/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo</link>
    <guid isPermaLink="false">urn:md5:967d08dda8033faf171a3edb213844a8</guid>
    <pubDate>Thu, 23 Nov 2006 13:40:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bonnes pratiques</category><category>clichés</category><category>configuration</category><category>environnement</category><category>optimisation</category><category>organisation</category><category>way of life</category>    
    <description>    &lt;p&gt;&lt;a href=&quot;http://www.prendreuncafe.com/blog/post/2006/11/22/12-astuces-optimisation-performances-php&quot;&gt;Une petite discussion sur l'optimisation en PHP&lt;/a&gt; à lieu en ce moment chez NiKo ! Ce n'est pas souvent que je &lt;em&gt;link&lt;/em&gt; directement comme ça, donc dites vous que quand je le fais, c'est que ça en vaut la peine ;-)&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/23/Discussion-sur-loptimisation-en-PHP-chez-NiKo#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/724</wfw:commentRss>
      </item>
    
  <item>
    <title>Zend Framework: Un plugin simple pour le Front Controller</title>
    <link>http://fashion.hosmoz.net/post/2006/11/19/Zend-Framework%3A-Un-plugin-simple-pour-le-Front-Controller</link>
    <guid isPermaLink="false">urn:md5:6c829cc8dbd18739b84ef7758d852a70</guid>
    <pubDate>Sun, 19 Nov 2006 21:30:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bootstrap</category><category>howto</category><category>MVC</category><category>organisation</category><category>php</category><category>plugin</category><category>vues</category><category>zend framework</category>    
    <description>&lt;p&gt;L'implémentation du &lt;code&gt;Front Controller&lt;/code&gt; du &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt; inclue un système bien pratique de plugins, qui va nous permettre de réaliser plus simplement et proprement &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/08/30/Automatisation-des-vues&quot;&gt;l'automatisation des vues&lt;/a&gt;, initialement embarquée dans une extension de &lt;code&gt;Zend_Controller_Action&lt;/code&gt; (ce qui pose quelques problèmes, nottament au lors de l'utilisation de &lt;code&gt;__forward()&lt;/code&gt; et &lt;code&gt;_redirect()&lt;/code&gt;).&lt;/p&gt;    &lt;p&gt;Techniquement, un plugin est une classe qui implémente l'interface des plugins (&lt;code&gt;Zend_Controller_Plugin_Interface&lt;/code&gt;). Dans la pratique, une classe abstraite est fournie pour simplifier la tache (&lt;code&gt;Zend_Controller_Plugin_Abstract&lt;/code&gt;). Notre premier plugin s'appellera &lt;code&gt;AutoView&lt;/code&gt; (&lt;code&gt;My_Controller_Plugin_AutoView&lt;/code&gt;, stocké dans &lt;code&gt;My/Controller/Plugin/AutoView.php&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;Un plugin est donc une classe dont les méthodes seront appelées a différents moments de la &lt;em&gt;dispatch loop&lt;/em&gt; du controlleur frontal, comme on peut le voir dans &lt;code&gt;Zend_Controller_Front::dispatch()&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;routeStartup()&lt;/code&gt;, à la mise en route du routeur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;routeShutdown($action)&lt;/code&gt;, à l'arrêt du routeur&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dispatchLoopStartup($action)&lt;/code&gt;, avant la &lt;em&gt;dispatch loop&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;preDispatch($action)&lt;/code&gt;, avant d'executer une action&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postDispatch($action)&lt;/code&gt;, après avoir executé une action&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dispatchLoopShutdown()&lt;/code&gt;, pour finir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A chaud, on pourrait se dire que &lt;code&gt;postDispatch&lt;/code&gt; est exactement ce dont on n'a besoin, et on se tromperait. Ce qu'il faut savoir, c'est que l'argument &lt;code&gt;$action&lt;/code&gt; passé à &lt;code&gt;postDispatch&lt;/code&gt; contient l'action qui suit celle qui vient d'être executé. Dans la majorité des cas, n'ayant qu'une seule action à executer, &lt;code&gt;$action&lt;/code&gt; sera vide, et on se retrouve l'air un peu con.&lt;/p&gt;


&lt;p&gt;Bon donc, on va user d'un stratagème: notre plugin va stocker les actions qui passent dans &lt;code&gt;preDispatch&lt;/code&gt;, pour s'occuper de la dernière à être passée dans &lt;code&gt;dispatchLoopShutdown&lt;/code&gt;. Dernier détail, notre plugin s'occupera lui même de gérer son instance de &lt;code&gt;Zend_View&lt;/code&gt;. Et sans plus attendre, le code, qui n'a finalement rien de compliqué:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php

require_once 'Zend/Controller/Plugin/Abstract.php';

class My_Controller_Plugin_AutoView extends Zend_Controller_Plugin_Abstract {

	private $_lastAction;

	public function __construct() {
		$view = new Zend_View;
		$view-&amp;gt;setScriptPath(APP_ROOT.'/views/');
		Zend::register('view', $view);
	}

	public function preDispatch($action) {
		$this-&amp;gt;_lastAction = clone($action);
		return $action;
	}

	public function dispatchLoopShutdown() {
		if (!is_null($this-&amp;gt;_lastAction)) {
			$viewPath = sprintf('%s/%s.php', $this-&amp;gt;_lastAction-&amp;gt;getControllerName(), $this-&amp;gt;_lastAction-&amp;gt;getActionName());
			echo Zend::registry('view')-&amp;gt;render($viewPath);
		}
	}
}

?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Bien, notre plugin vaillament codé, il nous faut désormais expliquer au controlleur frontal qu'on aimerai bien qu'il en tienne compte. Cela se passe fort logiquement dans le &lt;em&gt;bootstrap&lt;/em&gt;, via la méthode &lt;code&gt;registerPlugin&lt;/code&gt; du sus-cité controlleur frontal, qui prend en argument une instance d'un objet implémentant &lt;code&gt;Zend_Controller_Plugin_Interface&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
$controller = Zend_Controller_Front::getInstance();
$controller-&amp;gt;registerPlugin(new My_Controller_Plugin_AutoView);
&lt;/pre&gt;


&lt;p&gt;And viola !&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/19/Zend-Framework%3A-Un-plugin-simple-pour-le-Front-Controller#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/19/Zend-Framework%3A-Un-plugin-simple-pour-le-Front-Controller#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/720</wfw:commentRss>
      </item>
    
  <item>
    <title>A propos du blog Zend et du planet</title>
    <link>http://fashion.hosmoz.net/post/2006/11/06/A-propos-du-blog-Zend-et-du-planet</link>
    <guid isPermaLink="false">urn:md5:97a9916ada2eafddb146b5be3ba7f98c</guid>
    <pubDate>Mon, 06 Nov 2006 14:28:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Ego</category>
        <category>organisation</category><category>php</category><category>phpmafia</category><category>way of life</category><category>zend framework</category>    
    <description>    &lt;p&gt;J'ai fermé le blog Zend que j'avais ouvert, tout simplement parcequ'il me semble de plus en plus clair que le genre de personne susceptible d'écrire sur ce genre de blog possède déjà un blog, et qu'il serait bien présomptueux de penser qu'ils preferreraient écrire sur &lt;em&gt;mon&lt;/em&gt; blog plutôt que sur le leur. J'ai donc installé un &lt;a href=&quot;http://www.moonmoon.org/&quot;&gt;moonmoon&lt;/a&gt; à la place, dont le but ultime est d'aggréger les blogs francophones (ou leurs tags / catégorie) traitant de près ou de loin de &lt;acronym&gt;PHP&lt;/acronym&gt;, à la manière du &lt;a href=&quot;http://www.planet-php.net/&quot;&gt;Planet PHP&lt;/a&gt; originel, donc. La planet en question est donc disponible sur &lt;a href=&quot;http://phpmafia.net/&quot; title=&quot;http://phpmafia.net/&quot;&gt;http://phpmafia.net/&lt;/a&gt;, et vous y trouverez d'ores et déjà les blogs qui figurent en bonne place dans mon lecteur &lt;acronym&gt;RSS&lt;/acronym&gt;.&lt;/p&gt;


&lt;p&gt;Pour faire partie du planet, il suffit de m'envoyer &lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/06/mailto:%70%6c%61%6e%65%74%40%70%68%70%6d%61%66%69%61%2e%6e%65%74&quot;&gt;un mail&lt;/a&gt; avec l'adresse de votre blog (ou de sa partie traitant de &lt;acronym&gt;PHP&lt;/acronym&gt;), ainsi que votre nom / pseudonyme, et c'est tout :-)&lt;/p&gt;


&lt;p&gt;Pour en revenir au blog Zend Framework, vous trouverez désormais mes billets sur ce blog, sous le tag &lt;a href=&quot;http://fashion.hosmoz.net/blog/tag/zend%20framework&quot;&gt;Zend Framework&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/06/A-propos-du-blog-Zend-et-du-planet#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/06/A-propos-du-blog-Zend-et-du-planet#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/715</wfw:commentRss>
      </item>
    
  <item>
    <title>Incubated</title>
    <link>http://fashion.hosmoz.net/post/2006/11/01/Incubated</link>
    <guid isPermaLink="false">urn:md5:7a9cdfbfea0dc5e4f1cc96795fdb0db3</guid>
    <pubDate>Wed, 01 Nov 2006 16:10:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Geekeries</category>
        <category>bonnes pratiques</category><category>doc</category><category>google</category><category>librairie</category><category>microformats</category><category>optimisation</category><category>organisation</category><category>php</category><category>sso</category><category>svn</category><category>sécurité</category><category>ubuntu</category><category>unit testing</category><category>unix</category><category>way of life</category>    
    <description>&lt;p&gt;Les liens interressants (ou pas) de la semaine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://microformats.org/&quot; title=&quot;http://microformats.org/&quot;&gt;http://microformats.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.georss.org/&quot; title=&quot;http://www.georss.org/&quot;&gt;http://www.georss.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.thinkvitamin.com/features/ajax/create-a-searchable-google-map&quot; title=&quot;http://www.thinkvitamin.com/features/ajax/create-a-searchable-google-map&quot;&gt;http://www.thinkvitamin.com/feature...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot; title=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot;&gt;https://features.launchpad.net/dist...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://iwantmyopenid.org/bounty&quot; title=&quot;http://iwantmyopenid.org/bounty&quot;&gt;http://iwantmyopenid.org/bounty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devzone.zend.com/node/view/id/1113&quot; title=&quot;http://devzone.zend.com/node/view/id/1113&quot;&gt;http://devzone.zend.com/node/view/i...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot; title=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot;&gt;http://weierophinney.net/matthew/up...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;J'ai pas mal entendu parler des microformats ces derniers temps, sans vraiment prendre le temps de me pencher dessus. &lt;a href=&quot;http://www.microformats.org/&quot;&gt;microformats.org&lt;/a&gt; présente l'occasion de se plonger dedans et de comprendre que finalement, les microformats peuvent être un facteur de développement non négligeable pour un site ou une application web. &lt;a href=&quot;http://www.georss.org/&quot;&gt;GeoRSS&lt;/a&gt; de son côté propose une implémentation &lt;em&gt;simple&lt;/em&gt; et &lt;em&gt;puissante&lt;/em&gt; (c'est eux qui le disent) du &lt;a href=&quot;http://en.wikipedia.org/wiki/Geotagging&quot;&gt;Geotagging&lt;/a&gt;. A voir si on ne peut pas coupler tout ça avec quelques pirouettes sur &lt;a href=&quot;http://fashion.hosmoz.net/post/2006/11/01/&quot;&gt;Google Maps&lt;/a&gt;...&lt;/p&gt;


&lt;p&gt;Pendant ce temps, chez Canonical, on établit déjà les &lt;a href=&quot;https://features.launchpad.net/distros/ubuntu/+specs&quot;&gt;specifications fonctionnelles de Feisty Fawn&lt;/a&gt;, et c'est assez prometteur :-)&lt;/p&gt;


&lt;p&gt;Enfin, dans le petit monde du &lt;acronym&gt;PHP&lt;/acronym&gt; et du webdev en général, il n'est jamais trop tard pour souligner l'existence de protocoles d'authentification centralisée libres comme &lt;a href=&quot;http://openid.net/&quot;&gt;OpenID&lt;/a&gt;, qui de plus à lancé un &lt;em&gt;concours&lt;/em&gt; d'implémentation sous forme de &lt;a href=&quot;http://iwantmyopenid.org/bounty&quot;&gt;bounties&lt;/a&gt; ! On notera également les débuts de &lt;a href=&quot;http://devzone.zend.com/node/view/id/1113&quot;&gt;l'extension d' input filtering pour PHP&lt;/a&gt;, qui promet de simplifier grandement la validation de données externes dans les applis &lt;acronym&gt;PHP&lt;/acronym&gt;. Enfin, &lt;a href=&quot;http://weierophinney.net/matthew/uploads/php_development_best_practices.pdf&quot;&gt;les slides de la conférences PHP Best Practices&lt;/a&gt; qui a eu lieu à la ZendCon, c'est vraiment rempli de bons conseils.&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/11/01/Incubated#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/11/01/Incubated#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/711</wfw:commentRss>
      </item>
    
  <item>
    <title>Bonnes pratiques PHP</title>
    <link>http://fashion.hosmoz.net/post/2006/10/29/Bonnes-pratiques-PHP</link>
    <guid isPermaLink="false">urn:md5:1abac6f3dcb348da1fd774b47ad6e842</guid>
    <pubDate>Sun, 29 Oct 2006 16:22:00 +0100</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bonnes pratiques</category><category>clichés</category><category>opinions</category><category>optimisation</category><category>organisation</category><category>php</category><category>way of life</category>    
    <description>    &lt;p&gt;Vite fait, un petit jeu pour vous, amis PHPiens.&lt;/p&gt;


&lt;p&gt;Dans le snippet de code qui suit se cachent 6 bonnes pratiques (7 selon le degré de subjectivité que l'on inclue dans une &lt;em&gt;bonne pratique&lt;/em&gt;), saurez vous les retrouver ?&lt;/p&gt;


&lt;pre&gt;&amp;lt;?php

$code_is_ugly = true;
if (9069 === $code_author) {
	$code_is_ugly = false;
}

?&amp;gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/10/29/Bonnes-pratiques-PHP#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/10/29/Bonnes-pratiques-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/705</wfw:commentRss>
      </item>
    
  <item>
    <title>Bootstrap CLI</title>
    <link>http://fashion.hosmoz.net/post/2006/10/13/Bootstrap-CLI</link>
    <guid isPermaLink="false">urn:md5:1e9ff0bf3342af30f0bcc1b219d7f60a</guid>
    <pubDate>Fri, 13 Oct 2006 18:31:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>arborescence</category><category>bootstrap</category><category>CLI</category><category>howto</category><category>librairie</category><category>organisation</category><category>surclassage</category><category>zend framework</category>    
    <description>&lt;p&gt;Nous avons parcouru dernièrement la création du bootstrap &lt;acronym&gt;HTTP&lt;/acronym&gt; qui sert de socle à une application utilisant le Zend Framework. Le même principe peut s'appliquer aux scripts &lt;acronym&gt;CLI&lt;/acronym&gt;, mais comme les besoins sont fondamentalements différents, l'implémentation sera elle aussi complètement différente. Nous viserons les objectifs suivants:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ne pas être obligé d'executer le bootstrap en ligne de commande&lt;/li&gt;
&lt;li&gt;Simplifier au maximum l'écriture ultérieure des scripts &lt;acronym&gt;CLI&lt;/acronym&gt;&lt;/li&gt;
&lt;li&gt;Définir un jeu d'options de ligne de commande obligatoire&lt;/li&gt;
&lt;li&gt;Mettre en place un environnement d'execution&lt;/li&gt;
&lt;/ol&gt;    &lt;p&gt;La tentation serait de créer un système qui obligerait ce genre de commandes:&lt;/p&gt;


&lt;pre&gt;$ php batch/bootstrap.php monscript&lt;/pre&gt;


&lt;p&gt;Pour executer, par exemple, le script &lt;code&gt;batch/monscript.php&lt;/code&gt;. Cela simplifierait grandement les choses, mais c'est moche, et puis on peut faire autrement, donc on ne va pas se priver ! Nous utiliserons a cette fin la fonction magique &lt;code&gt;register_shutdown_function&lt;/code&gt;, qui s'occupera d'appeler une fonction qui executera les scripts &lt;em&gt;ad hoc&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Avant d'aller plus loin, l'arborescence de fichiers que nous allons utiliser:&lt;/p&gt;


&lt;pre&gt;batch/
	monscript.php
	runtime.php
library/
	Zend.php
	My/
		Batch.php&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;runtime.php&lt;/code&gt; sera le fichier à inclure dans chaque script, tandis que &lt;code&gt;My/Batch.php&lt;/code&gt; contiendra la classe d'abstraction &lt;code&gt;My_Batch&lt;/code&gt;, qui définira les comportements par défaut de nos scripts.&lt;/p&gt;


&lt;p&gt;Voici donc la première partie de notre bootstrap, &lt;code&gt;batch/runtime.php&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;ini_set('include_path', get_include_path().PATH_SEPARATOR.realpath(dirname(__FILE__).'/../library/'));

require_once 'Zend.php';
require_once 'My/Batch.php';

register_shutdown_function(array('My_Batch', 'runAll'));&lt;/pre&gt;


&lt;p&gt;Bien sur, cette méthode nous oblige à définir un format à respecter pour les fonctions à executer par la suite, nous partirons donc sur les bases suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chaque batch doit être constitué d'une classe dont le nom commence par &lt;code&gt;My_Batch_&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Chaque batch doit posséder une méthode executable &lt;code&gt;run&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui nous donne donc:&lt;/p&gt;


&lt;pre&gt;abstract class My_Batch {
	static public function runAll() {
		$classes = get_declared_classes();
		foreach($classes as $className) {
			if (preg_match('/^My_Batch_(.+)$/', $className, $matches) &amp;amp;&amp;amp; method_exists($className, 'run')) {
				try {
					$batch = new $className;
					$batch-&amp;gt;run();
				} catch (Exception $e) {
					die(sprintf(&amp;quot;%s: %s\n&amp;quot;, $matches[1], $e-&amp;gt;getMessage()));
				}
			}
		}
	}
	
	abstract public function run();
}&lt;/pre&gt;


&lt;p&gt;On en profite pour catcher toute Exception indésirable pour la transformer en un &lt;code&gt;die&lt;/code&gt;, bien plus lisible dans un terminal qu'une backtrace :-)&lt;/p&gt;


&lt;p&gt;Maintenant que nous avons résolu les points 1 et 2, attaquons nous à la suite. Le problème principal que j'ai rencontré lors de l'établissement d'un environnement d'execution, c'est que la gestion de la configuration repose en grande partie sur la valeur de &lt;code&gt;$_SERVER['HTTP_HOST']&lt;/code&gt;, qui n'est bien évidemment pas disponible en &lt;acronym&gt;CLI&lt;/acronym&gt; :-) Il me faut donc forcer le passage en argument du nom de la configuration à utiliser. C'est très simple à faire, grace a la méthode que nous avons employé: il suffit de vérifier la présence de cet argument dans le constructeur de &lt;code&gt;My_Batch&lt;/code&gt; :-)&lt;/p&gt;


&lt;pre&gt;public function __construct() {
	foreach($GLOBALS['argv'] as $i =&amp;gt; $arg) {
		switch ($arg) {
			case '--configname':
			case '-c':
				$this-&amp;gt;_args['configname'] = $GLOBALS['argv'][$i+1];
			break;
		}
	}
	if (!isset($this-&amp;gt;_args['configname'])) {
		throw new Exception('-c or --configname is mandatory');
	}
}&lt;/pre&gt;


&lt;p&gt;Voilà, le gros du travail est fait. Pour le reste, c'est la routine, mise en place d'un environnement avec &lt;code&gt;Zend_Config&lt;/code&gt; et &lt;code&gt;Zend_Db&lt;/code&gt;, a la suite dans le constructeur:&lt;/p&gt;


&lt;pre&gt;	$this-&amp;gt;_config = new Zend_Config(
		Zend_Config_Ini::load(
			dirname(__FILE__).'/../../app/config.ini',
			$this-&amp;gt;_args['configname']
		)
	);
	
	$this-&amp;gt;_db = Zend_Db::factory(
		$this-&amp;gt;_config-&amp;gt;db-&amp;gt;adapter,
		$this-&amp;gt;_config-&amp;gt;db-&amp;gt;config-&amp;gt;asArray()
	);
	
	Zend_Db_Table::setDefaultAdapter($this-&amp;gt;_db);&lt;/pre&gt;


&lt;p&gt;Enfin, voila un exemple de script utilisant ce bootstrap:&lt;/p&gt;


&lt;pre&gt;require_once 'path/to/runtime.php';

class My_Batch_MonScript extends My_Batch {
	public function run() {
		// le code ici
	}
}&lt;/pre&gt;


&lt;p&gt;And voila !&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/10/13/Bootstrap-CLI#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/10/13/Bootstrap-CLI#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/666</wfw:commentRss>
      </item>
    
  <item>
    <title>L'environnement d'execution</title>
    <link>http://fashion.hosmoz.net/post/2006/09/28/Lenvironnement-dexecution</link>
    <guid isPermaLink="false">urn:md5:e76eb4e24c2dc5797a4c4b451158f001</guid>
    <pubDate>Thu, 12 Oct 2006 21:51:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>bootstrap</category><category>environnement</category><category>howto</category><category>organisation</category><category>zend framework</category>    
    <description>&lt;p&gt;Voilà un article que j'avais déjà proposé sur un site a caractère privé, un peu remis au gout du jour et étoffé de quelques informations et ressources non négligeables. Nous verrons ici comment mettre en place un environement d'execution standard du Zend Framework, également appelé &lt;em&gt;bootstrap&lt;/em&gt; de l'autre coté de l'atlantique.&lt;/p&gt;    &lt;p&gt;Un petit dessin valant mieux qu'un long discours, entrons dans le vif du sujet. On assume ici un environnement préinstallé: Apache / PHP5 / MySQL, avec une copie du Zend Framework dans &lt;code&gt;/usr/share/zend/&lt;/code&gt;, ainsi que le &lt;code&gt;.htaccess&lt;/code&gt; suivant à la racine de votre site (il semblerait que cette dépendance à &lt;code&gt;mod_rewrite&lt;/code&gt; soit sur la liste des choses à éliminer avant la release):&lt;/p&gt;


&lt;pre&gt;RewriteEnfine On
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php&lt;/pre&gt;


&lt;p&gt;On peut également utiliser les règles suivantes, qui comportent l'avantage d'une plus grande simplicité pour intégrer des éléments d'application externe:&lt;/p&gt;


&lt;pre&gt;RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php&lt;/pre&gt;


&lt;h2&gt;L'environnement&lt;/h2&gt;


&lt;p&gt;Les plus perspicaces d'entre vous l'auront surement déjà deviné, le fichier &lt;code&gt;www/index.php&lt;/code&gt; servira de &lt;em&gt;bootstrap&lt;/em&gt;, c'est à dire de point d'entrée unique pour toute l'application. Le Zend Framework se chargera lui même de décortiquer l'&lt;acronym&gt;URL&lt;/acronym&gt; pour tenter de deviner ce à quoi l'utilisateur pouvait bien penser quand il a cliqué !&lt;/p&gt;


&lt;p&gt;Pour ce qui est de l'arborescence de fichiers conseillée, &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/09/16/Debuter-un-projet%3A-un-brin-dorganisation&quot;&gt;un peu d'organisation est recommandée&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour utiliser le Zend Framework en toute quiétude, il nous faut nous assurer qu'il pourra accéder à ses propres composants. La première chose à faire est donc de modifier l'&lt;code&gt;include_path&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;set_include_path(get_include_path().PATH_SEPARATOR.realpath(dirname(__FILE__).'/../library/'));&lt;/pre&gt;


&lt;p&gt;Il n'est pas inutile également de prendre quelques précautions d'usage:&lt;/p&gt;


&lt;pre&gt;ini_set('error_reporting', E_ALL); # | E_STRICT);

if (get_magic_quotes_gpc()) {
	die('&amp;lt;strong&amp;gt;E_NOOB_ERROR&amp;lt;/strong&amp;gt;: magic_quotes_gpc must be turned off.');
}

set_magic_quotes_runtime(false);&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;Last but not least&lt;/em&gt;, on charge la librairie &lt;code&gt;Zend&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;require_once 'Zend.php';&lt;/pre&gt;


&lt;p&gt;Ainsi préparés, nous pouvons nous plonger en toute quiétude dans la mise en place de quelques objets qui nous serons bien utiles tout au long du développement de notre application.&lt;/p&gt;


&lt;h2&gt;Les objets&lt;/h2&gt;


&lt;p&gt;La mise en place des objets est on ne peut plus claire. On configure le front controller (&lt;code&gt;Zend_Controller_Front&lt;/code&gt;) pour lui dire où trouver les &lt;em&gt;controllers&lt;/em&gt;, puis on configure les vues (&lt;code&gt;Zend_View&lt;/code&gt;) pour leur dire où trouver... les vues :-) On enregistre ensuite l'objet &lt;code&gt;$view&lt;/code&gt; dans le registre, qui n'est rien de plus qu'un endroit pratique où stocker des objets/données pour y avoir accès plus tard (&lt;code&gt;Zend::register($name, $value)&lt;/code&gt; et &lt;code&gt;$var = Zend::registry($name);&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;Une petite liste (non exhaustive) d'objets interressants à stocker dans le registre:&lt;/p&gt;


&lt;h3&gt;Zend_Db&lt;/h3&gt;


&lt;pre&gt;Zend::loadClass('Zend_Db');
Zend::loadClass('Zend_Db_Table');

$params = array(
	'host' =&amp;gt; 'localhost',
	'username' =&amp;gt; 'someobscureusername',
	'password' =&amp;gt; 'someobscurepassword',
	'dbname' =&amp;gt; 'yourdbname'
);

$db = Zend_Db::factory('PDO_MYSQL',$params);
Zend_Db_Table::setDefaultAdapter($db);

Zend::register('db', $db);&lt;/pre&gt;


&lt;h3&gt;Zend_Config&lt;/h3&gt;


&lt;p&gt;Je vous renvois à mon article sur la &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/09/04/Gestion-de-la-configuration&quot;&gt;gestion de la configuration&lt;/a&gt; :-)&lt;/p&gt;


&lt;h3&gt;Zend_View&lt;/h3&gt;


&lt;pre&gt;Zend::loadClass('Zend_View');

$view = new Zend_View;
$view-&amp;gt;setScriptPath(realpath(dirname(__FILE__).'/../app/views/'));

Zend::register('view', $view);&lt;/pre&gt;


&lt;h2&gt;Le Dispatch&lt;/h2&gt;


&lt;p&gt;Dernière étape, le dispatch, qui utilise les objets &lt;code&gt;Zend_Controller_Router&lt;/code&gt; et &lt;code&gt;Zend_Controller_Dispatcher&lt;/code&gt;. Ces deux objets sont au coeur du processus de sélection du controller à executer. Le Router va déterminer, à partir de l'environnement (en général l'URL, via $_SERVER['REQUEST_URI'] par exemple) quelle action executer et dans quel controller, tandis que le Dispatcher va s'occuper lui de les trouver (par exemple dire FooController::bar(), dans controllers/FooController.php).&lt;/p&gt;


&lt;p&gt;Le Zend Framework gère en natif les friendly urls, et ça c'est chouette. Par exemple: les urls suivantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;http://example.com/foo/bar&lt;/li&gt;
&lt;li&gt;http://example.com/foo&lt;/li&gt;
&lt;li&gt;http://example.com/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Seront analysées comme suit par le Routeur par défaut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;controller: foo, action: bar&lt;/li&gt;
&lt;li&gt;controller: foo, action: index&lt;/li&gt;
&lt;li&gt;controller: index, action: index&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dernières choses à savoir sur la théorie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quand le controlleur est défini par l'url mais non trouvé par le &lt;code&gt;Dispatcher&lt;/code&gt;, celui ci execute &lt;code&gt;index/noRoute&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;les controllers sont des classes qui étendent &lt;code&gt;Zend_Controller_Action&lt;/code&gt; (ou une classe qui elle même l'étend)&lt;/li&gt;
&lt;li&gt;le Dispatcher par défaut va executer(en supposant une url type &lt;code&gt;http://example.org/foo/bar&lt;/code&gt;) &lt;code&gt;FooController::barAction&lt;/code&gt; dans &lt;code&gt;FooController.php&lt;/code&gt; (modulo le path déterminé avec &lt;code&gt;Zend_Controller_Front::setControllerPath&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Les vues&lt;/h2&gt;


&lt;p&gt;Dernier point de cette brève excursion dans le Zend Framework, les vues. Pas grand chose à en dire pour le moment, si ce n'est que par défaut l'objet Zend_View se contente d'include() les fichiers templates. Il parait que l'intégration avec des moteurs de template (Smarty par exemple) est très aisée, mais comme je ne suis pas fan de ce genre de choses, ce ne sera pas couvert ici :-)&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/09/28/Lenvironnement-dexecution#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/09/28/Lenvironnement-dexecution#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/626</wfw:commentRss>
      </item>
    
  <item>
    <title>Débuter un projet: un brin d'organisation</title>
    <link>http://fashion.hosmoz.net/post/2006/09/16/Debuter-un-projet%3A-un-brin-dorganisation</link>
    <guid isPermaLink="false">urn:md5:4c703a9b711a28437b1023825ce09008</guid>
    <pubDate>Sat, 16 Sep 2006 13:05:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>arborescence</category><category>controlleurs</category><category>organisation</category><category>vues</category><category>zend framework</category>    
    <description>    &lt;h2&gt;Architecture des dossiers&lt;/h2&gt;


&lt;p&gt;Commençons par le commencement: le stockage des fichiers. Pour ne pas trébucher sur la longue route que représente l'accomplissement d'un projet, il convient de bien s'organiser dès le début, et savoir précisément où stocker et trouver les choses est une bonne chose. Nous allons donc nous baser sur les recommandations de Zend à ce sujet:&lt;/p&gt;


&lt;pre&gt;monprojet/
     app/
          controllers/
          models/
          views/
     library/
     www/&lt;/pre&gt;


&lt;p&gt;A partir de là, on peut faire évoluer un peu. J'ai personellement rajouté un répertoire &lt;code&gt;dist/&lt;/code&gt;, qui contient les scripts nécessaire à la distribution de mon application (dump des bases &lt;acronym&gt;SQL&lt;/acronym&gt; par exemple), et &lt;a href=&quot;http://www.akrabat.com/2006/09/15/directory-structures-again/&quot;&gt;cet article de Rob&lt;/a&gt; parle de répertoires comme &lt;code&gt;scripts/&lt;/code&gt; (pour contenir les scripts cron par exemple) et &lt;code&gt;tmp/&lt;/code&gt; (à toutes fins utiles).&lt;/p&gt;


&lt;p&gt;Enfin, notons l'utilité d'un répertoire &lt;code&gt;library/ext/&lt;/code&gt; ou assimilé, &lt;a href=&quot;http://fashion.hosmoz.net/blog/post/2006/09/06/Integrer-une-librairie-tierce&quot;&gt;comme  expliqué ici&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Définir ses controlleurs et ses vues&lt;/h2&gt;


&lt;p&gt;Première question a se poser: qu'est-ce qu'un controlleur ? Un controlleur, c'est tout simplement une entité qui va s'occuper de traiter une requête que reçoit l'application. Dans le Zend Framework, les controlleurs possèdent des Actions (sous formes de méthodes), qui permettent d'avoir des &lt;acronym&gt;URL&lt;/acronym&gt; telles que:&lt;/p&gt;


&lt;pre&gt;http://example.com/foo/bar/&lt;/pre&gt;


&lt;p&gt;Dans un tel cas de figure, Zend Framework ira chercher la méthode &lt;code&gt;barAction&lt;/code&gt; du controlleur &lt;code&gt;fooController&lt;/code&gt;. On voit dès l'ors l'interet de bien définir nos besoins en termes de controlleurs dès maintenant, puisque c'est cela qui définira toute l'architecture de l'application. La marche à suivre est la suivante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lister toutes les fonctionnalitées de l'application&lt;/li&gt;
&lt;li&gt;Les regrouper logiquement&lt;/li&gt;
&lt;li&gt;Traduire tout ça en termes de controlleurs et d'action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prenons l'exemple typique d'un portail d'actualité. Voici quelques unes des actions que nous serons susceptibles de proposer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajouter une news&lt;/li&gt;
&lt;li&gt;Lister des news (action par défaut)&lt;/li&gt;
&lt;li&gt;Voir les détails d'une news&lt;/li&gt;
&lt;li&gt;Ajouter un commentaire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui se traduit par:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;controlleur News
&lt;ul&gt;
&lt;li&gt;action Ajouter (url: &lt;code&gt;news/ajouter/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;action Lister (url: &lt;code&gt;news/lister/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;action Voir (url: &lt;code&gt;news/voir/id/$id&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;controlleur Commentaires
&lt;ul&gt;
&lt;li&gt;action Ajouter (url: &lt;code&gt;commentaires/ajouter/news/$id&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela nous permet donc de prévoir l'arborescence suivante:&lt;/p&gt;


&lt;pre&gt;app/
        controllers/
                CommentairesController.php
                IndexController.php
                NewsController.php
        views/
                Commentaires/
                        ajouter.php
                Index/
                        index.php
                News/
                        ajouter.php
                        lister.php
                        voir.php&lt;/pre&gt;



&lt;p&gt;Voilà pour la théorie, pour la pratique, il faut mettre en place un environnement d'execution dans lequel on pourra déployer toutes la puissance du Zend Framework, c'est ce que nous verrons la prochaine fois :-)&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/09/16/Debuter-un-projet%3A-un-brin-dorganisation#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/09/16/Debuter-un-projet%3A-un-brin-dorganisation#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/598</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégrer une librairie tierce</title>
    <link>http://fashion.hosmoz.net/post/2006/09/06/Integrer-une-librairie-tierce</link>
    <guid isPermaLink="false">urn:md5:b7c80f8c23ebbc4e829967932241ecde</guid>
    <pubDate>Wed, 06 Sep 2006 23:21:00 +0200</pubDate>
    <dc:creator>Geoffrey</dc:creator>
        <category>Coding</category>
        <category>librairie</category><category>organisation</category><category>phpmailer</category><category>tiers</category><category>zend framework</category>    
    <description>&lt;p&gt;Il arrive forcément un moment dans un projet où le besoin de fonctionnalités avancées dans un domaine particulier (mail, réseau, etc) se fait sentir. En général, l'utilisation d'une librairie tierce s'avère nécessaire et pose quelques légers et irritants problèmes, particulièrement au niveau de la convention de nommage des classes et de l'arborescence des répertoires qui devient rapidement bordélique. Nos objectifs seront donc:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utiliser une librairie tierce&lt;/li&gt;
&lt;li&gt;Respecter la convention de nommage Zend&lt;/li&gt;
&lt;li&gt;Avoir un arborescence propre&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ça tombe bien, c'est très simple à réaliser :-)&lt;/p&gt;    &lt;p&gt;Pour ce faire, il convient de prendre nos objectifs à rebours, commençons donc par l'arborescence. Nous allons classer nos librairies par site, ce qui est une méthode assez courante. Admettons que vous ayez une arborescence de base (plus de précisions sur l'arboresence basique dans un prochain article):&lt;/p&gt;


&lt;pre&gt;app/
library/
	Zend/
	Zend.php
www/&lt;/pre&gt;


&lt;p&gt;Nous allons stocker nos librairies dans &lt;code&gt;library/ext/&lt;/code&gt;, comme &lt;strong&gt;ext&lt;/strong&gt;erne, et en fonction du domaine où on peut les trouver. Prenons le cas de l'excellent &lt;code&gt;PHPMailer&lt;/code&gt;, qui est hébergé sur http://phpmailer.sourceforge.net/. Nous stockerons cette librairie dans &lt;code&gt;library/ext/net/sourceforge/phpmailer/&lt;/code&gt;, ce qui résoud la problèmatique de l'arborescence.&lt;/p&gt;


&lt;p&gt;Pour attaquer la 2ème problèmatique (convention de nommage), nous allons créer un nouveau répertoire dans &lt;code&gt;library&lt;/code&gt; qui contiendra nos extensions au framework. Ce répertoire nous sera très utile par la suite. Nous l'appellerons ici &lt;code&gt;Extensions&lt;/code&gt;, mais cela peut-être n'importe quel nom qui peut vous sembler approprié, &lt;code&gt;Monappli&lt;/code&gt; par exemple. Une fois ce répertoire créé, nous pouvons passer aux choses sérieuses, et créer notre classe &lt;code&gt;Extensions_Mailer&lt;/code&gt; dans &lt;code&gt;library/Extensions/Mailer.php&lt;/code&gt;:&lt;/p&gt;


&lt;pre&gt;require_once dirname(__FILE__).'/../ext/net/sourceforge/phpmailer/class.phpmailer.php';

class Extensions_Mailer extends PHPMailer {

}&lt;/pre&gt;


&lt;p&gt;Et voilà, tous nos problèmes sont résolus. Notre classe est désormais reconnue par &lt;code&gt;Zend::loadClass&lt;/code&gt;, ce qui finalement était bien le but de l'opération:&lt;/p&gt;


&lt;pre&gt;Zend::loadClass('Extensions_Mailer');
$mailer = new Extensions_Mailer;&lt;/pre&gt;


&lt;p&gt;L'objet &lt;code&gt;$mailer&lt;/code&gt; est donc une instance de &lt;code&gt;Extensions_Mailer&lt;/code&gt;, qui n'est finalement que la classe &lt;code&gt;PHPMailer&lt;/code&gt; renommée ! Cela permet également au passage de surclasser &lt;code&gt;PHPMailer&lt;/code&gt; pour y ajouter nos propres fonctions.&lt;/p&gt;</description>
    
    
    
          <comments>http://fashion.hosmoz.net/post/2006/09/06/Integrer-une-librairie-tierce#comment-form</comments>
      <wfw:comment>http://fashion.hosmoz.net/post/2006/09/06/Integrer-une-librairie-tierce#comment-form</wfw:comment>
      <wfw:commentRss>http://fashion.hosmoz.net/feed/rss2/comments/593</wfw:commentRss>
      </item>
    
</channel>
</rss>