<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
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/"
><channel><title>William&#039;s Blog &#187; Diem</title> <atom:link href="http://www.willdurand.fr/tag/diem/feed/" rel="self" type="application/rss+xml" /><link>http://www.willdurand.fr</link> <description>Développeur web indépendant, étudiant et passionné ! #Symfony2 #Rails #Diem #Git #Nginx #WebPerfs #SoftwareQuality</description> <lastBuildDate>Thu, 20 Oct 2011 14:59:05 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>Déploiement automatisé avec Capistrano et Git pour symfony et Diem</title><link>http://www.willdurand.fr/deploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=deploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem</link> <comments>http://www.willdurand.fr/deploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem/#comments</comments> <pubDate>Wed, 11 Aug 2010 09:09:24 +0000</pubDate> <dc:creator>Will</dc:creator> <category><![CDATA[Diem Project]]></category> <category><![CDATA[symfony]]></category> <category><![CDATA[Sysadmin]]></category> <category><![CDATA[Capistrano]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[Diem]]></category> <category><![CDATA[Git]]></category> <category><![CDATA[Murder]]></category> <category><![CDATA[Symfony]]></category><guid
isPermaLink="false">http://www.willdurand.fr/?p=550</guid> <description><![CDATA[Hier, j&#8217;introduisais mes directives de travail. Aujourd&#8217;hui je vais introduire un sujet souvent sensible : la mise en production. C&#8217;est une tâche qui peut être critique mais si l&#8217;on prend toutes les précautions, nous limitons les risques. On notera bien que le facteur chance est laissé à la porte pour ce genre de manipulation&#8230; La [...]]]></description> <content:encoded><![CDATA[<p
style="text-align: justify;"><em>Hier, j&#8217;introduisais mes directives de travail. Aujourd&#8217;hui je vais introduire un sujet souvent sensible : la mise en production. C&#8217;est une tâche qui peut être critique mais si l&#8217;on prend toutes les précautions, nous limitons les risques. On notera bien que le facteur chance est laissé à la porte pour ce genre de manipulation&#8230;</em></p><p
style="text-align: justify;"></p><p
style="text-align: justify;"></p><p
style="text-align: justify;">La <strong>mise en production</strong> c&#8217;est passer un projet sur le serveur du client pour le rendre accessible aux utilisateurs finaux. Facile ? Non, très souvent les architectures sont différentes et il convient d&#8217;utiliser plusieurs environnements. Pour ma part, je dispose de 3 environnements : <em>dev </em>(sur ma machine), <em>test </em>(sur serveur distant) et <em>préprod </em>(sur serveur distant également). Ces environnements me permettent de tester mes projets sur plusieurs OS, plusieurs types de machine et sur deux SGBDR (bases de données) : j&#8217;ai pris l&#8217;habitude d&#8217;effectuer mes tests sous <strong><a
href="http://www.sqlite.org/">SQLite</a></strong>, j&#8217;ai ainsi  deux sons de cloche (en plus de <strong><a
href="http://www.mysql.com/">MySQL</a></strong>) me permettant de corriger des étourderies lors de la configuration de la base.</p><p
style="text-align: justify;">Ok, tout ce speech pourquoi ? Pour pouvoir comprendre mon intérêt à <strong>automatiser le process de mise en prod&#8217;</strong>. En effet, mes trois environnements me garantissent une certaine <strong>stabilité </strong>de mon application, je n&#8217;ai donc pas à jongler avec les serveurs de chacun de mes clients (pas toujours&#8230;). Je peux donc déployer (mettre en prod&#8217;) mon application presque les yeux fermés. Et ça, ça n&#8217;a pas de prix !</p><p
style="text-align: justify;">Mais je ne joue pas le lanceur de couteaux sans avoir de lames bien aiguisées. J&#8217;utilise des outils éprouvés comme <a
href="http://www.capify.org/index.php/Capistrano"><strong>Capistrano</strong></a> et <a
href="http://git-scm.com/"><strong>Git</strong></a>.</p><p
style="text-align: justify;"></p><p
style="text-align: justify;"><strong>Capistrano </strong>est l&#8217;outil par excellence pour déployer des applis <strong>Rails</strong>. Le problème c&#8217;est que je ne m&#8217;y suis pas encore mis&#8230; Mais qu&#8217;importe, il déploiera mes applications <strong>symfony </strong>et <strong>Diem</strong>. La souplesse de configuration via <span
style="text-decoration: underline;">redéfinition</span> des méthodes permet de déployer à peu près ce que l&#8217;on souhaite. De plus, l&#8217;interconnexion avec <strong>Git </strong>se fait sans problème.</p><p
style="text-align: justify;">Maintenant, courte description :</p><ul><li>Capistrano va <span
style="text-decoration: underline;">cloner votre projet</span> (Git inside) ;</li><li>Capistrano peut compresser votre projet (tar) et l&#8217;envoyer à vos X serveurs  ;</li><li>ou Capistrano va demander à X serveurs de récupérer la dernière version de votre projet ;</li><li>Capistrano va lier (symboliquement) la dernière version en tant que version courante ;</li><li>Capistrano va <span
style="text-decoration: underline;">migrer les bases de données</span> (la migration ici, ce n&#8217;est pas l&#8217;histoire avec les oiseaux&#8230; C&#8217;est plutôt la mise à jour structurelle de vos bases) ;</li><li>Capistrano va <span
style="text-decoration: underline;">déployer votre appli très rapidement</span> sur autant de serveurs que vous le souhaiter ;</li><li>Capistrano <span
style="text-decoration: underline;">exécute des commandes</span> avant ou après le déploiement, pratique pour un<em> sf cc </em>;</li><li>Enfin, <span
style="text-decoration: underline;">Capistrano ne fait pas le café</span> (il ne faut pas abuser quand même&#8230;)</li></ul><p
style="text-align: justify;"></p><p
style="text-align: justify;">Intéressant non ? Une fois <strong>Capistrano </strong>installé (<a
href="http://www.capify.org/index.php/Getting_Started">explications ici</a>), on va pouvoir commencer à travailler.</p><p
style="text-align: justify;">Ce que je fais généralement, je crée un répertoire <em>project_name</em> et je tape la commande :</p><p
style="text-align: justify;"><div
class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">capify .</div></div></p><p
style="text-align: justify;"></p><p
style="text-align: justify;">Ceci me crée un fichier <em>Capfile</em>, un répertoire <em>config/</em> avec un fichier <em>deploy.rb</em>. C&#8217;est ce dernier qui nous intéresse. Le mieux est de partir d&#8217;un fichier vide. Pour pouvoir utiliser <strong>Git</strong>, il faut écrire ceci :</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">set <span
style="color:#ff3333; font-weight:bold;">:scm</span>, <span
style="color:#996600;">&quot;git&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:repository</span>, &nbsp;<span
style="color:#996600;">&quot;~/#{application}.git&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:branch</span>, <span
style="color:#996600;">&quot;master&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:checkout</span>, <span
style="color:#996600;">&quot;export&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:deploy_via</span>, <span
style="color:#ff3333; font-weight:bold;">:remote_cache</span></div></div><p
style="text-align: justify;">J&#8217;indique le chemin de mon dépôt, ici local et la branche (par défaut master). Les paramètres <em>:checkout </em>et <em>:deploy_via </em>ainsi défini permettent de faire un clone complet du projet. Ensuite, quelques paramètres nécessaires :</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span
style="color:#008000; font-style:italic;"># Port</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:port</span>, <span
style="color:#006666;">9999</span><br
/> <span
style="color:#008000; font-style:italic;"># App ?</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:application</span>, <span
style="color:#996600;">&quot;project_name&quot;</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Where ?</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:deploy_to</span>, <span
style="color:#996600;">&quot;/var/www/#{application}&quot;</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Which server ?</span><br
/> role <span
style="color:#ff3333; font-weight:bold;">:app</span>, <span
style="color:#996600;">&quot;localhost&quot;</span><br
/> role <span
style="color:#ff3333; font-weight:bold;">:web</span>, <span
style="color:#996600;">&quot;localhost&quot;</span><br
/> role <span
style="color:#ff3333; font-weight:bold;">:db</span>, <span
style="color:#996600;">&quot;localhost&quot;</span>, <span
style="color:#ff3333; font-weight:bold;">:primary</span> <span
style="color:#006600; font-weight:bold;">=&gt;</span> <span
style="color:#0000FF; font-weight:bold;">true</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Who ?</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:user</span>, <span
style="color:#996600;">&quot;myUs3r&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:password</span>, <span
style="color:#996600;">&quot;p4ssw0rd&quot;</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># More config</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:keep_releases</span>, <span
style="color:#006666;">3</span><br
/> ssh_options<span
style="color:#006600; font-weight:bold;">&#91;</span><span
style="color:#ff3333; font-weight:bold;">:forward_agent</span><span
style="color:#006600; font-weight:bold;">&#93;</span> = <span
style="color:#0000FF; font-weight:bold;">true</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Path to php executable</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:php</span>, <span
style="color:#996600;">&quot;/usr/bin/php&quot;</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Symfony application name (used for migrations)</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:sf_app</span>, <span
style="color:#996600;">&quot;front&quot;</span><br
/> <span
style="color:#008000; font-style:italic;"># Symfony web directory (www, web, public_html, ...)</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:sf_webdir</span>, <span
style="color:#996600;">&quot;www&quot;</span></div></div><p
style="text-align: justify;"></p><p
style="text-align: justify;">Maintenant, une petite chose à savoir. <strong><span
style="text-decoration: underline;">Capistrano </span></strong><span
style="text-decoration: underline;">versionne les déploiements</span> et ça, c&#8217;est bon ! Mon déploiement plante, <span
style="text-decoration: underline;">rollback </span><span
style="text-decoration: underline;">automatique</span> vers la version précédente. Je m&#8217;aperçois que j&#8217;ai fait une grosse faute d&#8217;orthographe, je lance un rollback et l&#8217;appli passe en version précédente. Pour cela, <strong>Capistrano </strong>construit sa propre structure dans le répertoire défini par <em>:deploy_to</em> :</p><p
style="text-align: justify;"><div
class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span
style="color: #000000; font-weight: bold;">/</span>var<span
style="color: #000000; font-weight: bold;">/</span>www<span
style="color: #000000; font-weight: bold;">/</span>project_name<br
/> &nbsp; <span
style="color: #000000; font-weight: bold;">`</span>_ current <span
style="color: #7a0874; font-weight: bold;">&#40;</span>symlink<span
style="color: #7a0874; font-weight: bold;">&#41;</span><br
/> &nbsp; &nbsp;<span
style="color: #000000; font-weight: bold;">|</span>_ releases<br
/> &nbsp; &nbsp;<span
style="color: #000000; font-weight: bold;">|</span>_ shared</div></div></p><p
style="text-align: justify;"><em>current </em>est le lien symbolique qui pointe toujours vers la version active de l&#8217;application. Le répertoire <em>releases/ </em>possède X répertoires correspondant aux différents déploiements passés. Vous l&#8217;aurez compris, le lien symbolique <em>current </em>pointe vers l&#8217;un de ces répertoires. Le répertoire <em>shared/</em> quant à lui contient des fichiers partagés par toutes les releases. Exemple : le fichier <em>databases.yml</em> de <strong>symfony </strong>qui définit les identifiants de connexion à la base de données ou encore le répertoire <em>uploads/</em> qui contient des données utilisateurs.</p><p
style="text-align: justify;"></p><p
style="text-align: justify;">On peut désormais <span
style="text-decoration: underline;">personnaliser les actions de déploiement</span>. Pour cela, on va redéfinir les actions de <em>:deploy</em>, qui contient les tâches de déploiement appelées lors de tout déploiement.</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">namespace <span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#ff3333; font-weight:bold;">:deploy</span><span
style="color:#006600; font-weight:bold;">&#41;</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;</span> <span
style="color:#006600; font-weight:bold;">&lt;-</span>DESC<br
/> &nbsp; &nbsp; <span
style="color:#006600; font-weight:bold;">&#91;</span>internal<span
style="color:#006600; font-weight:bold;">&#93;</span> Overriding original task to fit to symfony project needs<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:finalize_update</span>, <span
style="color:#ff3333; font-weight:bold;">:except</span> <span
style="color:#006600; font-weight:bold;">=&gt;</span> <span
style="color:#006600; font-weight:bold;">&#123;</span> <span
style="color:#ff3333; font-weight:bold;">:no_release</span> <span
style="color:#006600; font-weight:bold;">=&gt;</span> <span
style="color:#0000FF; font-weight:bold;">true</span> <span
style="color:#006600; font-weight:bold;">&#125;</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># Fix permissions</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{latest_release} &amp;&amp; find * -type f -exec chmod 644 {} <span
style="color:#000099;">\\</span>;&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{latest_release} &amp;&amp; find * -type d -exec chmod 705 {} <span
style="color:#000099;">\\</span>;&quot;</span><br
/> &nbsp; <br
/> &nbsp; &nbsp; run <span
style="color:#006600; font-weight:bold;">&lt;</span> <span
style="color:#006600; font-weight:bold;">&lt;-</span>CMD<br
/> &nbsp; &nbsp; &nbsp; rm <span
style="color:#006600; font-weight:bold;">-</span>rf <span
style="color:#008000; font-style:italic;">#{latest_release}/log &amp;&amp;</span><br
/> &nbsp; &nbsp; &nbsp; ln <span
style="color:#006600; font-weight:bold;">-</span>s <span
style="color:#008000; font-style:italic;">#{shared_path}/log #{latest_release}/log</span><br
/> &nbsp; &nbsp; CMD<br
/> <br
/> &nbsp; &nbsp; run <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>CMD<br
/> &nbsp; &nbsp; &nbsp; rm <span
style="color:#006600; font-weight:bold;">-</span>rf <span
style="color:#008000; font-style:italic;">#{latest_release}/cache &amp;&amp;</span><br
/> &nbsp; &nbsp; &nbsp; ln <span
style="color:#006600; font-weight:bold;">-</span>s <span
style="color:#008000; font-style:italic;">#{shared_path}/cache #{latest_release}/cache</span><br
/> &nbsp; &nbsp; CMD<br
/> <br
/> &nbsp; &nbsp; stamp = <span
style="color:#CC00FF; font-weight:bold;">Time</span>.<span
style="color:#9900CC;">now</span>.<span
style="color:#9900CC;">utc</span>.<span
style="color:#9900CC;">strftime</span><span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#996600;">&quot;%Y%m%d%H%M.%S&quot;</span><span
style="color:#006600; font-weight:bold;">&#41;</span><br
/> &nbsp; &nbsp; asset_paths = <span
style="color:#006600; font-weight:bold;">%</span>w<span
style="color:#006600; font-weight:bold;">&#40;</span>images css js<span
style="color:#006600; font-weight:bold;">&#41;</span>.<span
style="color:#9900CC;">map</span> <span
style="color:#006600; font-weight:bold;">&#123;</span> <span
style="color:#006600; font-weight:bold;">|</span>p<span
style="color:#006600; font-weight:bold;">|</span> <span
style="color:#996600;">&quot;#{latest_release}/#{sf_webdir}/#{p}&quot;</span> <span
style="color:#006600; font-weight:bold;">&#125;</span>.<span
style="color:#9900CC;">join</span><span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#996600;">&quot; &quot;</span><span
style="color:#006600; font-weight:bold;">&#41;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;find #{asset_paths} -exec touch -t #{stamp} {} ';'; true&quot;</span>, <span
style="color:#ff3333; font-weight:bold;">:env</span> <span
style="color:#006600; font-weight:bold;">=&gt;</span> <span
style="color:#006600; font-weight:bold;">&#123;</span> <span
style="color:#996600;">&quot;TZ&quot;</span> <span
style="color:#006600; font-weight:bold;">=&gt;</span> <span
style="color:#996600;">&quot;UTC&quot;</span> <span
style="color:#006600; font-weight:bold;">&#125;</span><br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;</span> <span
style="color:#006600; font-weight:bold;">&lt;-</span>DESC<br
/> &nbsp; &nbsp; Overriding original task to exclude restart<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:default</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; update<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Overriding original task to use symfony migrations<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:migrations</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; update<br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;">#sf.migrate</span><br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span> &nbsp;<br
/> &nbsp; <br
/> &nbsp; after <span
style="color:#996600;">&quot;deploy:update&quot;</span>, <span
style="color:#996600;">'deploy:customize'</span><br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Custom tasks<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:customize</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; sf.<span
style="color:#9900CC;">symlinks</span><br
/> &nbsp; &nbsp; sf.<span
style="color:#9900CC;">remove_dev_environments</span><br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># clear cache</span><br
/> &nbsp; &nbsp; sf.<span
style="color:#9900CC;">cc</span><br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># Diem</span><br
/> &nbsp; &nbsp; dm.<span
style="color:#9900CC;">cc</span><br
/> &nbsp; &nbsp; dm.<span
style="color:#9900CC;">setup</span><br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> &nbsp;<br
/> <span
style="color:#9966CC; font-weight:bold;">end</span></div></div><p>&lt;</p><p>p style=&nbsp;&raquo;text-align: justify;&nbsp;&raquo;></p><p
style="text-align: justify;">Après déploiement, on va créer fixer les droits, les répertoires de logs et de cache. Ensuite on met à jour la base de données (Doctrine migration). Pour finir on exécute une série de tâches &laquo;&nbsp;<em>custom</em>&nbsp;&raquo; qui permettent de supprimer les contrôleurs de développement (frontend_dev, backend_dev, &#8230;), de recréer les liens symboliques pour les fichiers partagés, de vider le cache <strong>symfony </strong>ou <strong>Diem</strong>, &#8230;</p><p
style="text-align: justify;">Voyons la suite de commandes pour <strong>symfony </strong>:</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">namespace <span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#ff3333; font-weight:bold;">:sf</span><span
style="color:#006600; font-weight:bold;">&#41;</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;</span> <span
style="color:#006600; font-weight:bold;">&lt;-</span>DESC<br
/> &nbsp; &nbsp; Run the <span
style="color:#996600;">&quot;doctrine migration&quot;</span> task<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:migrate</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; #{php} symfony doctrine:generate-migrations-diff &amp;&amp; #{php} symfony doctrine:migrate&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Run the <span
style="color:#996600;">&quot;symfony cc&quot;</span> task<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:cc</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; #{php} symfony cc&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; rm -rf cache/*&quot;</span><br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Create symlink to symfony specific targets<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:symlinks</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># symlink to database.yml</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/config/databases.yml&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;ln -s #{shared_path}/databases.yml #{current_path}/config/databases.yml&quot;</span><br
/> &nbsp; &nbsp;<br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># symlink to uploads</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/#{sf_webdir}/uploads&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;ln -s #{shared_path}/uploads #{current_path}/#{sf_webdir}/uploads&quot;</span><br
/> &nbsp; &nbsp; &nbsp;<br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># symlink to .htaccess</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/#{sf_webdir}/.htaccess&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;ln -s #{shared_path}/.htaccess #{current_path}/#{sf_webdir}/.htaccess&quot;</span><br
/> <br
/> &nbsp; &nbsp; <span
style="color:#008000; font-style:italic;"># symlink to app.yml</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/apps/#{sf_app}/config/app.yml&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;ln -s #{shared_path}/app.yml #{current_path}/apps/#{sf_app}/config/app.yml&quot;</span><br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span> <br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Remove DEV environments<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:remove_dev_environments</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/#{sf_webdir}/*dev.php&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span> <br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Disable symfony application<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:disable</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; #{php} symfony project:disable #{sf_app} prod&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span> <br
/> &nbsp; <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Enable symfony application<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:enable</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; #{php} symfony project:enable #{sf_app} prod&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span> &nbsp; <br
/> <span
style="color:#9966CC; font-weight:bold;">end</span></div></div><p>&lt;</p><p>p style=&nbsp;&raquo;text-align: justify;&nbsp;&raquo;>Et voilà la suite de commandes pour <strong>Diem </strong>:</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">namespace <span
style="color:#006600; font-weight:bold;">&#40;</span><span
style="color:#ff3333; font-weight:bold;">:dm</span><span
style="color:#006600; font-weight:bold;">&#41;</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;</span> <span
style="color:#006600; font-weight:bold;">&lt;-</span>DESC<br
/> &nbsp; &nbsp; Run the <span
style="color:#996600;">&quot;Diem setup&quot;</span> task<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:setup</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;cd #{current_path} &amp;&amp; #{php} symfony dm:setup&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> <br
/> &nbsp; desc <span
style="color:#006600; font-weight:bold;">&lt;&lt;-</span>DESC<br
/> &nbsp; &nbsp; Clear Diem cache <span
style="color:#9966CC; font-weight:bold;">and</span> fix permissions<br
/> &nbsp; DESC<br
/> &nbsp; task <span
style="color:#ff3333; font-weight:bold;">:cc</span> <span
style="color:#9966CC; font-weight:bold;">do</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;rm -rf #{current_path}/#{sf_webdir}/cache&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;mkdir #{current_path}/#{sf_webdir}/cache&quot;</span><br
/> &nbsp; &nbsp; run <span
style="color:#996600;">&quot;chmod 777 #{current_path}/#{sf_webdir}/cache&quot;</span> &nbsp; &nbsp;<br
/> &nbsp; <span
style="color:#9966CC; font-weight:bold;">end</span><br
/> &nbsp; <br
/> <span
style="color:#9966CC; font-weight:bold;">end</span></div></div><p>&lt;</p><p>p style=&nbsp;&raquo;text-align: justify;&nbsp;&raquo;>Et voilà ! Un simple <strong>cap deploy</strong> fait tout le reste. Vous pouvez ajouter autant de serveurs que vous le souhaiter et lancer également toutes les commandes qui vous font plaisir.</p><p
style="text-align: justify;">Si vous avez des problèmes d&#8217;hébergement, exemple chez OVH qui ne laisse pas d&#8217;accès externe sur leurs serveurs Plan (&#8230;), vous pouvez utiliser la configuration suivante qui va archiver votre projet et l&#8217;envoyer en SFTP :</p><div
class="codecolorer-container ruby vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">set <span
style="color:#ff3333; font-weight:bold;">:deploy_via</span>, <span
style="color:#ff3333; font-weight:bold;">:copy</span><br
/> <br
/> <span
style="color:#008000; font-style:italic;"># Use copy to bypass firewall...</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:copy_strategy</span>, <span
style="color:#ff3333; font-weight:bold;">:export</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:copy_cache</span>, <span
style="color:#996600;">&quot;/tmp/#{application}&quot;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:copy_exclude</span>, <span
style="color:#006600; font-weight:bold;">&#91;</span><span
style="color:#996600;">&quot;.git/*&quot;</span><span
style="color:#006600; font-weight:bold;">&#93;</span><br
/> set <span
style="color:#ff3333; font-weight:bold;">:copy_compression</span>, <span
style="color:#ff3333; font-weight:bold;">:gzip</span></div></div><p
style="text-align: justify;"></p><p
style="text-align: justify;">Cette configuration est largement inspirée de ces articles :</p><ul
style="text-align: justify;"><li
style="text-align: justify;"><a
href="http://refineweb.co.uk/2010/01/18/preparing-a-symfony-project-ready-for-deployment-into-production-using-capistrano/">http://refineweb.co.uk/2010/01/18/preparing-a-symfony-project-ready-for-deployment-into-production-using-capistrano/</a></li><li><a
href="http://blog.servergrove.com/2010/07/12/symfony-git-capistrano-capifony/">http://blog.servergrove.com/2010/07/12/symfony-git-capistrano-capifony/</a></li><li><a
href="http://blog.codingspree.net/2008/5/12/deploying-symfony-project-with-capistrano/">http://blog.codingspree.net/2008/5/12/deploying-symfony-project-with-capistrano/</a></li></ul><p
style="text-align: justify;"></p><p
style="text-align: justify;">Pour terminer, hier je vous parlais d&#8217;<strong>Hudson</strong>, un serveur d&#8217;intégration continue. En liant les deux, j&#8217;obtiens une <span
style="text-decoration: underline;">automatisation complète</span> de mon &laquo;&nbsp;<em>after code</em>&laquo;&nbsp;. C&#8217;est-à-dire que j&#8217;écris mon code comme un barbu (et mes tests). Lorsque j&#8217;ai bien commité et que je push mes modifs, <strong>Hudson </strong>voit ces mises à jour, il va relancer les tests. Si tout passe la build estampillée &laquo;&nbsp;<em>success</em>&nbsp;&raquo; va être déployée automatiquement par <strong>Capistrano</strong>.</p><p
style="text-align: justify;">Et moi dans l&#8217;histoire ? Je n&#8217;ai rien à faire. Au pire, je suis alerté par mail si un test ne passe pas et si la build ne peut être déployée, <strong>Capistrano </strong>fera un rollback automatiquement sur sa dernière version stable. Manquerait plus qu&#8217;une cafetière USB et une tâche Hudson pour lancer le café et là&#8230; utopie !</p><p
style="text-align: justify;"></p><p
style="text-align: justify;">A noter qu&#8217;un projet nommé <strong>Capifony </strong>a vu le jour depuis quelques temps. C&#8217;est un <strong>Capistrano </strong>réécrit pour gérer nativement les projets <strong>symfony</strong>, je n&#8217;ai pas testé mais cela me semble une excellente option : <a
href="http://github.com/everzet/capifony">http://github.com/everzet/capifony</a>. Pour <strong>Diem</strong>, j&#8217;ai vu passé quelque chose dans le Google Groups, à suivre donc.</p><p
style="text-align: justify;">Vous pouvez, si vous le voulez, utiliser <a
href="http://github.com/lg/murder"><strong>Murder</strong></a>, un projet développé par Twitter pour déployer via <strong>Bittorent </strong>leurs applications sur tous leurs serveurs. C&#8217;est pas une mauvaise idée si vous avez beaucoup de serveurs, leurs temps de déploiements sont assez phénoménales. En parlant de temps, mes temps de déploiements sont de l&#8217;ordre de 2 minutes&#8230;</p><p
style="text-align: justify;"></p><p
style="text-align: justify;">C&#8217;est tout, pour le moment <img
src='http://www.willdurand.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p><h3 class='related_post_title'>Related Posts</h3><ul
class='related_post'><li><a
href='http://www.willdurand.fr/integrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin/' title='Intégrer un gestionnaire de fichiers dans dmCkEditorPlugin'>Intégrer un gestionnaire de fichiers dans dmCkEditorPlugin</a></li><li><a
href='http://www.willdurand.fr/symfony-jenkins-co/' title=' Symfony, Jenkins &amp; co'> Symfony, Jenkins &#038; co</a></li><li><a
href='http://www.willdurand.fr/symfony-live-2011/' title='Symfony live 2011'>Symfony live 2011</a></li><li><a
href='http://www.willdurand.fr/symfony-rencontre-hudson-mantis-et-les-autres/' title='symfony rencontre Hudson, Mantis et les autres'>symfony rencontre Hudson, Mantis et les autres</a></li><li><a
href='http://www.willdurand.fr/creation-automatique-dun-projet-symfony-mysql-git-et-apache2/' title='Création automatique d&#8217;un projet symfony + MySQL + Git et Apache2'>Création automatique d&#8217;un projet symfony + MySQL + Git et Apache2</a></li></ul> <a
rel="nofollow" target="_blank"  href="http://www.printfriendly.com/print/new?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/printfriendly.png" class="sociable-img sociable-hovers" title="Print" alt="Print" /></a><a
rel="nofollow" target="_blank"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;bodytext=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/digg.png" class="sociable-img sociable-hovers" title="Digg" alt="Digg" /></a><a
rel="nofollow" target="_blank"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/stumbleupon.png" class="sociable-img sociable-hovers" title="StumbleUpon" alt="StumbleUpon" /></a><a
rel="nofollow" target="_blank"  href="http://delicious.com/post?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;notes=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/delicious.png" class="sociable-img sociable-hovers" title="del.icio.us" alt="del.icio.us" /></a><a
rel="nofollow" target="_blank"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;t=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/facebook.png" class="sociable-img sociable-hovers" title="Facebook" alt="Facebook" /></a><a
rel="nofollow" target="_blank"  href="http://twitter.com/home?status=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem%20-%20http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/twitter.png" class="sociable-img sociable-hovers" title="Twitter" alt="Twitter" /></a><a
rel="nofollow" target="_blank"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;annotation=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/googlebookmark.png" class="sociable-img sociable-hovers" title="Google Bookmarks" alt="Google Bookmarks" /></a><a
rel="nofollow" target="_blank"  href="http://www.friendfeed.com/share?title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;link=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/friendfeed.png" class="sociable-img sociable-hovers" title="FriendFeed" alt="FriendFeed" /></a><a
rel="nofollow" target="_blank"  href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;source=William%26%23039%3Bs+Blog+D%C3%A9veloppeur+web+ind%C3%A9pendant%2C+%C3%A9tudiant+et+passionn%C3%A9+%21+%23Symfony2+%23Rails+%23Diem+%23Git+%23Nginx+%23WebPerfs+%23SoftwareQuality&amp;summary=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/linkedin.png" class="sociable-img sociable-hovers" title="LinkedIn" alt="LinkedIn" /></a><a
rel="nofollow" target="_blank"  href="http://www.myspace.com/Modules/PostTo/Pages/?u=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;t=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/myspace.png" class="sociable-img sociable-hovers" title="MySpace" alt="MySpace" /></a><a
rel="nofollow" target="_blank"  href="http://www.netvibes.com/share?title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/netvibes.png" class="sociable-img sociable-hovers" title="Netvibes" alt="Netvibes" /></a><a
rel="nofollow" target="_blank"  href="http://www.printfriendly.com/print/new?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/pdf.png" class="sociable-img sociable-hovers" title="PDF" alt="PDF" /></a><a
rel="nofollow" target="_blank"  href="http://ping.fm/ref/?link=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;body=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/ping.png" class="sociable-img sociable-hovers" title="Ping.fm" alt="Ping.fm" /></a><a
rel="nofollow" target="_blank"  href="http://www.willdurand.fr/feed/" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/rss.png" class="sociable-img sociable-hovers" title="RSS" alt="RSS" /></a><a
rel="nofollow" target="_blank"  href="http://technorati.com/faves?add=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/technorati.png" class="sociable-img sociable-hovers" title="Technorati" alt="Technorati" /></a><a
rel="nofollow" target="_blank"  href="http://www.viadeo.com/shareit/share/?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&title=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&urllanguage=fr" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/viadeo.png" class="sociable-img sociable-hovers" title="viadeo FR" alt="viadeo FR" /></a><a
rel="nofollow" target="_blank"  href="http://www.wikio.com/vote?url=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/wikio.png" class="sociable-img sociable-hovers" title="Wikio" alt="Wikio" /></a><a
rel="nofollow" target="_blank"  href="http://buzz.yahoo.com/submit/?submitUrl=http%3A%2F%2Fwww.willdurand.fr%2Fdeploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem%2F&amp;submitHeadline=D%C3%A9ploiement%20automatis%C3%A9%20avec%20Capistrano%20et%20Git%20pour%20symfony%20et%20Diem&amp;submitSummary=Hier%2C%20j%27introduisais%20mes%20directives%20de%20travail.%20Aujourd%27hui%20je%20vais%20introduire%20un%20sujet%20souvent%20sensible%20%3A%20la%20mise%20en%20production.%20C%27est%20une%20t%C3%A2che%20qui%20peut%20%C3%AAtre%20critique%20mais%20si%20l%27on%20prend%20toutes%20les%20pr%C3%A9cautions%2C%20nous%20limitons%20les%20risques.%20On%20noter&amp;submitCategory=science&amp;submitAssetType=text" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/yahoobuzz.png" class="sociable-img sociable-hovers" title="Yahoo! Buzz" alt="Yahoo! Buzz" /></a><br
/><br
/>]]></content:encoded> <wfw:commentRss>http://www.willdurand.fr/deploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Intégrer un gestionnaire de fichiers dans dmCkEditorPlugin</title><link>http://www.willdurand.fr/integrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=integrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin</link> <comments>http://www.willdurand.fr/integrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin/#comments</comments> <pubDate>Tue, 06 Jul 2010 00:09:45 +0000</pubDate> <dc:creator>Will</dc:creator> <category><![CDATA[Diem Project]]></category> <category><![CDATA[Tips]]></category> <category><![CDATA[CkEditor]]></category> <category><![CDATA[Diem]]></category> <category><![CDATA[KFM]]></category> <category><![CDATA[Symfony]]></category><guid
isPermaLink="false">http://www.willdurand.fr/?p=465</guid> <description><![CDATA[Bonjour, je laisse ici une petite astuce pour intégrer KFM (http://kfm.verens.com/), un excellent gestionnaire de fichiers en AJAX, au plugin Diem nommé dmCkEditorPlugin. Ce plugin offre un nouveau widget contenant, comme son nom l&#8217;indique, l&#8217;éditeur WYSIWYG CkEditor. Pour installer KFM, on télécharge la dernière version que l&#8217;on place dans dmCkEditorPlugin/js/kfm. Ensuite on ouvre dmCkEditorPlugin/config/dm/config.yml et [...]]]></description> <content:encoded><![CDATA[<p
style="text-align: justify;">Bonjour,</p><p
style="text-align: justify;">je laisse ici une petite astuce pour intégrer KFM (<a
href="http://kfm.verens.com/">http://kfm.verens.com/</a>), un excellent gestionnaire de fichiers en AJAX, au plugin Diem nommé dmCkEditorPlugin. Ce plugin offre un nouveau widget contenant, comme son nom l&#8217;indique, l&#8217;éditeur WYSIWYG CkEditor.</p><p
style="text-align: justify;"></p><p
style="text-align: justify;">Pour installer KFM, on télécharge la dernière version que l&#8217;on place dans <em>dmCkEditorPlugin/js/kfm.</em></p><p
style="text-align: justify;">Ensuite on ouvre <em>dmCkEditorPlugin/config/dm/config.yml</em> et on ajoute cette ligne :</p><div
class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">default:<br
/> &nbsp; ckeditor:<br
/> &nbsp; &nbsp; config:<br
/> &nbsp; &nbsp; &nbsp; ...<br
/> &nbsp; &nbsp; &nbsp; filebrowserBrowseUrl: <span
style="color: #000000; font-weight: bold;">/</span>dmCkEditorPlugin<span
style="color: #000000; font-weight: bold;">/</span>js<span
style="color: #000000; font-weight: bold;">/</span>kfm<span
style="color: #000000; font-weight: bold;">/</span>index.php</div></div><p
style="text-align: justify;">&nbsp;</p><p
style="text-align: justify;">KFM utilise une base de données, il faut donc la configurer. Le choix que j&#8217;ai fait est de parser le fichier <em>databases.yml</em> afin de récupérer les paramètres de connexion directement. Il faut donc modifier le fichier de configuration de KFM (<em>dmCkEditorPlugin/js/kfm/configuration.php</em>). J&#8217;ai placé ce code tout en haut en remplaçant les variables en rapport avec la base de données :</p><div
class="codecolorer-container php vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:100%;"><div
class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span
style="color: #b1b100;">require_once</span><span
style="color: #009900;">&#40;</span><a
href="http://www.php.net/dirname"><span
style="color: #990000;">dirname</span></a><span
style="color: #009900;">&#40;</span><span
style="color: #009900; font-weight: bold;">__FILE__</span><span
style="color: #009900;">&#41;</span><span
style="color: #339933;">.</span><span
style="color: #0000ff;">'/../../../../lib/vendor/diem/symfony/lib/yaml/sfYaml.php'</span><span
style="color: #009900;">&#41;</span><span
style="color: #339933;">;</span><br
/> <br
/> <span
style="color: #000088;">$config</span> <span
style="color: #339933;">=</span> sfYaml<span
style="color: #339933;">::</span><span
style="color: #004000;">load</span><span
style="color: #009900;">&#40;</span><a
href="http://www.php.net/dirname"><span
style="color: #990000;">dirname</span></a><span
style="color: #009900;">&#40;</span><span
style="color: #009900; font-weight: bold;">__FILE__</span><span
style="color: #009900;">&#41;</span><span
style="color: #339933;">.</span><span
style="color: #0000ff;">'/../../../../config/databases.yml'</span><span
style="color: #009900;">&#41;</span><span
style="color: #339933;">;</span><br
/> <br
/> <span
style="color: #000088;">$dsn</span> &nbsp;<span
style="color: #339933;">=</span> <span
style="color: #000088;">$config</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'all'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'doctrine'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'param'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'dsn'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <a
href="http://www.php.net/preg_match"><span
style="color: #990000;">preg_match</span></a><span
style="color: #009900;">&#40;</span><span
style="color: #0000ff;">'#(?P\w+):host=(?P\w+);dbname=(?P\w+);#'</span><span
style="color: #339933;">,</span> <span
style="color: #000088;">$dsn</span><span
style="color: #339933;">,</span> <span
style="color: #000088;">$matches</span><span
style="color: #009900;">&#41;</span><span
style="color: #339933;">;</span><br
/> <br
/> <span
style="color: #666666; font-style: italic;">// what type of database to use</span><br
/> <span
style="color: #666666; font-style: italic;">// values allowed: mysql, pgsql, sqlite, sqlitepdo</span><br
/> <span
style="color: #000088;">$kfm_db_type</span> <span
style="color: #339933;">=</span> <span
style="color: #000088;">$matches</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'type'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #666666; font-style: italic;">// the following options should only be filled if you are not using sqlite/sqlitepdo as the database</span><br
/> <span
style="color: #000088;">$kfm_db_prefix</span> &nbsp; <span
style="color: #339933;">=</span> <span
style="color: #0000ff;">'kfm_'</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #000088;">$kfm_db_host</span> &nbsp; &nbsp; <span
style="color: #339933;">=</span> <span
style="color: #000088;">$matches</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'host'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #000088;">$kfm_db_name</span> &nbsp; &nbsp; <span
style="color: #339933;">=</span> <span
style="color: #000088;">$matches</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'dbname'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #000088;">$kfm_db_username</span> <span
style="color: #339933;">=</span> <span
style="color: #000088;">$config</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'all'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'doctrine'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'param'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'username'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #000088;">$kfm_db_password</span> <span
style="color: #339933;">=</span> <span
style="color: #000088;">$config</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'all'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'doctrine'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'param'</span><span
style="color: #009900;">&#93;</span><span
style="color: #009900;">&#91;</span><span
style="color: #0000ff;">'password'</span><span
style="color: #009900;">&#93;</span><span
style="color: #339933;">;</span><br
/> <span
style="color: #000088;">$kfm_db_port</span> &nbsp; &nbsp; <span
style="color: #339933;">=</span> <span
style="color: #0000ff;">''</span><span
style="color: #339933;">;</span></div></div><p
style="text-align: justify;">C&#8217;est une manière simple et efficace d&#8217;intégrer ce gestionnaire de fichiers. Ce n&#8217;est pas parfait mais fonctionnel <img
src='http://www.willdurand.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><h3 class='related_post_title'>Related Posts</h3><ul
class='related_post'><li><a
href='http://www.willdurand.fr/deploiement-automatise-avec-capistrano-et-git-pour-symfony-et-diem/' title='Déploiement automatisé avec Capistrano et Git pour symfony et Diem'>Déploiement automatisé avec Capistrano et Git pour symfony et Diem</a></li><li><a
href='http://www.willdurand.fr/symfony-jenkins-co/' title=' Symfony, Jenkins &amp; co'> Symfony, Jenkins &#038; co</a></li><li><a
href='http://www.willdurand.fr/symfony-live-2011/' title='Symfony live 2011'>Symfony live 2011</a></li><li><a
href='http://www.willdurand.fr/symfony-rencontre-hudson-mantis-et-les-autres/' title='symfony rencontre Hudson, Mantis et les autres'>symfony rencontre Hudson, Mantis et les autres</a></li><li><a
href='http://www.willdurand.fr/creation-automatique-dun-projet-symfony-mysql-git-et-apache2/' title='Création automatique d&#8217;un projet symfony + MySQL + Git et Apache2'>Création automatique d&#8217;un projet symfony + MySQL + Git et Apache2</a></li></ul> <a
rel="nofollow" target="_blank"  href="http://www.printfriendly.com/print/new?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/printfriendly.png" class="sociable-img sociable-hovers" title="Print" alt="Print" /></a><a
rel="nofollow" target="_blank"  href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;bodytext=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/digg.png" class="sociable-img sociable-hovers" title="Digg" alt="Digg" /></a><a
rel="nofollow" target="_blank"  href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/stumbleupon.png" class="sociable-img sociable-hovers" title="StumbleUpon" alt="StumbleUpon" /></a><a
rel="nofollow" target="_blank"  href="http://delicious.com/post?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;notes=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/delicious.png" class="sociable-img sociable-hovers" title="del.icio.us" alt="del.icio.us" /></a><a
rel="nofollow" target="_blank"  href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;t=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/facebook.png" class="sociable-img sociable-hovers" title="Facebook" alt="Facebook" /></a><a
rel="nofollow" target="_blank"  href="http://twitter.com/home?status=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin%20-%20http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/twitter.png" class="sociable-img sociable-hovers" title="Twitter" alt="Twitter" /></a><a
rel="nofollow" target="_blank"  href="http://www.google.com/bookmarks/mark?op=edit&amp;bkmk=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;annotation=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/googlebookmark.png" class="sociable-img sociable-hovers" title="Google Bookmarks" alt="Google Bookmarks" /></a><a
rel="nofollow" target="_blank"  href="http://www.friendfeed.com/share?title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;link=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/friendfeed.png" class="sociable-img sociable-hovers" title="FriendFeed" alt="FriendFeed" /></a><a
rel="nofollow" target="_blank"  href="http://www.linkedin.com/shareArticle?mini=true&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;source=William%26%23039%3Bs+Blog+D%C3%A9veloppeur+web+ind%C3%A9pendant%2C+%C3%A9tudiant+et+passionn%C3%A9+%21+%23Symfony2+%23Rails+%23Diem+%23Git+%23Nginx+%23WebPerfs+%23SoftwareQuality&amp;summary=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/linkedin.png" class="sociable-img sociable-hovers" title="LinkedIn" alt="LinkedIn" /></a><a
rel="nofollow" target="_blank"  href="http://www.myspace.com/Modules/PostTo/Pages/?u=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;t=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/myspace.png" class="sociable-img sociable-hovers" title="MySpace" alt="MySpace" /></a><a
rel="nofollow" target="_blank"  href="http://www.netvibes.com/share?title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/netvibes.png" class="sociable-img sociable-hovers" title="Netvibes" alt="Netvibes" /></a><a
rel="nofollow" target="_blank"  href="http://www.printfriendly.com/print/new?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/pdf.png" class="sociable-img sociable-hovers" title="PDF" alt="PDF" /></a><a
rel="nofollow" target="_blank"  href="http://ping.fm/ref/?link=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;body=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/ping.png" class="sociable-img sociable-hovers" title="Ping.fm" alt="Ping.fm" /></a><a
rel="nofollow" target="_blank"  href="http://www.willdurand.fr/feed/" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/rss.png" class="sociable-img sociable-hovers" title="RSS" alt="RSS" /></a><a
rel="nofollow" target="_blank"  href="http://technorati.com/faves?add=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/technorati.png" class="sociable-img sociable-hovers" title="Technorati" alt="Technorati" /></a><a
rel="nofollow" target="_blank"  href="http://www.viadeo.com/shareit/share/?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&title=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&urllanguage=fr" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/viadeo.png" class="sociable-img sociable-hovers" title="viadeo FR" alt="viadeo FR" /></a><a
rel="nofollow" target="_blank"  href="http://www.wikio.com/vote?url=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/wikio.png" class="sociable-img sociable-hovers" title="Wikio" alt="Wikio" /></a><a
rel="nofollow" target="_blank"  href="http://buzz.yahoo.com/submit/?submitUrl=http%3A%2F%2Fwww.willdurand.fr%2Fintegrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin%2F&amp;submitHeadline=Int%C3%A9grer%20un%20gestionnaire%20de%20fichiers%20dans%20dmCkEditorPlugin&amp;submitSummary=Bonjour%2C%0D%0Aje%20laisse%20ici%20une%20petite%20astuce%20pour%20int%C3%A9grer%20KFM%20%28http%3A%2F%2Fkfm.verens.com%2F%29%2C%20un%20excellent%20gestionnaire%20de%20fichiers%20en%20AJAX%2C%20au%20plugin%20Diem%20nomm%C3%A9%20dmCkEditorPlugin.%20Ce%20plugin%20offre%20un%20nouveau%20widget%20contenant%2C%20comme%20son%20nom%20l%27indique%2C%20l%27%C3%A9di&amp;submitCategory=science&amp;submitAssetType=text" ><img
src="http://www.willdurand.fr/wp-content/plugins/sociable-30/images/default/16/yahoobuzz.png" class="sociable-img sociable-hovers" title="Yahoo! Buzz" alt="Yahoo! Buzz" /></a><br
/><br
/>]]></content:encoded> <wfw:commentRss>http://www.willdurand.fr/integrer-un-gestionnaire-de-fichiers-dans-dmckeditorplugin/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)
Database Caching 2/18 queries in 0.009 seconds using memcached
Object Caching 1063/1090 objects using memcached

Served from: www.willdurand.fr @ 2012-02-06 08:28:07 -->
