<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://planete.drupalfr.org" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>planete drupalfr -</title>
 <link>http://planete.drupalfr.org/frontpage</link>
 <description>The basic front page view.</description>
 <language>en</language>
<item>
 <title>Nouveau livre sur Drupal... en français !</title>
 <link>http://planete.drupalfr.org/node/981</link>
 <description>&lt;p&gt;Bonjour à tous,&lt;br /&gt;
je me permets de publier une info :&lt;/p&gt;
&lt;p&gt;Un nouveau livre sur Drupal en Français devrait paraître le 11 octobre 2010.&lt;/p&gt;
&lt;p&gt;DRUPAL - Réalisez des développements professionnels avec PHP&lt;/p&gt;
&lt;p&gt;détails : ...&lt;/p&gt;
&lt;p&gt;Editions : ENI&lt;br /&gt;
Collection : Expert IT&lt;br /&gt;
Auteurs : David Olmeta - Rémi Benoit (AddVista).&lt;br /&gt;
En volume : 400 pages + la version numérique du livre papier offerte jusqu&#039;au 31/12/10.&lt;br /&gt;
Versions : D6 et D7 (d&#039;après les tags de la fiche)&lt;br /&gt;
Niveau : confirmé à expert.&lt;br /&gt;
Téléchargement de fichiers liés à l’ouvrage : oui&lt;br /&gt;
Etude de cas : oui&lt;br /&gt;
Prix : n.c&lt;br /&gt;
Date de parution : 11/10/10&lt;br /&gt;
Fiche de présentation principale du livre : &lt;a href=&quot;http://bit.ly/bX7C6T&quot; title=&quot;http://bit.ly/bX7C6T&quot; rel=&quot;nofollow&quot;&gt;http://bit.ly/bX7C6T&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;a+ ;-)&lt;/p&gt;
&lt;p&gt;@drupalgrenoble&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.drupal.org/france&quot; rel=&quot;nofollow&quot;&gt;France&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/821">book e-book livre</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/820">chrysonline</category>
 <pubDate>Thu, 02 Sep 2010 16:05:12 +0000</pubDate>
 <dc:creator>Drupal Groupe France</dc:creator>
 <guid isPermaLink="false">981 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Un aixois sur Paris - Drink &amp; Drupal sur Paris le vendredi 10 septembre</title>
 <link>http://planete.drupalfr.org/node/980</link>
 <description>&lt;p&gt;Start:&amp;nbsp;&lt;br /&gt;
                    2010-09-10 18:00 - 20:00 Europe/Paris        &lt;/p&gt;
&lt;p&gt;                    User group meeting        &lt;/p&gt;
&lt;p&gt;      Organizers:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;                    &lt;a href=&quot;http://groups.drupal.org/user/16444&quot; title=&quot;Voir le profil utilisateur.&quot; rel=&quot;nofollow&quot;&gt;Guillaume Bec&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;N&#039;étant plus parisien, j&#039;ai maintenant le droit de lancer des Drink &amp;amp; Drupal à l&#039;arrache lors de mon passage à la capitale.&lt;/p&gt;
&lt;p&gt;Et donc c&#039;est lancé, je serais sur Paris le vendredi 10 septembre pour boire un coup &lt;strong&gt;à partir de 18h &lt;/strong&gt; et ça sera au &lt;a href=&quot;http://maps.google.fr/maps?f=q&amp;amp;source=s_q&amp;amp;hl=fr&amp;amp;geocode=&amp;amp;q=Frog+%26+Rosbif+paris&amp;amp;sll=46.75984,1.738281&amp;amp;sspn=8.143905,19.577637&amp;amp;ie=UTF8&amp;amp;hq=Frog+%26+Rosbif&amp;amp;hnear=Paris,+Ile-de-France&amp;amp;ll=48.865279,2.350216&amp;amp;spn=0.015273,0.038238&amp;amp;z=15&amp;amp;iwloc=A&quot; rel=&quot;nofollow&quot;&gt;Frog &amp;amp; Rosbif&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour rappel un Drink &amp;amp; Drupal c&#039;est juste un coup à boire ! Pas de présentation, pas d&#039;internet, juste l&#039;occasion de se retrouver, de discuter avec un drupalien de passage autour d&#039;une petite mousse.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.drupal.org/france&quot; rel=&quot;nofollow&quot;&gt;France&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/724">Drink &amp;amp;amp; Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/349">Guillaume Bec</category>
 <pubDate>Thu, 02 Sep 2010 09:09:13 +0000</pubDate>
 <dc:creator>Drupal Groupe France</dc:creator>
 <guid isPermaLink="false">980 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Drupal Meetup Paris - 14 septembre</title>
 <link>http://planete.drupalfr.org/node/979</link>
 <description>&lt;p&gt;Start:&amp;nbsp;&lt;br /&gt;
                    2010-09-14 18:30 - 20:00 Europe/Paris        &lt;/p&gt;
&lt;p&gt;                    User group meeting        &lt;/p&gt;
&lt;p&gt;      Organizers:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;                    &lt;a href=&quot;http://groups.drupal.org/user/101&quot; title=&quot;Voir le profil utilisateur.&quot; rel=&quot;nofollow&quot;&gt;smokinggoat&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;                    &lt;a href=&quot;http://groups.drupal.org/user/37662&quot; title=&quot;Voir le profil utilisateur.&quot; rel=&quot;nofollow&quot;&gt;JulienD&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;Salut tout le monde!&lt;/p&gt;
&lt;p&gt;Prenez note de la date du premier rencontre Drupal de la rentrée! Quel que soit votre niveau ou votre utilisation de Drupal vous êtes les bienvenus.&lt;/p&gt;
&lt;p&gt;Comme d&#039;habitude, locale (à Paris) et contenu à définir, mais nous aurons comme d&#039;habitude une présentation et une série de Lightning Talks.&lt;/p&gt;
&lt;p&gt;N&#039;hésitez pas à vous inscrire et à participer à l&#039;événement ou de me proposer des preso / talks.&lt;/p&gt;
&lt;p&gt;DRUPAL MEETUP&lt;br /&gt;
mardi 18h30 - 20h00&lt;br /&gt;
14 septembre, 2010&lt;br /&gt;
(Locale a définir...)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.drupal.org/france&quot; rel=&quot;nofollow&quot;&gt;France&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/765">Drupal Meetup</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/192">smokinggoat</category>
 <pubDate>Wed, 01 Sep 2010 16:23:58 +0000</pubDate>
 <dc:creator>Drupal Groupe France</dc:creator>
 <guid isPermaLink="false">979 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>How To: Using Drupal Twitter Module</title>
 <link>http://planete.drupalfr.org/node/975</link>
 <description>&lt;p&gt;&lt;img src=&quot;http://biboo.net/sites/default/files/imagecache/bbfeeds-teaser/bbf-images/twitter-1.png&quot; alt=&quot;&quot; title=&quot;&quot; class=&quot;imagecache imagecache-bbfeeds-teaser imagecache-default imagecache-bbfeeds-teaser_default&quot; width=&quot;150&quot; height=&quot;82&quot; /&gt;        &lt;/p&gt;
&lt;p&gt;
      Une démonstration en vidéo du module &lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/twitter&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Twitter&lt;/a&gt;par Matt Petrowsky.&lt;br /&gt;
      Une autre démo de ce module est disponible ici : &lt;a class=&quot;&quot; href=&quot;http://biboo.net/twitter-module&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Twitter module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
        Voir la vidéo (19 min) :
      &lt;/p&gt;
&lt;p&gt;     &lt;a class=&quot;thickbox readmore&quot; href=&quot;http://biboo.net#TB_inline?height=660&amp;amp;width=970&amp;amp;inlineId=popup&quot; rel=&quot;nofollow&quot;&gt;&lt;br /&gt;
     	&lt;img src=&quot;http://biboo.net/sites/default/files/internal/gotdrupal.png&quot; alt=&quot;gotdrupal&quot; width=&quot;398&quot; height=&quot;296&quot; /&gt;&lt;br /&gt;
     &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
        Infos :
	&lt;/p&gt;
&lt;ul class=&quot;&quot;&gt;
&lt;li&gt;Le .mov (&lt;a class=&quot;&quot; href=&quot;http://www.apple.com/quicktime/&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Quicktime&lt;/a&gt;) : &lt;a class=&quot;&quot; href=&quot;http://media.gotdrupal.com/matt/modules/d6/TwitterModule_d6.mov&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;TwitterModule_d6.mov&lt;/a&gt;
		&lt;/li&gt;
&lt;li&gt;Article original de l&#039;auteur : &lt;a class=&quot;&quot; href=&quot;http://gotdrupal.com/videos/drupal-twitter-module&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;How To: Using Drupal Twitter Module&lt;/a&gt;
        &lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/669">drupal.6.x</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/796">Matt Petrowsky</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/670">Module démo</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/687">module externe</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/575">robin</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/671">tutoriel video drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/819">twitter</category>
 <pubDate>Sun, 22 Aug 2010 18:13:07 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">975 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>How To: Enhance Drupal&#039;s user access, features &amp; control</title>
 <link>http://planete.drupalfr.org/node/974</link>
 <description>&lt;p&gt;&lt;img src=&quot;http://biboo.net/sites/default/files/imagecache/bbfeeds-teaser/bbf-images/access-control-1.png&quot; alt=&quot;&quot; title=&quot;&quot; class=&quot;imagecache imagecache-bbfeeds-teaser imagecache-default imagecache-bbfeeds-teaser_default&quot; width=&quot;150&quot; height=&quot;84&quot; /&gt;        &lt;/p&gt;
&lt;p&gt;
      Une démonstration par Matt Petrowsky des modules :&lt;br /&gt;
      &lt;strong&gt;&lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/modr8&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;modr8&lt;/a&gt;&lt;/strong&gt; (module qui&lt;br /&gt;
      permet de mettre certains types de contenus en &quot;File d&#039;attente pour Modération&quot;, comme cela existe pour&lt;br /&gt;
      les commentaires, excellent !)&lt;br /&gt;
      &lt;strong&gt;&lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/vertical_tabs&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Vertical Tabs&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
      (un module très connu qui améliore l&#039;interface du &quot;formulaire de création de contenus&quot; ...)&lt;br /&gt;
      &lt;strong&gt;&lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/override_node_options&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Override Node&lt;br /&gt;
      Options&lt;/a&gt;&lt;/strong&gt; (module qui permet de donner certains permissions sur des éléments du formulaire&lt;br /&gt;
      de création de contenu, très utile dans certains cas).
    &lt;/p&gt;
&lt;p&gt;
        Voir la vidéo (17 min) :
      &lt;/p&gt;
&lt;p&gt;     &lt;a class=&quot;thickbox readmore&quot; href=&quot;http://biboo.net#TB_inline?height=660&amp;amp;width=970&amp;amp;inlineId=popup&quot; rel=&quot;nofollow&quot;&gt;&lt;br /&gt;
     	&lt;img src=&quot;http://biboo.net/sites/default/files/internal/gotdrupal.png&quot; alt=&quot;gotdrupal&quot; width=&quot;398&quot; height=&quot;296&quot; /&gt;&lt;br /&gt;
     &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
        Infos :
	&lt;/p&gt;
&lt;ul class=&quot;&quot;&gt;
&lt;li&gt;Le .mov (&lt;a class=&quot;&quot; href=&quot;http://www.apple.com/quicktime/&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Quicktime&lt;/a&gt;) : &lt;a class=&quot;&quot; href=&quot;http://media.gotdrupal.com/matt/howto/d6/Drupal-User-Features_d6.mov&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Drupal-User-Features_d6.mov&lt;/a&gt;
		&lt;/li&gt;
&lt;li&gt;Article original de l&#039;auteur : &lt;a class=&quot;&quot; href=&quot;http://gotdrupal.com/videos/enhance-drupal-user-access-features-control&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;How To: Enhance Drupal&#039;s user access, features &amp;amp; control&lt;/a&gt;
        &lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/669">drupal.6.x</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/796">Matt Petrowsky</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/816">modr8</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/670">Module démo</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/687">module externe</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/817">Override Node Options</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/575">robin</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/671">tutoriel video drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/818">Vertical Tabs</category>
 <pubDate>Sun, 22 Aug 2010 16:29:39 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">974 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Questions...</title>
 <link>http://planete.drupalfr.org/node/976</link>
 <description>&lt;p&gt;Salut !&lt;/p&gt;
&lt;p&gt;En cette fin de beau week-end du mois d&#039;août, alors que vient de s&#039;ouvrir la &lt;a href=&quot;http://cph2010.drupal.org/&quot; rel=&quot;nofollow&quot;&gt;DrupalCon Copenhague&lt;/a&gt; (où je ne suis pas), toute la Drupalie bruisse de questions plus angoissantes les unes que les autres :&lt;/p&gt;
&lt;p&gt;- Drupal 7 sera-t-il utilisable avant Noël ?&lt;/p&gt;
&lt;p&gt;- Que va dire Dries dans sa &lt;em&gt;keynote &lt;/em&gt;d&#039;ouverture ?&lt;/p&gt;
&lt;p&gt;- Maintenant qu&#039;il est à Copenhague, Damien Tournoud pourra-t-il en repartir ?&lt;/p&gt;
&lt;p&gt;A vrai dire, la seule question qui m&#039;inquiète, pour le moment, c&#039;est de savoir si j&#039;aurai le temps de préparer un petit quelque chose pour marquer le premier anniversaire de Drupalistic (eeeh oui le temps passe ma bonne dame)&lt;/p&gt;
&lt;p&gt;Mais je promets de ne pas vous laisser, sur le reste, dans une si insoutenable détresse, et de vous rendre compte de la situation dès que Damien aura remis les pieds à Paris (ahahah, astuce, comment gagner du temps : avec un peu de chance, ça me laisse une bonne trentaine d&#039;heures de plus que n&#039;importe qui d&#039;autre)... Héhéhé :-) !&lt;/p&gt;
&lt;p&gt;Bonne semaine aux Danois, bon courage, tenez-nous au courant et revenez vaillants !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.drupalistic.net/billet/questions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;en lire plus&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/208">drupalcon</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/624">Marie-Hélène Wronecki</category>
 <pubDate>Sun, 22 Aug 2010 16:16:36 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">976 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Questions...</title>
 <link>http://planete.drupalfr.org/node/978</link>
 <description>&lt;p&gt;Salut !&lt;/p&gt;
&lt;p&gt;En cette fin de beau week-end du mois d&#039;août, alors que vient de s&#039;ouvrir la &lt;a href=&quot;http://cph2010.drupal.org/&quot; rel=&quot;nofollow&quot;&gt;DrupalCon Copenhague&lt;/a&gt; (où je ne suis pas), toute la Drupalie bruisse de questions plus angoissantes les unes que les autres :&lt;/p&gt;
&lt;p&gt;- Drupal 7 sera-t-il utilisable avant Noël ?&lt;/p&gt;
&lt;p&gt;- Que va dire Dries dans sa &lt;em&gt;keynote &lt;/em&gt;d&#039;ouverture ?&lt;/p&gt;
&lt;p&gt;- Maintenant qu&#039;il est à Copenhague, Damien Tournoud pourra-t-il en repartir ?&lt;/p&gt;
&lt;p&gt;A vrai dire, la seule question qui m&#039;inquiète, pour le moment, c&#039;est de savoir si j&#039;aurai le temps de préparer un petit quelque chose pour marquer le premier anniversaire de Drupalistic (eeeh oui le temps passe ma bonne dame)&lt;/p&gt;
&lt;p&gt;Mais je promets de ne pas vous laisser, sur le reste, dans une si insoutenable détresse, et de vous rendre compte de la situation dès que Damien aura remis les pieds à Paris (ahahah, astuce, comment gagner du temps : avec un peu de chance, ça me laisse une bonne trentaine d&#039;heures de plus que n&#039;importe qui d&#039;autre)... Héhéhé :-) !&lt;/p&gt;
&lt;p&gt;Bonne semaine aux Danois, bon courage, tenez-nous au courant et revenez vaillants !&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://drupalistic.net/billet/questions&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;en lire plus&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/208">drupalcon</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/624">Marie-Hélène Wronecki</category>
 <pubDate>Sun, 22 Aug 2010 16:16:36 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">978 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>How To: Manage Drupal Permissions More Easily</title>
 <link>http://planete.drupalfr.org/node/973</link>
 <description>&lt;p&gt;&lt;img src=&quot;http://biboo.net/sites/default/files/imagecache/bbfeeds-teaser/bbf-images/permissions-1.png&quot; alt=&quot;&quot; title=&quot;&quot; class=&quot;imagecache imagecache-bbfeeds-teaser imagecache-default imagecache-bbfeeds-teaser_default&quot; width=&quot;150&quot; height=&quot;86&quot; /&gt;        &lt;/p&gt;
&lt;p&gt;Une démonstration par Matt Petrowsky des modules &lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/filter_perms&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Filter Permissions&lt;/a&gt;, &lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/permissions_lock&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Permissions Lock&lt;/a&gt; et &lt;a class=&quot;&quot; href=&quot;http://drupal.org/project/better_perms&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Better Permissions&lt;/a&gt; qui vont vous permettre d&#039;améliorer la gestion des permissions dans Drupal; surtout si vous avez de nombreux roles et modules d&#039;installé...&lt;/p&gt;
&lt;p&gt;
        Voir la vidéo (21 min) :
      &lt;/p&gt;
&lt;p&gt;     &lt;a class=&quot;thickbox readmore&quot; href=&quot;http://biboo.net#TB_inline?height=660&amp;amp;width=970&amp;amp;inlineId=popup&quot; rel=&quot;nofollow&quot;&gt;&lt;br /&gt;
     	&lt;img src=&quot;http://biboo.net/sites/default/files/internal/gotdrupal.png&quot; alt=&quot;gotdrupal&quot; width=&quot;398&quot; height=&quot;296&quot; /&gt;&lt;br /&gt;
     &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
        Infos :
	&lt;/p&gt;
&lt;ul class=&quot;&quot;&gt;
&lt;li&gt;Le .mov (&lt;a class=&quot;&quot; href=&quot;http://www.apple.com/quicktime/&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Quicktime&lt;/a&gt;) : &lt;a class=&quot;&quot; href=&quot;http://media.gotdrupal.com/matt/howto/d6/Managing-Drupal-Permissions_d6.mov&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;Managing-Drupal-Permissions_d6.mov&lt;/a&gt;
		&lt;/li&gt;
&lt;li&gt;Article original de l&#039;auteur : &lt;a class=&quot;&quot; href=&quot;http://gotdrupal.com/videos/manage-drupal-permissions-more-easily&quot; title=&quot;&quot; rel=&quot;nofollow&quot;&gt;How To: Manage Drupal Permissions More Easily&lt;/a&gt;
        &lt;/li&gt;
&lt;/ul&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/813">better permissions</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/669">drupal.6.x</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/814">filter permissions</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/796">Matt Petrowsky</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/670">Module démo</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/687">module externe</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/815">permissions lock</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/575">robin</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/671">tutoriel video drupal</category>
 <pubDate>Sun, 22 Aug 2010 15:51:05 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">973 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Retour sur la rencontre Drupal Montréal</title>
 <link>http://planete.drupalfr.org/node/970</link>
 <description>&lt;h2 class=&quot;title subtitle&quot;&gt;Le 12 août dernier, Whisky Echo Bravo recevait passionnés et curieux pour échanger à propos de Drupal&lt;/h2&gt;
&lt;p&gt;                    &lt;a href=&quot;http://whiskyechobravo.com/blogue/retour-sur-la-rencontre-drupal-montreal&quot; class=&quot;imagecache imagecache-small-nocrop imagecache-linked imagecache-small-nocrop_linked&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://whiskyechobravo.com/sites/whiskyechobravo.com/files/imagecache/small-nocrop/images/111/20100812-drupalmtlweb005_0.jpg&quot; alt=&quot; Sylvain Aubé)&quot; title=&quot; Sylvain Aubé)&quot; class=&quot;imagecache imagecache-small-nocrop&quot; width=&quot;150&quot; height=&quot;113&quot; /&gt;&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;                    &lt;a href=&quot;http://whiskyechobravo.com/blogue/retour-sur-la-rencontre-drupal-montreal&quot; class=&quot;imagecache imagecache-small-nocrop imagecache-linked imagecache-small-nocrop_linked&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://whiskyechobravo.com/sites/whiskyechobravo.com/files/imagecache/small-nocrop/images/111/rencontre-drupal-montreal-whiskyechobravo-554.jpg&quot; alt=&quot; David Lesieur)&quot; title=&quot; David Lesieur)&quot; class=&quot;imagecache imagecache-small-nocrop&quot; width=&quot;150&quot; height=&quot;100&quot; /&gt;&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;                    &lt;a href=&quot;http://whiskyechobravo.com/blogue/retour-sur-la-rencontre-drupal-montreal&quot; class=&quot;imagecache imagecache-small-nocrop imagecache-linked imagecache-small-nocrop_linked&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://whiskyechobravo.com/sites/whiskyechobravo.com/files/imagecache/small-nocrop/images/111/rencontre-drupal-montreal-whiskyechobravo-561.jpg&quot; alt=&quot; David Lesieur)&quot; title=&quot; David Lesieur)&quot; class=&quot;imagecache imagecache-small-nocrop&quot; width=&quot;100&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;        &lt;/p&gt;
&lt;p&gt;Nous remercions tout ceux qui ce sont déplacés pour la &lt;a href=&quot;http://whiskyechobravo.com/blogue/whisky-echo-bravo-vous-invite-a-une-rencontre-drupal&quot; rel=&quot;nofollow&quot;&gt;rencontre du 12 août&lt;/a&gt;. Nous avons grandement apprécié votre participation aux discussions portant sur le développement de thèmes, la gestion de sites multilingues et l&#039;importation de données dans Drupal.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/249">Communauté</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/609">Évènement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/610">Informatique libre</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/608">La production</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/266">Montréal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/635">Planète Drupalfr</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/637">Sylvain Aubé</category>
 <pubDate>Tue, 17 Aug 2010 19:02:48 +0000</pubDate>
 <dc:creator>Echo Bravo</dc:creator>
 <guid isPermaLink="false">970 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Ajouter une étape de confirmation à vos formulaires</title>
 <link>http://planete.drupalfr.org/node/969</link>
 <description>&lt;p&gt;C&amp;#8217;est une petite fonctionnalité dont vous pourriez avoir besoin, voici une présentation du fonctionnement d&amp;#8217;une telle fonctionnalité.&lt;br /&gt;
A première vue cela peut sembler très facile à implémenter mais au final ça ne l&amp;#8217;est pas tant que ça.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://juliendubois.fr/drupal_blog/wp-content/uploads/2010/08/confirm1.jpg&quot; rel=&quot;nofollow&quot;&gt;&lt;img class=&quot;aligncenter size-full wp-image-145&quot; title=&quot;confirm&quot; src=&quot;http://juliendubois.fr/drupal_blog/wp-content/uploads/2010/08/confirm1.jpg&quot; alt=&quot;&quot; width=&quot;630&quot; height=&quot;220&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Prenons l&amp;#8217;exemple d&amp;#8217;un formulaire qui permet de clore des votes sur des sessions, cette action étant importante nous allons ajouter une étape de confirmation avant de faire le traitement.&lt;/p&gt;
&lt;p&gt;Je simplifie volontairement le formulaire que l&amp;#8217;on créé, résumons le à un simple bouton d&amp;#8217;action :&lt;/p&gt;
&lt;p&gt;&amp;#60;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Form to close votes on sessions.&lt;br /&gt;
 */&lt;br /&gt;
function feature_conference_close_sessions_form&amp;#40;&amp;#38;$form_state&amp;#41; &amp;#123;&lt;br /&gt;
 $form&amp;#91;&#039;submit&#039;&amp;#93; = array&amp;#40;&lt;br /&gt;
 &#039;#type&#039; =&amp;#62; &#039;submit&#039;,&lt;br /&gt;
 &#039;#value&#039; =&amp;#62; t&amp;#40;&#039;Clore les votes&#039;&amp;#41;,&lt;br /&gt;
 &amp;#41;;&lt;br /&gt;
 return $form;&lt;br /&gt;
&amp;#125;&lt;br /&gt;
?&amp;#62;&lt;/p&gt;
&lt;p&gt;Ensuite dans le traitement de ce formulaire il faut faire une redirection vers le formulaire de confirmation. Aucun traitement ne doit être fait ici sachant que le formulaire n&amp;#8217;a pas encore été confirmé par l&amp;#8217;utilisateur.&lt;/p&gt;
&lt;p&gt;&amp;#60;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Redirect to confirmation form.&lt;br /&gt;
 */&lt;br /&gt;
function feature_conference_close_sessions_form_submit&amp;#40;$form, &amp;#38;$form_state&amp;#41; &amp;#123;&lt;br /&gt;
 $form_state&amp;#91;&#039;redirect&#039;&amp;#93; = &#039;sessions/close/confirm&#039;;&lt;br /&gt;
&amp;#125;&lt;br /&gt;
?&amp;#62;&lt;/p&gt;
&lt;p&gt;Sachant que nous faisons une redirection vers une entrée de menu, il faut la déclarer via un hook_menu().&lt;/p&gt;
&lt;p&gt;&amp;#60;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Implement hook_menu().&lt;br /&gt;
 */&lt;br /&gt;
function feature_conference_menu&amp;#40;&amp;#41; &amp;#123;&lt;br /&gt;
 return array&amp;#40;&lt;br /&gt;
 &#039;sessions/close/confirm&#039; =&amp;#62; array&amp;#40;&lt;br /&gt;
 &#039;page callback&#039; =&amp;#62; &#039;drupal_get_form&#039;,&lt;br /&gt;
 &#039;page arguments&#039; =&amp;#62; array&amp;#40;&#039;feature_conference_close_sessions_confirm_form&#039;&amp;#41;,&lt;br /&gt;
 &#039;access callback&#039; =&amp;#62; TRUE,&lt;br /&gt;
 &amp;#41;,&lt;br /&gt;
&amp;#125;&lt;br /&gt;
?&amp;#62;&lt;/p&gt;
&lt;p&gt;Dans ce formulaire il vous faut utiliser la fonction confirm_form() (&lt;a href=&quot;http://api.drupal.org/api/function/confirm_form/6&quot; title=&quot;http://api.drupal.org/api/function/confirm_form/6&quot; rel=&quot;nofollow&quot;&gt;http://api.drupal.org/api/function/confirm_form/6&lt;/a&gt;) pour obtenir la page de confirmation.&lt;/p&gt;
&lt;p&gt;&amp;#60;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Confirmation form before closing sessions.&lt;br /&gt;
 */&lt;br /&gt;
function feature_conference_close_sessions_confirm_form&amp;#40;&amp;#38;$form_state&amp;#41; &amp;#123;&lt;br /&gt;
 $form = array&amp;#40;&amp;#41;;&lt;br /&gt;
 $desc = &amp;#34;Les votes ne seront plus possibles.&amp;#34;;&lt;br /&gt;
 return confirm_form&amp;#40;$form, &amp;#34;Êtes-vous sûr de vouloir clore les votes ?&amp;#34;,&lt;br /&gt;
 &amp;#34;&amp;#60;front&amp;#62;&amp;#34;, $desc&amp;#41;;&lt;br /&gt;
&amp;#125;&lt;br /&gt;
?&amp;#62;&lt;/p&gt;
&lt;p&gt;Ensuite on retombe dans le fonctionnement classique des formulaires, il suffit de faire le traitement des données dans la fonction de submit du formulaire.&lt;/p&gt;
&lt;p&gt;&amp;#60;?php&lt;br /&gt;
/**&lt;br /&gt;
 * Close votes on sessions, send email to rejected contributions&#039; authors&lt;br /&gt;
 */&lt;br /&gt;
function feature_conference_close_sessions_confirm_form_submit&amp;#40;$form, &amp;#38;$form_state&amp;#41; &amp;#123;&lt;br /&gt;
 // Set a variable to status closed&lt;br /&gt;
 variable_set&amp;#40;&#039;feature_conference_status&#039;, &#039;closed&#039;&amp;#41;;&lt;br /&gt;
 drupal_set_message&amp;#40;&amp;#34;Les votes sur les sessions sont maintenant clos.&amp;#34;&amp;#41;;&lt;br /&gt;
 drupal_goto&amp;#40;&#039;&amp;#60;front&amp;#62;&#039;&amp;#41;;&lt;br /&gt;
&amp;#125;&lt;br /&gt;
?&amp;#62;&lt;/p&gt;
&lt;p&gt;Et nous voilà avec un formulaire de confirmation fonctionnel. Le cas d&amp;#8217;usage est simple, si vous souhaitez faire une action plus avancée comme par exemple clore une session précise, il faut que vous passiez les données dans le formulaire de confirmation via un ou plusieurs arguments à l&amp;#8217;url de traitement car le fait d&amp;#8217;effectuer une redirection entraine la perte des données soumise par le formulaire principal.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/652">Julien Dubois</category>
 <pubDate>Mon, 09 Aug 2010 11:09:16 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">969 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Ajouter des conditions de validation à un champ CCK</title>
 <link>http://planete.drupalfr.org/node/957</link>
 <description>&lt;p&gt;Lorsqu&amp;#8217;on construit un formulaire à l&amp;#8217;aide de CCK on bénéficie de conditions de validation de champs par défaut, afin de contrôler que la saisie de l&amp;#8217;utilisateur est bien un nombre, du texte ou de type adresse mail&amp;#8230; Prenons l&amp;#8217;exemple du module phone qui permet de saisir des numéros de téléphone, celui-ci vérifie lors de la validation que ce qui à été tapé semble bien être un numéro.&lt;/p&gt;
&lt;p&gt;Il peut vous arriver d&amp;#8217;avoir besoin de vérifier autre chose, par exemple pour un numéro de série vous allez faire un contrôle sur la structure de l&amp;#8217;information et le nombre de caractères.&lt;/p&gt;
&lt;p&gt;Pour personnaliser la vérification de nos champs de formulaires nous allons ajouter, grâce à un form_alter, un appel à nos fonctions de vérifications.&lt;/p&gt;
&lt;p&gt;function mymodule_form_alter($form_id, &amp;#038;$form) {&lt;br /&gt;
  // Si vous voulez controler un champs pour un type de contenu en particulier&lt;br /&gt;
  $allowed_node_types = array(&lt;br /&gt;
    &#039;mymodule1&#039;,&lt;br /&gt;
    &#039;mymodule2&#039;,&lt;br /&gt;
  );&lt;/p&gt;
&lt;p&gt;  // On vérifie que l&#039;on est bien sur un formulaire de type de contenu et qu&#039;il appartient à la liste précédente.&lt;br /&gt;
  if (substr($form_id,-10)==&#039;_node_form&#039; &amp;#038;&amp;#038; in_array(substr($form_id, 0, strlen($form_id)-10), $allowed_node_types)) {&lt;br /&gt;
    // Note : Vous pouvez ajouter autant de fonctions de vérification que vous en avez besoin&lt;br /&gt;
    $form[&#039;#validate&#039;][] = &#039;_mymodule_form_validate&#039;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Il ne nous reste plus qu&amp;#8217;à construire notre fonction de vérification&lt;/p&gt;
&lt;p&gt;function _mymodule_form_validate($form_values, $form)&lt;br /&gt;
{&lt;br /&gt;
  // Vous pouvez alors vérifier votre champ et avertir l&#039;utilisateur d&#039;un éventuel probleme.&lt;br /&gt;
  if ($form_values[&#039;monchamp&#039;][0][&#039;value&#039;] == &#039;Quelque chose à vérifier&#039;) {&lt;br /&gt;
    form_set_error(&#039;monchamp&#039;, &#039;Le message d&#039;erreur pour l&#039;utilisateur&#039;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Voilà, en quelques lignes nous venons d&amp;#8217;ajouter nos propres conditions de validation à notre champ CCK.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/122">CCK</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/666">Documentations</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/618">form</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/663">Julien</category>
 <pubDate>Wed, 04 Aug 2010 12:21:32 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">957 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Poste de développeur Drupal à pourvoir</title>
 <link>http://planete.drupalfr.org/node/958</link>
 <description>&lt;p&gt;OSInet recherche un nouveau membre pour étoffer son équipe Drupal
&lt;p&gt;&lt;a href=&quot;http://www.riff.org/poste_de_developpeur_drupal_a_pourvoir&quot; rel=&quot;nofollow&quot;&gt;en lire plus&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/435">Actualités</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/529">fgm pour Riff News</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/512">fr</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/511">OSInet</category>
 <pubDate>Tue, 03 Aug 2010 22:00:00 +0000</pubDate>
 <dc:creator>Riff News</dc:creator>
 <guid isPermaLink="false">958 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Modifier/Overrider facilement le CSS d&#039;une page Drupal</title>
 <link>http://planete.drupalfr.org/node/960</link>
 <description>&lt;p&gt;
Il arrive qu&#039;on veuille modifier rapidement l&#039;aspect d&#039;une page sans forcément avoir le courage d&#039;aller chercher dans le CSS du thème ou se trouve la partie à modifier, où de créer une nouvelle feuille de style pour écraser la propriété.
&lt;/p&gt;
&lt;p&gt;
Pour cela, il existe &lt;a href=&quot;http://drupal.org/project/css_injector&quot; rel=&quot;nofollow&quot;&gt;CSS Injector&lt;/a&gt;, qui permet d&#039;éditer les propriétés CSS dans toutes ou certaines pages.
&lt;/p&gt;
&lt;p&gt;
Une fois le module installé et activé, rien de plus simple : Configuration du site &amp;gt; CSS injector
&lt;/p&gt;
&lt;h2&gt;
Ajouter une nouvelle règle&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Chaque règle permet de modifier le CSS d&#039;une ou plusieurs pages. Je vous conseille donc de créer soit des règles selon les pages où elles vont être appliquées, par exemple &quot;Toutes les pages&quot;, &quot;Page d&#039;accueil&quot;, &quot;Noeuds&quot;, etc. soit selon l&#039;élément qu&#039;elles vont affecter, par exemple &quot;Suppression des puces&quot;, &quot;Mise en forme des commentaires&quot;, etc. Ou encore les deux !
&lt;/p&gt;
&lt;p&gt;
De cette manière l&#039;administration de ces règles sera d&#039;autant plus facile.
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;h2&gt;
Ecraser une propriété existante&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Souvenez vous que CSS Injector n&#039;est qu&#039;un module, il sera donc appelé avant le thème et sera écrasé par celui-ci (voir &lt;a href=&quot;http://blog.sebastiencorbin.fr/fr/taxonomy/term/3/fr/structure-theming-sous-drupal-6&quot; rel=&quot;nofollow&quot;&gt;mon article sur le processus de theming Drupal&lt;/a&gt;), pour écraser une propriété d&#039;un thème, il vous faudra donc user de la hiérarchie CSS :
&lt;/p&gt;
&lt;p&gt;body .block-locale ul li &amp;#123;&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;
pour écraser :
&lt;/p&gt;
&lt;p&gt;.block-locale ul li &amp;#123;&lt;br /&gt;
    list-style-type: none;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;
ou encore d&#039;utiliser le flag &lt;em&gt;!important&lt;/em&gt; pour spécifier au navigateur que votre propriété est la plus importante.
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;h2&gt;
Le cache&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
L&#039;option &lt;em&gt;Preprocess CSS&lt;/em&gt; (cochée par défaut) permet d&#039;utiliser l&#039;option preprocess de &lt;a href=&quot;http://api.drupal.org/api/function/drupal_add_css/6&quot; rel=&quot;nofollow&quot;&gt;drupal_add_css&lt;/a&gt; pour que CSS Injector s&#039;intègre aux CSS aggrégés et respecte le cache Drupal donc si vous ne voyez rien changer sur votre page : pensez à le vider !
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;h2&gt;
Condition PHP&lt;br /&gt;
&lt;/h2&gt;
&lt;p&gt;
Le formulaire d&#039;édition des règles permet d&#039;utiliser un code PHP pour intégrer le code CSS. On peut donc aisément changer de background général selon l&#039;heure de la journée :
&lt;/p&gt;
&lt;p&gt;Code CSS&lt;/p&gt;
&lt;p&gt;body &amp;#123;&lt;br /&gt;
    background: url&amp;#40;&#039;sites/all/themes/montheme/img/bg_nuit.png&#039;&amp;#41;;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;Code PHP&lt;/p&gt;
&lt;p&gt;&amp;lt;?php&lt;br /&gt;
if&amp;#40;&amp;#40;int&amp;#41;&lt;a href=&quot;http://www.php.net/date&quot; rel=&quot;nofollow&quot;&gt;date&lt;/a&gt;&amp;#40;&#039;H&#039;&amp;#41; &amp;lt; 8 || &amp;#40;int&amp;#41;&lt;a href=&quot;http://www.php.net/date&quot; rel=&quot;nofollow&quot;&gt;date&lt;/a&gt;&amp;#40;&#039;H&#039;&amp;#41; &amp;gt; 21&amp;#41;&lt;br /&gt;
    return TRUE;&lt;br /&gt;
?&amp;gt;&lt;/p&gt;
&lt;p&gt;
Attention aux erreurs PHP !
&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/361">css</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/800">Seb</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/665">theming</category>
 <pubDate>Mon, 26 Jul 2010 16:09:23 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">960 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Whisky Echo Bravo vous invite à une rencontre Drupal</title>
 <link>http://planete.drupalfr.org/node/945</link>
 <description>&lt;h2 class=&quot;title subtitle&quot;&gt;Joignez-vous à nous le 12 août prochain&lt;/h2&gt;
&lt;p&gt;Nous vous invitons à découvrir nos locaux, situés à deux pas du Canal Lachine. Venez nous voir et discuter Drupal, peu avant la Drupalcon de Copenhague!&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/791">Bureau</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/609">Évènement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/610">Informatique libre</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/608">La production</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/266">Montréal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/635">Planète Drupalfr</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/637">Sylvain Aubé</category>
 <pubDate>Tue, 20 Jul 2010 21:29:23 +0000</pubDate>
 <dc:creator>Echo Bravo</dc:creator>
 <guid isPermaLink="false">945 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Whisky Echo Bravo vous invite à une rencontre Drupal</title>
 <link>http://planete.drupalfr.org/node/946</link>
 <description>&lt;h2 class=&quot;title subtitle&quot;&gt;Joignez-vous à nous le 12 août prochain&lt;/h2&gt;
&lt;p&gt;Nous vous invitons à découvrir nos locaux, situés à deux pas du Canal Lachine. Venez nous voir et discuter Drupal, peu avant la Drupalcon de Copenhague!&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/792">Bureau</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/791">Bureau</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/249">Communauté</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/609">Évènement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/610">Informatique libre</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/608">La production</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/266">Montréal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/635">Planète Drupalfr</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/637">Sylvain Aubé</category>
 <pubDate>Tue, 20 Jul 2010 21:29:23 +0000</pubDate>
 <dc:creator>Echo Bravo</dc:creator>
 <guid isPermaLink="false">946 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>france.fr : Error 500 - Internal incompetence error ?</title>
 <link>http://planete.drupalfr.org/node/944</link>
 <description>&lt;p&gt;
  Normalement je n&#039;aurais pas eu grand-chose à faire des mésaventures de &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://france.fr&quot; rel=&quot;nofollow&quot;&gt;france.fr&lt;/a&gt; qui s&#039;est lamentablement cassé la binette, et en fanfare, le 14 juillet dernier, si ce dernier n&#039;avait pas tourné sous Drupal. Et même sachant ça, cela n&#039;aurait pas été un sujet non plus si depuis le crash, je n&#039;avais pas entendu mille fois la tirade du &quot;Normal, c&#039;est du Drupal, donc ça broute&quot;, déclinée dans tous les styles (spipien, wordpression, j&#039;en passe, et des moins mûres).&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_1&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Les chiffres&lt;/h2&gt;
&lt;p&gt;
  Pour commencer, je n&#039;ai aucune idée de la manière dont ce site a été construit ni comment il fonctionne. C&#039;est d&#039;ailleurs fou le peu d&#039;information que l&#039;on arrive à glaner sur un projet financé à grand frais sur nos deniers. Pour ce que j&#039;ai pu trouver, le site a coûté &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.cpolitic.com/cblog/2010/07/18/revue-expresse-surprises-esclamations-gueulantes/?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=revue-expresse-surprises-esclamations-gueulantes&quot; rel=&quot;nofollow&quot;&gt;800 000 euros&lt;/a&gt;, il a été réalisé par le société &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.agence-modedemploi.com/&quot; rel=&quot;nofollow&quot;&gt;modedemploi&lt;/a&gt; (merci à Damien Leloup pour l&#039;&lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://webcache.googleusercontent.com/search?q=cache:BFbaodCcwSwJ:www.france.fr/page/mentions-legales+site:france.fr+modedemploi&amp;amp;cd=1&amp;amp;hl=fr&amp;amp;ct=clnk&amp;amp;gl=fr&amp;amp;client=firefox-a&quot; rel=&quot;nofollow&quot;&gt;astuce&lt;/a&gt; qui m&#039;a permis de le vérifier), une société &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.google.fr/search?hl=fr&amp;amp;q=site:agence-modedemploi.com+drupal&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&amp;amp;gs_rfai=&quot; rel=&quot;nofollow&quot;&gt;très réputée dans le monde Drupal&lt;/a&gt;... et l&#039;ensemble tournerait sur &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/pbeyssac/status/18636239735&quot; rel=&quot;nofollow&quot;&gt;12 machines&lt;/a&gt; (je n&#039;ai pas réussi à trouver confirmation formelle de ceci).
&lt;/p&gt;
&lt;p&gt;
  En cherchant bien, nous avons malgré tout quelques informations. Cela commence &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.lemondeinformatique.fr/actualites/lire-le-site-francefr-fait-pschittt-31194.html&quot; rel=&quot;nofollow&quot;&gt;avec une suprenante déclaration d&#039;un responsable du gouvernement&lt;/a&gt; (au moins j&#039;aurais appris qu&#039;il y a des gens responsables dans ce gouvernement...) :&lt;/p&gt;
&lt;p&gt;
     (...)lors du lancement de site, le nombre de connexions a atteint la barre des 2.000. Mercredi matin, le cap des 25.000 était franchi, provoquant la paralysie du serveur(...)
  &lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
  Déjà j&#039;ai un peu de mal avec les imprécisions (ou noyage de poisson), car 25000 connexions pour une 1/2 journée (extrapolons donc à 50000 pour la journée entière du mercredi) ça veut dire quoi ? Ce sont des pages servies, des visiteurs uniques ? toutes les connexions (css, images, etc) ? Si ce sont des pages, cela me semble bien peu, et si ce sont des visiteurs uniques, ce n&#039;est pas beaucoup plus brillant.
&lt;/p&gt;
&lt;p&gt;
  Sur &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.france-info.com/technologies-divers-2010-07-15-france-fr-lance-hier-plante-depuis-465962-34-35.html&quot; rel=&quot;nofollow&quot;&gt;France Intox&lt;/a&gt;, l&#039;extrapolation à 50000 est confirmée par le directeur du SIG :&lt;/p&gt;
&lt;p&gt;
  (...)une surprenante (...)environ 50 000 visiteurs un jour férié.
  &lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;
  Déjà j&#039;aime beaucoup le concept de &quot;surprenante affluence&quot; de 50000 visiteurs (uniques j&#039;imagine) pour un site web international, qui représente la France, ouvert un 14 juillet, en pleine période touristique. ici le tragique flirte avec un comique qui ne va pas améliorer le moral lorsque nous recevrons notre prochain appel d&#039;impôt.
&lt;/p&gt;
&lt;p&gt;
  Maintenant pour moi la notion de &quot;visiteur unique&quot; est sûrement très intéressante pour la mesure d&#039;audience, mais n&#039;a aucun intérêt d&#039;un point de vue technique. A cet indicateur je préfère le nombre de pages servies par minutes et par serveur. J&#039;ai constaté que pour un site de contenu, à un visiteur unique correspond en gros en moyenne 4 pages servies (je subodore que ce soit bien moins important pour france.fr, chiffrage optimiste donc).
&lt;/p&gt;
&lt;p&gt;
  Donc on peut imaginer que le site france.fr s&#039;est étouffé à 200 000 pages servies par 12 machines pour la journée du mercredi 14 juillet, soit 11 pages par minutes et par serveurs (ppms)... Énorme, en effet... Sauf si les 12 bécanes sont en réalité un cluster de TO7 en nano-réseau rescapés du plan &quot;Informatique pour tous&quot;, il y a comme un problème...
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_2&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Éléments de comparaison&lt;/h2&gt;
&lt;p&gt;
   A titre de comparaison, et avant de parler d&#039;&lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://twitter.com/GusLeLapin/statuses/18672878323&quot; rel=&quot;nofollow&quot;&gt;inneficience de Drupal&lt;/a&gt;, Rue89 mange &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://www.01net.com/editorial/518153/rue89-com-tente-le-pari-du-magazine-papier/&quot; rel=&quot;nofollow&quot;&gt;2 millions de visiteurs uniques&lt;/a&gt; par mois avec seulement 4 serveurs. Ce qui nous donnes du 46 pages par minute et par serveur (toujours en prenant 1 visiteur unique = 4 pages). Donc déjà cela prouve que Drupal peut aller un peu plus loin que du 11 ppms.&lt;/p&gt;
&lt;p&gt;
  &lt;a class=&quot;illustration&quot; href=&quot;http://arnumeral.fr/files/arnumeral/attachements/694/graphic.png&quot; rel=&quot;lightbox&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://arnumeral.fr/files/arnumeral/imagecache/illustration/attachements/694/graphic.png&quot; alt=&quot;&quot; title=&quot;&quot; class=&quot;imagecache imagecache-illustration&quot; width=&quot;200&quot; height=&quot;146&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
  Maintenant si je jette un oeil aux graphiques de &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://mediapart.fr&quot; rel=&quot;nofollow&quot;&gt;mediapart.fr&lt;/a&gt;, disons à minuit, on ne peut pas dire que le trafic soit monstrueux (et nous ne sommes pas non plus dans le cas de la semaine dernière, avec une affaire Bettencourt). A cette heure je vois que l&#039;ensemble des 4 drupaux médiapartiens servent, 200 pages par minutes en moyenne. Chaque machine étant à peine à 25% de charge... Transposé sur une journée cela nous donne 288000 pages. Approximation ridicule (le trafic double en journée) mais déjà là, on est au-dessus de france.fr.
&lt;/p&gt;
&lt;p&gt;
  Pour être plus objectif encore, j&#039;ai fait un coup de cat/get/wc sur les logs apache de l&#039;une des machines (la flemme de faire une agrégation tous les logs :-). Résultat : 175000 pages services en 24h, soit donc 120 ppms.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_3&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
  Mes calculs reposant sur une conversion un peu foireuse entre les nombres de visiteurs communiqués et la réalité des pages servies, ils valent ce qu&#039;ils valent, c&#039;est à dire pas grand chose. Cependant cela prouve tout de même qu&#039;il existe des sites Drupaux qui tournent à un bien plus important régime avec bien moins de machines. Donc l&#039;argument de l&#039;inefficience de Drupal me semble un peu fallacieux. Qu&#039;un Drupal brut de coffrage tourne moins vite qu&#039;un SPIP je n&#039;en doute pas une seconde, mais moins vite ne signifie pas obligatoirement beaucoup plus lent.
&lt;/p&gt;
&lt;p&gt;
  Ensuite si l&#039;on cherche les causes possibles, nous avons déjà l&#039;erreur de paramétrage de Drupal (genre &quot;Oups, on a laissé le cache en base les gars, la boulette !!&quot;) ? J&#039;en doute, cela aurait été réglé depuis une semaine que le site est HS. Nous avons aussi comme cause possible le grand classique du drupal super lourd gavé jusqu&#039;à la trogne de modules boulimiques enquillés à la vas-y-que-je-te-pousse ? J&#039;en doute aussi car ce site est totalement anonyme (à ce que j&#039;ai eu le temps d&#039;en voir). Cela veut dire que très rapidement l&#039;ensemble des pages se trouvent compressées dans le cache frontal et servies sans requête SQL (et ce sans même sans compter sur un reverse-proxy comme Varnish). Et si les intégrateurs avaient oublié d&#039;installer un truc aussi basique que &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://memcached.org/&quot; rel=&quot;nofollow&quot;&gt;memcache&lt;/a&gt;, en une semaine, je gage que cela serait tout de même déjà fait.
&lt;/p&gt;
&lt;p&gt;
  Reste la solution la plus simple, l&#039;erreur sur l&#039;architecture technique. Ce n&#039;est en effet pas parce que l&#039;on enquille 12 serveurs que le site va pédaler plus vite (ce n&#039;est pas des rameurs que l&#039;on peut ajouter pour aller plus vite ;-). Cela peut donc être une base de données sous-dimensionnée ou en MyISSAM (problème de lock) qui étoufferait les drupaux lors de la génération initiale des pages en cache, l&#039;oubli d&#039;un réseau privé entre les machines du cluster, etc, etc. &lt;/p&gt;
&lt;p&gt;
  Bref, désolé pour les SPIP &amp;amp; Wordpress (que j&#039;apprécie au demeurant), plein de raisons possibles, mais de par le profil purement anonyme du site, ce n&#039;est clairement pas un problème de Drupal (ou alors les auteurs de ce site sont réellement des savates, ce qui n&#039;est pas exclu).
&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/436">Articles</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/215">drupalfr.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/790">Performances</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/484">planetlibre.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/483">Yoran</category>
 <pubDate>Tue, 20 Jul 2010 09:11:12 +0000</pubDate>
 <dc:creator>arNuméral</dc:creator>
 <guid isPermaLink="false">944 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Exposer des critères supplémentaires à Context</title>
 <link>http://planete.drupalfr.org/node/943</link>
 <description>&lt;p&gt;Est-il toujours nécessaire de présenter &lt;a title=&quot;Page projet du module Context sur Drupal.org&quot; href=&quot;http://drupal.org/project/context&quot; rel=&quot;nofollow&quot;&gt;Context&lt;/a&gt;, le module de &lt;a href=&quot;http://developmentseed.org/&quot; rel=&quot;nofollow&quot;&gt;Development Seed&lt;/a&gt; (Grands utilisateurs du célèbre triptyque &lt;a title=&quot;Page projet du module Panels sur Drupal.org&quot; href=&quot;http://drupal.org/project/panels&quot; rel=&quot;nofollow&quot;&gt;Panels&lt;/a&gt;, &lt;a title=&quot;Page projet du module Context sur Drupal.org&quot; href=&quot;http://drupal.org/project/context&quot; rel=&quot;nofollow&quot;&gt;Context&lt;/a&gt; et &lt;a title=&quot;Page projet du module Spaces sur Drupal.org&quot; href=&quot;http://drupal.org/project/spaces&quot; rel=&quot;nofollow&quot;&gt;Spaces&lt;/a&gt; utilisé dans la distribution Open Atrium) ? Oui ? Et bien je vais citer Marie-Hélène qui vous le présente sur &lt;a title=&quot;Article sur Context&quot; href=&quot;http://www.drupalistic.net/module/context&quot; rel=&quot;nofollow&quot;&gt;Drupalistic&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Context est une manière pratique et relativement rationnelle de  configurer l&amp;#8217;affichage des blocs en fonction de la &amp;laquo;&amp;nbsp;section&amp;nbsp;&amp;raquo; du site sur  laquelle on se trouve.&lt;/p&gt;
&lt;p&gt;Un exemple couramment cité est de définir un &lt;em&gt;context &lt;/em&gt;blog,  actif lorsque l&amp;#8217;utilisateur visualise un billet de blog, dans lequel  vont apparaître les blocs &amp;laquo;&amp;nbsp;derniers commentaires&amp;nbsp;&amp;raquo;, ou &amp;laquo;&amp;nbsp;derniers  billets&amp;nbsp;&amp;raquo;, par exemple. Cela évite, lorsque l&amp;#8217;on souhaite modifier  l&amp;#8217;aspect d&amp;#8217;une section, de devoir éditer la configuration de chaque bloc  et la modifier à la main, en risquant d&amp;#8217;oublier un paramètre.&lt;/p&gt;
&lt;p&gt;Voilà pour la présentation, admettons maintenant que vous vouliez définir votre contexte en vous basant sur un type de contenu définit comme Organic Group de type &amp;laquo;&amp;nbsp;Group post&amp;nbsp;&amp;raquo;. Pour cela vous devez implémenter le hook &lt;strong&gt;&lt;em&gt;hook_context_conditions()&lt;/em&gt;&lt;/strong&gt; qui permet d&amp;#8217;ajouter des conditions à remplir pour déterminer le contexte.&lt;br /&gt;
Ce hook est assez simple, il doit retourner un ou plusieurs champs de formulaire qui représentent les conditions que vous voulez ajouter. Dans notre exemple, nous exposons les types de contenu définis en tant que &amp;laquo;&amp;nbsp;group post&amp;nbsp;&amp;raquo;.&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt;
 * Implements hook_context_conditions().&lt;br /&gt;
 */&lt;br /&gt;
function group_post_expose_context_conditions&amp;#40;&amp;#41; &amp;#123;&lt;br /&gt;
 $items = array&amp;#40;&amp;#41;;&lt;br /&gt;
 $groups = array&amp;#40;&amp;#41;;&lt;br /&gt;
 $types = node_get_types&amp;#40;&amp;#41;;&lt;br /&gt;
 // Parcourir la liste des types de contenus pour trouver si des types de contenu&lt;br /&gt;
 // sont des &amp;#34;group&amp;#34; (lire des &amp;#34;group post&amp;#34;)&lt;br /&gt;
 foreach &amp;#40;$types as $type&amp;#41; &amp;#123;&lt;br /&gt;
   if &amp;#40;variable_get&amp;#40;&#039;og_content_type_usage_&#039; . $type-&amp;#62;type, &#039;omitted&#039;&amp;#41; == &amp;#34;group&amp;#34;&amp;#41; &amp;#123;&lt;br /&gt;
     $groups&amp;#91;$type-&amp;#62;type&amp;#93; = $type-&amp;#62;name;&lt;br /&gt;
   &amp;#125;&lt;br /&gt;
 &amp;#125;&lt;br /&gt;
 // Si des types de contenu sont des group post&lt;br /&gt;
 // Il suffit de les ajouter à l&#039;entrée de formulaire $items&lt;br /&gt;
 // Ce champ est utilisé dans context&lt;br /&gt;
 if &amp;#40;count&amp;#40;$groups&amp;#41; &amp;#62; 0&amp;#41; &amp;#123;&lt;br /&gt;
   $items&amp;#91;&#039;group_posts&#039;&amp;#93; = array&amp;#40;&lt;br /&gt;
     &#039;#title&#039; =&amp;#62; t&amp;#40;&#039;Group post family&#039;&amp;#41;,&lt;br /&gt;
     &#039;#description&#039; =&amp;#62; t&amp;#40;&#039;If the post is displayed as a child of the group (the group is in the url).&#039;&amp;#41;,&lt;br /&gt;
     &#039;#type&#039; =&amp;#62; &#039;checkboxes&#039;,&lt;br /&gt;
     &#039;#options&#039; =&amp;#62; $groups,&lt;br /&gt;
   &amp;#41;;&lt;br /&gt;
 &amp;#125;&lt;br /&gt;
 return $items;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://juliendubois.fr/drupal_blog/wp-content/uploads/2010/07/group_post_family.jpg&quot; rel=&quot;nofollow&quot;&gt;&lt;img class=&quot;size-full wp-image-123&quot; title=&quot;group_post_family&quot; src=&quot;http://juliendubois.fr/drupal_blog/wp-content/uploads/2010/07/group_post_family.jpg&quot; alt=&quot;&quot; width=&quot;568&quot; height=&quot;382&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p class=&quot;wp-caption-text&quot;&gt;Aperçu des données exposées&lt;/p&gt;
&lt;p&gt;Vous pouvez donc définir de nouvelles conditions pour activer votre contexte, mais il manque une étape indispensable pour se faire, il vous faut déterminer le moment où vous donnez la valeur de votre contexte. Par exemple activer le contexte &amp;laquo;&amp;nbsp;concours&amp;nbsp;&amp;raquo; lorsque l&amp;#8217;utilisateur visualise un group post de type &amp;laquo;&amp;nbsp;concours&amp;nbsp;&amp;raquo;.&lt;br /&gt;
Pour cela, il vous faut simplement appeler la fonction context_set_by_condition() au bon moment. Cette fonction prends deux paramètres, le premier est la condition à laquelle vous voulez donner une valeur et le second est la valeur de cette condition.&lt;br /&gt;
Voici un snippet dans le contexte de notre exemple :&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt;
* Implements hook_nodeapi().&lt;br /&gt;
*/&lt;br /&gt;
function group_post_expose_nodeapi&amp;#40;$node, $op&amp;#41; &amp;#123;&lt;br /&gt;
  if&amp;#40;$node-&amp;#62;type == &amp;#34;concours&amp;#34; &amp;#38;&amp;#38; $op == &amp;#34;view&amp;#34;&amp;#41; &amp;#123;&lt;br /&gt;
    // &amp;#34;group_posts&amp;#34; est le nom du champ définit dans le hook_context_conditions()&lt;br /&gt;
    // $node-&amp;#62;type représente la valeur à donner à cette condition (ce champ de formulaire) (ici &amp;#34;concours&amp;#34;).&lt;br /&gt;
    context_set_by_condition&amp;#40;&#039;group_posts&#039;, $node-&amp;#62;type&amp;#41;;&lt;br /&gt;
  &amp;#125;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;Et le tour est joué ! Lorsque nous afficherons un noeud de type concours, notre contexte sera actif, libre à vous de l&amp;#8217;utiliser comme bon vous semble, vous pouvez afficher un bloc supplémentaire, cacher une région etc.&lt;/p&gt;
&lt;p&gt;Si vous aussi vous avez des astuces à partager sur Context, n&amp;#8217;hésitez pas à les publier dans les commentaires.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/276">context</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/787">development seeds</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/652">Julien Dubois</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/279">panels</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/788">spaces</category>
 <pubDate>Tue, 20 Jul 2010 06:30:42 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">943 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Structure du theming sous Drupal 6</title>
 <link>http://planete.drupalfr.org/node/961</link>
 <description>&lt;p&gt;
Je me suis remis depuis peu au &lt;strong&gt;theming&lt;/strong&gt; sous Drupal pour un projet, et le moins que l&#039;on puisse dire, c&#039;est qu&#039;on peut facilement s&#039;y perdre&amp;nbsp;&lt;img alt=&quot;sad&quot; rel=&quot;lightbox&quot; src=&quot;http://blog.sebastiencorbin.fr/sites/all/libraries/ckeditor/plugins/smiley/images/sad_smile.gif&quot; title=&quot;sad&quot; /&gt;. Entre les preprocess, template, hooks, et autres mots barbares, on ne sait plus trop qui fait quoi.
&lt;/p&gt;
&lt;p&gt;
Alors bien sûr comme toujours la documentation explique très bien le &lt;strong&gt;processus&lt;/strong&gt;, mais comme je n&#039;avais pas trop le temps de relire toutes les pages concernant le theming, j&#039;ai trouvé &lt;a href=&quot;http://blog.sebastiencorbin.fr/sites/default/files/theme_flow_6_1.pdf&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;un PDF qui résume le tout&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Le voici en image :&amp;nbsp;&lt;a href=&quot;http://blog.sebastiencorbin.fr/sites/default/files/theme_flow_6_1.png&quot; rel=&quot;lightbox&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; rel=&quot;lightbox&quot; src=&quot;http://blog.sebastiencorbin.fr/sites/default/files/theme_flow_6_1_0.png&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Un peu plus clair maintenant, non ?&amp;nbsp;&lt;img alt=&quot;smiley&quot; rel=&quot;lightbox&quot; src=&quot;http://blog.sebastiencorbin.fr/sites/all/libraries/ckeditor/plugins/smiley/images/regular_smile.gif&quot; title=&quot;smiley&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.ventanazul.com/webzine/articles/ideas-overriding-drupal-6-themes&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Source&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt; Fichier attachéTaille &lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://blog.sebastiencorbin.fr/sites/default/files/theme_flow_6_1_0.pdf&quot; rel=&quot;nofollow&quot;&gt;Drupal_theme_flow_6.pdf&lt;/a&gt;74.86 Ko&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/800">Seb</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/665">theming</category>
 <pubDate>Mon, 19 Jul 2010 07:45:26 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">961 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Installer le book Drupal sous Coda</title>
 <link>http://planete.drupalfr.org/node/962</link>
 <description>&lt;p&gt;
Si comme moi vous êtes sur Mac et vous codez sur &lt;a href=&quot;http://www.panic.com/coda/&quot; rel=&quot;nofollow&quot;&gt;Coda&lt;/a&gt;&amp;nbsp;(que je recommande d&#039;ailleurs), alors voici une &lt;strong&gt;petite astuce&lt;/strong&gt; qui vous séduira. Vous l&#039;avez peut-être remarqué, Coda intègre par défaut le book de PHP, il s&#039;agit en fait d&#039;un version hors ligne de la &lt;strong&gt;documentation&lt;/strong&gt;. Tout ça c&#039;est bien pratique mais pour nous, fidèles développeurs de Drupal, on aimerait avoir l&#039;API de celui-ci sous la main...
&lt;/p&gt;
&lt;p&gt;
Et bien voeu exaucé !&amp;nbsp;&lt;img alt=&quot;laugh&quot; rel=&quot;lightbox&quot; src=&quot;http://blog.sebastiencorbin.fr/sites/all/libraries/ckeditor/plugins/smiley/images/teeth_smile.gif&quot; title=&quot;laugh&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
Comment faire ? Petit tutorial :
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
On ouvre Coda si ce n&#039;est déjà fait &amp;gt; Clic sur &lt;em&gt;Books&lt;/em&gt; dans les modes d&#039;affichages
&lt;/li&gt;
&lt;li&gt;
Clic sur &quot;+&quot; en bas à gauche
&lt;/li&gt;
&lt;li&gt;
On remplit de cette manière&amp;nbsp;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Book title: Drupal 6 API&lt;br /&gt;
Book URL:&amp;nbsp;http://drupalcontrib.org/&lt;br /&gt;
Use for Mode: PHP-HTML&lt;br /&gt;
Search URL:&amp;nbsp;http://drupalcontrib.org/api/search/6/*
&lt;/p&gt;
&lt;p&gt;
et pour l&#039;image de couverture &lt;a href=&quot;http://blog.sebastiencorbin.fr/sites/default/files/Drupal Coda Book Icon.png&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;celle-ci est très chouette&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img alt=&quot;&quot; rel=&quot;lightbox&quot; src=&quot;http://blog.sebastiencorbin.fr/sites/default/files/screen1507.png&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
La où ça devient intéressant, c&#039;est que l&#039;on a un raccourci pour tomber directement dessus :&amp;nbsp;&lt;img alt=&quot;Command key icon&quot; height=&quot;9&quot; rel=&quot;lightbox&quot; src=&quot;http://km.support.apple.com/library/APPLE/APPLECARE_ALLGEOS/HT1343/ks_command.gif&quot; width=&quot;9&quot; /&gt;&amp;nbsp;+ double clic. De même, on peut rechercher sur des sites externes qui documentent également les modules tiers, comme&amp;nbsp;&lt;a href=&quot;http://drupalcontrib.org/&quot; rel=&quot;nofollow&quot;&gt;drupalcontrib&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
L&#039;astuce est également possible pour d&#039;autre languages et Frameworks, comme jQuery :
&lt;/p&gt;
&lt;p&gt;
URL:&amp;nbsp;http://docs.jquery.com/Main_Page&lt;br /&gt;
Search URL:&amp;nbsp;http://docs.jquery.com/Special:Search?ns0=1&amp;amp;search=*&amp;amp;go=
&lt;/p&gt;
&lt;p&gt;
N&#039;hésitez pas à rajouter les vôtres en commentaire !&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://blog.raisedeyebrow.com/2009/06/drupal-coda-book/&quot; rel=&quot;nofollow&quot;&gt;&lt;em&gt;Source&lt;/em&gt;&lt;/a&gt;
&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/801">Coda</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/716">Mac</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/800">Seb</category>
 <pubDate>Fri, 16 Jul 2010 08:00:00 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">962 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Injecter son propre code SQL dans Views</title>
 <link>http://planete.drupalfr.org/node/941</link>
 <description>&lt;p&gt;
  Je ne vais pas revenir sur mon amour immodéré pour views, ce n&#039;est plus trop la peine. Views est ce qu&#039;il est et il arrive parfois que le choix de l&#039;utiliser ne se pose pas, il est là, enraciné dans un projet, indéboulonnable sous peine d&#039;exploser les charges. Et à chaque modification un peu conséquente c&#039;est la même histoire, un temps de dingue à trifouiller en tout sens cette interface maudite pour obtenir à grand coup de prévisualisation une requête que j&#039;ai en tête depuis le début. Passé un moment, on se lasse d&#039;une telle gymnastique et je me suis donc mis à chercher, sans grande conviction, un moyen d&#039;injecter mes propres requêtes dans Views. Et la bonne nouvelle est que oui, c&#039;est faisable !
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_4&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Pour quoi faire ?&lt;/h2&gt;
&lt;p&gt;
  Au delà de l&#039;allergie atavique, de nombreuses bonnes raisons peuvent amener à vouloir injecter son propre code SQL. Déjà parce que certains exercices de style deviennent rapidement infaisables avec le générateur de requêtes (imbrications de select, group by complexes, etc.). Ensuite pour gagner du temps, car nombreux sont ceux qui vont tout de même plus vite à écrire du SQL qu&#039;à click-clicker en tout sens. En revanche si certains comptaient par là améliorer les performances de views, qu&#039;ils ne se fassent pas trop d&#039;illusions. La génération de requête n&#039;est pas, et loin de là, le poste le plus dispendieux de l&#039;établissement. La production du markup à travers la jungle de couches passe-plat (styles de vue, style de ligne, etc.) arrive clairement en tête, et les joyeuseries dans la gestion du requêtage (voir le coup du count_query un peu plus loin) ne font que rallonger la sauce.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_5&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Altération de l&#039;objet Query&lt;/h2&gt;
&lt;p&gt;
  Avant d&#039;attaquer l&#039;injection de pur code SQL dans nos vues, nous allons nous arrêter sur une technique plus simple qui peut déjà permettre de dynamiser la requête de manière plus complexe qu&#039;avec l&#039;interface graphique. Le principe de base de cette approche est d&#039;exploiter le hook hook_views_query_alter dont le but est de permettre à un module tiers de modifier l&#039;objet requête ($query, classe Query) d&#039;une vue donnée ($view, classe View) avant que le code SQL ne soit généré. Query est une classe de Views qui représente symboliquement la future requête SQL. Vous y trouverez une série de champs contenant tout ce que vous avez défini dans l&#039;interface graphique (relationships, where, orderby, etc).
&lt;/p&gt;
&lt;p&gt;
  Le mieux est comme pour un hook_form_alter d&#039;utiliser la commande var_dump(...) pour déterminer ce que vous désirez changer dans la structure. A titre d&#039;exemple, nous pourrions ensuite faire ceci :&lt;/p&gt;
&lt;p&gt;    &amp;nbsp;function mon_module_views_query_alter&amp;#40;&amp;amp;$view, &amp;amp;$query&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;if&amp;#40;$view-&amp;gt;name==&amp;quot;ma_vue&amp;quot;&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // A décommenter pour savoir ce que $query contient&lt;br /&gt;
&amp;nbsp; &amp;nbsp; // echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;; var_dump($query); exit(); &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;if &amp;#40;$_SESSION&amp;#91;&#039;tri_par_titre&#039;&amp;#93;&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$query-&amp;gt;orderby &amp;#91;0&amp;#93; = &#039;node_revisions_title DESC&#039;; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;#125; else &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$query-&amp;gt;orderby &amp;#91;0&amp;#93; = &#039;users_name ASC&#039;; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;#125;&lt;br /&gt;
&amp;#125; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;    Modification dynamique de l&amp;#039;objet Query avant génération du code SQL&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;
  Ici nous changions donc la clef de tri en fonction du contenu d&#039;une variable de session. Le premier paramètre  $views contient l&#039;objet &quot;vue&quot; avec sa propriété $view-&amp;gt;name que nous utilisons pour vérifier que l&#039;on modifie bien la bonne vue. Le paramètre $query contient l&#039;objet de classe Query représentant ce que vous avez défini dans l&#039;IHM de Views. Pour info $query est tout simplement le champ $view-&amp;gt;query. L&#039;intérêt de le passer en paramètre m&#039;échappe donc un peu.
&lt;/p&gt;
&lt;p&gt;
Cette technique fonctionne bien, mais reste très liée à la manière dont views formalise les requêtes. Voyons comment descendre un cran plus bas niveau.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_6&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Écrasement de la requête SQL générée par Views&lt;/h2&gt;
&lt;p&gt;
  La méthode la plus simple pour injecter du vrai code SQL dans Views,  est lisible &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/node/409808&quot; rel=&quot;nofollow&quot;&gt;ici&lt;/a&gt; dans la langue de Shakespeare. Le principe est d&#039;exploiter un autre hook de l&#039;API Views, hook_views_pre_execute. Ce hook étant invoqué juste avant l&#039;appel à db_query nous laisse l&#039;opportunité de changer la requête SQL qui a déjà été généré par Views à partir de l&#039;objet Query. Voyons directement un exemple d&#039;implémentation :&lt;/p&gt;
&lt;p&gt;    function mon_module_views_pre_execute&amp;#40;&amp;amp;$view&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;if&amp;#40;$view-&amp;gt;name==&amp;quot;ma_vue&amp;quot;&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Décommenter pour voir à quoi ressemble la requête générée par Views&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// echo &amp;quot;&amp;lt;pre&amp;gt;&amp;quot;; var_dump($view-&amp;gt;build_info[&#039;query&#039;]); exit();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;$view-&amp;gt;build_info&amp;#91;&#039;query&#039;&amp;#93;==&amp;quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node.nid AS nid,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node_revisions.title AS node_revisions_title,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;users.uid AS users_uid,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;users.name AS users_name&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FROM bla bla bla&amp;quot;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;#125;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;    Modification de la requête SQL de views, avant son exécution&lt;/p&gt;
&lt;p&gt;
 La propriété $view-&amp;gt;build_info est un tableau de trois clefs : query pour la requête SQL, count_query pour la même requête &quot;optimisée&quot; (on y reviendra) pour le comptage des éléments, et query_args qui est un tableau d&#039;arguments (penser ici aux paramètres d&#039;une fonction db_query) appliqués aux deux précédentes requêtes.
&lt;/p&gt;
&lt;p&gt;
  Vous n&#039;avez donc plus qu&#039;à écraser la valeur de query comme dans l&#039;exemple donné plus haut.  La seule contrainte est que les champs exposés dans le select aient les mêmes noms que ceux de la requête qu&#039;aurait produit Views. C&#039;est encore plus vrai si vous reprenez un projet existant et que vous n&#039;avez pas envie d&#039;aller trifouiller dans les templates.
&lt;/p&gt;
&lt;p&gt;
 Du coup, un bon point de départ pour notre code SQL nous est fourni par le panneau de prévisulatisation de views. Attention cependant, la requête visible dans ce panneau n&#039;est pas toujours strictement celle qui serait générée par Views (vive la cohérence de cet outil..). La méthode la plus fiable est un petit var_dump($query-&amp;gt;build_info[&#039;query&#039;]) dans le &quot;if&quot; de l&#039;implémentation donnée plus haut.
&lt;/p&gt;
&lt;p&gt;
  Si la requête que vous injectez ne renvoie pas le même nombre d&#039;éléments que celle d&#039;origine, vous devez en injecter une seconde dans $query-&amp;gt;build_info[&#039;count_query&#039;]. C&#039;est en effet à ce genre de détail que l&#039;on constate avec effroi l&#039;efficacité de Views qui effectue systématiquement deux requêtes, même lorsqu&#039;aucune pagination ne justifie ce comptage.
&lt;/p&gt;
&lt;p&gt;
    Mais plus drole encore, lorsque vous construisez cette requête count_query, ne cherchez pas à placer là-dedans un select count(*) from ... car cela ne marcherait pas. En effet, pour une raison qui me dépasse, Views utilise le champ count_query de la manière la plus barbare qui soit, en l&#039;encapsulant dans un select count(*) from (LA_REQUETE_COUNT_QUERY). Super sympa non ? ;-)
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_7&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;En patchant Views&lt;/h2&gt;
&lt;p&gt;
  La méthode précédente fonctionne très bien mais me pose un petit problème. Déjà que Views est aussi lent qu&#039;un facteur suisse, l&#039;obliger à générer une requête que l&#039;on sait pertinemment devoir écraser juste après n&#039;est pas très acceptable.
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;
  Malheureusement il n&#039;existe pas de hook dans l&#039;API de views pour surcharger la génération du code SQL. Il va donc nous falloir tailler dans le vif et patcher. Le meilleur endroit que j&#039;ai trouvé est le fichier includes/view.inc. Ce dernier contient la classe View, et plus particulièrement la méthode build($display_id = NULL) qui fait très exactement ce qui nous intéresse. En effet, à la ligne 649 (de la version 6.x-2.11) se trouve le code responsable de la génération du code SQL. Nous allons donc modifier cette procédure de sorte à permettre à un module tiers de sa propre mouture :&lt;/p&gt;
&lt;p&gt;    // Let modules modify the query just prior to finalizing it.&lt;br /&gt;
foreach &amp;#40;module_implements&amp;#40;&#039;views_query_alter&#039;&amp;#41; as $module&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; $function = $module . &#039;_views_query_alter&#039;;&lt;br /&gt;
&amp;nbsp; $function&amp;#40;$this, $this-&amp;gt;query&amp;#41;;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;// { YB PATCH - Don&#039;t generate queries if it&#039;s already done&lt;br /&gt;
if &amp;#40;empty&amp;#40;$this-&amp;gt;build_info&amp;#91;&#039;query&#039;&amp;#93;&amp;#41;&amp;#41; &amp;#123;&lt;br /&gt;
// } YB PATCH&lt;/p&gt;
&lt;p&gt;$this-&amp;gt;build_info&amp;#91;&#039;query&#039;&amp;#93; = $this-&amp;gt;query-&amp;gt;query&amp;#40;&amp;#41;;&lt;br /&gt;
$this-&amp;gt;build_info&amp;#91;&#039;count_query&#039;&amp;#93; = $this-&amp;gt;query-&amp;gt;query&amp;#40;TRUE&amp;#41;;&lt;br /&gt;
$this-&amp;gt;build_info&amp;#91;&#039;query_args&#039;&amp;#93; = $this-&amp;gt;query-&amp;gt;get_where_args&amp;#40;&amp;#41;;&lt;/p&gt;
&lt;p&gt;// { YB PATCH - Allow a module to generate its own SQL&lt;br /&gt;
&amp;#125; &lt;br /&gt;
// } YB PATCH &amp;nbsp;&lt;/p&gt;
&lt;p&gt;    patch de la classe View&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;
  On a fait plus complexe comme patch, avouez. Le principe est d&#039;exploiter au maximum le hook_views_query_alter que nous avons rencontré plus haut en permettant non plus de modifier l&#039;objet Query, mais de fournir une requête SQL tout prête. Le hack consiste donc  pour Views de vérifier qu&#039;une requête n&#039;a pas déjà été injectée, et lancer sa propre génération le cas échéant. Notez au passage que le module une fois hacké sera plus compliqué à mettre à jour sauf si vous utilisez &lt;a target=&quot;_blank&quot; href=&quot;http://arnumeral.fr/tutoriels/drupal/mettre-a-jour-drupal-simplement&quot; rel=&quot;nofollow&quot;&gt;la technique des patchs&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
  Pour l&#039;implémentation de ce hook, l&#039;approche est strictement la même que pour la technique précédente (Ici aussi vous avez la même contrainte de devoir générer les mêmes champs en nombre et en nommage que ce qu&#039;aurait fait views) a la nuance prés qu&#039;il est cette fois obligatoire de générer aussi le champ count_query. &lt;/p&gt;
&lt;p&gt;    function mon_module_views_query_alter&amp;#40;&amp;amp;$view, &amp;amp;$query&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;if&amp;#40;$view-&amp;gt;name==&amp;quot;ma_vue&amp;quot;&amp;#41; &amp;#123;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; $view-&amp;gt;build_info&amp;#91;&#039;query&#039;&amp;#93;=&amp;quot;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node.nid AS nid,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;node_revisions.title AS node_revisions_title,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;users.uid AS users_uid,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;users.name AS users_name&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FROM bla bla bla&amp;quot;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; $view-&amp;gt;build_info&amp;#91;&#039;count_query&#039;&amp;#93;=&amp;quot;SELECT node.nid AS nid FROM bla bla bla&amp;quot;; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;#125; &lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;    Injection du requête SQL à la place de celle de Views&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;
  Et voilà :) Simple et efficace
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_8&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
   J&#039;espère que cette technique vous sera aussi utile qu&#039;à moi. Si vous n&#039;avez aucune contrainte de performance, vous pouvez vous appuyer sur la méthode douce qui a le mérite de laisser Views intact. Mais dans le cas contraire, le petit hack est un prix bien faible à payer pour retrouver enfin sa liberté.
&lt;/p&gt;
&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/436">Articles</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/215">drupalfr.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/484">planetlibre.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/654">sql</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/125">views</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/483">Yoran</category>
 <pubDate>Thu, 15 Jul 2010 07:50:44 +0000</pubDate>
 <dc:creator>arNuméral</dc:creator>
 <guid isPermaLink="false">941 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Drupal Commons, un réseau social avec Drupal ?</title>
 <link>http://planete.drupalfr.org/node/940</link>
 <description>&lt;p&gt;Annoncé il y a quelques mois par &lt;a href=&quot;http://acquia.com/&quot; rel=&quot;nofollow&quot;&gt;Acquia&lt;/a&gt;, le profil d&#039;installation &lt;strong&gt;&lt;a href=&quot;http://acquia.com/products-services/drupal-commons&quot; rel=&quot;nofollow&quot;&gt;Drupal Commons&lt;/a&gt;&lt;/strong&gt; est actuellement en phase beta avant une sortie prévue à la fin de la semaine prochaine. Précision importante, Drupal Commons tourne sous Drupal 6.&lt;/p&gt;
&lt;p&gt;Rappelons que le principe du profil d&#039;installation est de fournir une distribution Drupal préconfigurée et incluant des modules additionnels pour produire dès l&#039;installation un site plus ou moins achevé, en tout cas très avancé. Il en existe déjà &lt;a href=&quot;http://www.drupalistic.net/doc/distributions&quot; rel=&quot;nofollow&quot;&gt;quelques unes&lt;/a&gt;. Chacune est &quot;spécialisée&quot; dans un type de site précis (à l&#039;exception de &lt;a href=&quot;http://pressflow.org/&quot; rel=&quot;nofollow&quot;&gt;Pressflow&lt;/a&gt; qui est une sorte de clone de Drupal dopé pour encaisser un trafic important).&lt;/p&gt;
&lt;p&gt;Drupal Commons est un profil d&#039;installation orienté &quot;&lt;strong&gt;réseau social&lt;/strong&gt;&quot;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.drupalistic.net/billet/drupal-commons-un-reseau-social-avec-drupal&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;en lire plus&lt;/a&gt;&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/784">commons</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/649">déploiement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/624">Marie-Hélène Wronecki</category>
 <pubDate>Wed, 14 Jul 2010 16:36:04 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">940 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Drupal, Feature, Context, Views, mais pourquoi faire simple ?</title>
 <link>http://planete.drupalfr.org/node/938</link>
 <description>&lt;p&gt;
      La semaine dernière un de mes clients m&#039;a commandé une modification sur son site sous Drupal pour lequel il avait avec un &quot;très léger&quot; souci de maintenance... Ce site étant réalisé par une vraie société maîtrisant les  &quot;best-practice Drupal&quot; (Views et tout le tremblement), j&#039;ai pensé m&#039;en  sortir vitesse grand V... Et pourtant, six heures plus tard j&#039;y suis encore. Tellement abasourdi que j&#039;ai besoin de l&#039;écrire.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_9&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Navigation simplissime&lt;/h2&gt;
&lt;p&gt;
      Le site en question n&#039;a rien de sorcier. Juste une base d&#039;article tout ce qu&#039;il y a de plus standard, et comme seul &quot;exotisme&quot;, un menu principal piloté par une taxonomie arborescente à deux niveaux (rubrique/sous-rubrique). Le principe de navigation est assez simple, un menu principal reflète la taxonomie (menu déroulant donc):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; On clique sur la rubrique, cela donne accès une mini-page d&#039;accueil avec trois articles en avant.&lt;/li&gt;
&lt;li&gt;On clique sur la sous-rubrique, et là on arrive sur la liste des articles comportant le terme de taxonomie correspondant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
      Pour en venir au petit pépin de mon client, le site qu&#039;on lui a livré marche parfaitement à un détail près, impossible d&#039;ajouter une nouvelle rubrique/sous-rubrique. Pour ajouter les termes dans le vocabulaire adéquat, pas de soucis, mais pas de menu non plus. Il a bien essayé de régler le problème, tenté d&#039;ajouter une page à la vue correspondante, tenté de faire le menu à la main, rien à faire. C&#039;est là qu&#039;il m&#039;a refilé le bébé...
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_10&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;La main de la confeature&lt;/h2&gt;
&lt;p&gt;
  Souvent quand j&#039;évoque ma manière de travailler avec Drupal, on me rétorque &quot;Ouhlà, tu fais du code custom, c&#039;est pas standard, faut utiliser des modules, sinon comment-ki-font-les-suivants-pour-maintenir&quot;. J&#039;étais donc positivement curieux de voir comment un site fait par une société &quot;state of art of drupal&quot; était construit. Et je n&#039;ai pas été déçu du voyage même si je ne sais pas encore bien comment je vais faire celui de retour...
&lt;/p&gt;
&lt;p&gt;
  Pour commencer, je me suis pris un usage extensif du module &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/feature&quot; rel=&quot;nofollow&quot;&gt;feature&lt;/a&gt;. Pour être honnête, j&#039;ai une opinion assez mitigée sur ce générateur de module. Mais utilisé comme cela, je lui confère le titre d&#039;hallucinante usine à gaz au fonctionnement proche de l&#039;enregistreur de macro d&#039;une suite bureautique. En fait features me rappelle le gag du développeur fou à qui on demande de corriger une fonction sensée renvoyer la somme de ses deux arguments. La fonction semble fonctionner, mais lorsqu&#039;on lui donne à manger 1 et 1, elle renvoie 3. Le développeur fou ne tarde pas à trouver la solution en retirant fièrement 1 au résultat final...
&lt;/p&gt;
&lt;p&gt;
  Fatures c&#039;est un peu cela. Drupal est in-fichu de proprement gérer un déploiement ? Et bien qu&#039;à cela ne tienne, nous allons créer un générateur de module dans lequel on va injecter du code PHP représentant toute la configuration spécifique pour un site donné (les types de contenu, les champs cck, les vues..). Et comme en standard feature ne connait pas grand chose, on va lui coller &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/features_extra&quot; rel=&quot;nofollow&quot;&gt;features_extra&lt;/a&gt; qui va en plus permettre d&#039;y coller les blocs, les menus et la taxo. Et comme un site drupal c&#039;est loin de se limiter à s&#039;y peu, pour le reste, on se démerde à coup de &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/strongarm&quot; rel=&quot;nofollow&quot;&gt;strongarm&lt;/a&gt; et du code custom... ah ahhhh !! je ne suis donc pas si seul :-)
&lt;/p&gt;
&lt;p&gt;
  Au final on hérite d&#039;une chiée de module qui n&#039;en sont pas vraiment car ils ne s&#039;installent/désinstallent pas normalement, mais uniquement à travers l&#039;interface de features. Ce dernier est alors censé mettre magiquement à jour le site sur lequel les dits modules sont déployés et redéployés. Sauf que c&#039;est un peu de la magie à la Garcimore dès qu&#039;il s&#039;agit de choses un peu complexes comme la suppression d&#039;un champ cck, au hasard...
&lt;/p&gt;
&lt;p&gt;
  Entendons nous bien, je suis parfaitement prêt à entendre l&#039;intérêt de feature dans son concept même d&#039;API exportable. Mais en l&#039;état, le fait que ce ne soit qu&#039;un module contribution et pas une api du coeur de drupal fait que sur une installation standard, 80% des paramétrages ne sont pas couvert (en gros dés que l&#039;on sorte de CCK et Views). Du coup l&#039;outil est trop contraignant pour un résultat bien modeste. De plus, lorsque le module généré est, comme pour ce projet, hacké jusqu&#039;à la trogne, on perd tout l&#039;intérêt de la manoeuvre car toute mise à jour de la feature est vouée à l&#039;échec. Il s&#039;agit donc plus de l&#039;usage du module et de son périmètre qui pose problème, que sont idée de dépard. &lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_11&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Ils m&#039;en ont mis plein la view...&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;
  En conclusion, les &quot;state-of-art-of-drupal&quot;, comme moi, font du code (celui nécessaire pour tout ce que feature ne gère pas). Mais ma réelle découverte, c&#039;est qu&#039;ils font surtout du code pour télécommander des modules... Moi pour faire une liste, je fais une requête SQL, un db_query, un template pour formater le résultat de ma callback, et hop, à Créteil... Eux non. Eux ils utilisent Vieeeewzzzzzz, mais pas comme le pekin lambda, eux ils font du views, dans du code. Des milliers, je dis bien des milliers de ligne de code (4500 pour être exact...) pour paramétrer la génération automatique de vues, de pages associées à ces vues, de feeds, etc, etc, etc... Tout cela innocemment collé dans un hook_default_view_views...
&lt;/p&gt;
&lt;p&gt;
  Alors cela &quot;fonctionne&quot; finalement ? En bien pour commencer, nous avons un module pour faire la synchronisation entre le vocabulaire des rubriques/sous-rubriques : &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/taxonomy_menu&quot; rel=&quot;nofollow&quot;&gt;taxonomy_menu&lt;/a&gt;. Bon, pourquoi pas.&lt;/p&gt;
&lt;p&gt;
  Pour gérer la page &quot;front&quot; et ses 3 articles mis en avant, on ajoute le module &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/nodequeue&quot; rel=&quot;nofollow&quot;&gt;nodequeue&lt;/a&gt; et l&#039;on fabrique une queue par rubrique. Là, la question est &quot;comment fait-on pour associer une queue et une rubrique&quot;. En effet, elle est bonne la question... Car en fait on peut pas. Alors les astucieux ont écrit dans un module custom (encore du code !!) une fonction qui permet d&#039;associer les queues au terme de vocabulaire en passant... par un tableau PHP en dur... Là pour le coup mon pov&#039; client, il ne risquait pas de pouvoir ajouter sa rubrique de si tôt.
&lt;/p&gt;
&lt;p&gt;
  Ensuite, parmi les 4500 lignes de génération de vues, s&#039;en trouve un millier dédié à fabriquer les vues/pages/feeds associés avec chaque rubrique en mettant ainsi la vue en relation avec le nodequeue qui va bien, grâce à la fonction PHP magique.
&lt;/p&gt;
&lt;p&gt;
  Après encore une grosse poignée de centaines lignes pour générer cette fois les vues des sous-rubriques et on est presque arrivé...  Là on se dit qu&#039;on aurait pu en profiter pour associer un menu à chaque page de vue ! Mais non, navigation_menu qui est trop super sympa !
&lt;/p&gt;
&lt;p&gt;
  En comme la vie serait triste si l&#039;on n&#039;utilisait pas &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/context&quot; rel=&quot;nofollow&quot;&gt;context&lt;/a&gt;, on a rajouté quelques centaines de lignes de code supplémentaire pour générer les contextes associés à chaque rubrique et sous-rubriques...
&lt;/p&gt;
&lt;p&gt;
  Résultat des courses, views, nodequeue et context dans une interface graphique à faire fondre les plombs à FireFox (imaginez, une vue, 50 sous-rubriques, 100 onglets tout en ajax ;-). Interface qu&#039;il ne faut absolument pas utiliser puisque tout est généré. Du coup l&#039;intérêt de Views est incertain, mon client ne peux pas les modifiers et le développeur, lui s&#039;empêtre dedans..
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_12&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Ajouter une rubrique, mode d&#039;emploi...&lt;/h2&gt;
&lt;p&gt;
  A ce stade, le client il est sous terre... Car finalement le manuel du &quot;comment ajouter une nouvelle rubrique/sous-rubrique&quot; ressemble à cela :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Aller dans la taxonomie pour créer la rubrique et la première sous-rubrique. Taxonomy menu n&#039;a pas fonctionné, le menu n&#039;est pas créé, c&#039;est normal car la page n&#039;existe pas encore... Le lien en lui même (taxonomy/term/xxx) ne fonctionne pas non plus vu que c&#039;est ce type de chemin qui est utilisé par les pages de views et que du coup il y a conflit sur le routeur (c&#039;est certain, il vaut mieux une vue plutôt que thémé simplement la page de taxonomie).&lt;/li&gt;
&lt;li&gt;Créer un nodequeue...&lt;/li&gt;
&lt;li&gt;Aller dans le code pour le modifier et ainsi associer ce nodequeue à l&#039;intitulé de la taxonomie (pourquoi pas directement le tid ?)&lt;/li&gt;
&lt;li&gt;Aller dans views, sur la vue &quot;frontpage&quot;, cliquer sur &lt;strong&gt;modifier&lt;/strong&gt; puis la &lt;strong&gt;supprimer&lt;/strong&gt;. Si si, car sinon, Views ne réimporte pas proprement les vues par défaut générées plus haut. Au passage, pleurez un peu car évidemment les vues ont été un peu customisées juste ce qu&#039;il faut pour passer 1/2 heure à les régler à nouveau (opération à refaire à chaque ajout de rubrique, youpi...)&lt;/li&gt;
&lt;li&gt;Même motif et même punition pour la vue &quot;sous-rubrique&quot;... Mais heureusement j&#039;ai découvert que je pouvais &lt;strong&gt;revenir&lt;/strong&gt; (aka &lt;strong&gt;supprimer&lt;/strong&gt;...) à partir de la liste des vues, donc firefox est sauvé. Ne pas s&#039;étonner qu&#039;à chaque click sur un lien de views ça mette 10 ans à réagir, car l&#039;implémentation du hook responsable de la génération des vues par défaut est appelé à chaque fois...&lt;/li&gt;
&lt;li&gt;Revenir sur la taxonomie cliquer sur modifier puis directement sauver, et cette fois le menu devrait être créé..&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a name=&#039;chapter_13&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Pour s&#039;en sortir...&lt;/h2&gt;
&lt;p&gt;
  Maintenant je ne sais pas trop ce que je vais faire. Je me doute bien que mon client ne sera pas très ravi avec la procédure que je viens d&#039;énoncer. La première étape va donc consister à dégager feature/strongarm pour y voir plus clair. Puis j&#039;imagine que je vais mettre en œuvre un truc un peu plus simple.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un type de contenu &quot;Rubrique&quot; avec un titre, un corps et une liste de trois nœuds (nodereference). Le principe sera pour le client de créer un nouveau contenu de type &quot;Rubrique&quot; lorsqu&#039;il en aura une à rajouter. J&#039;associe automatiquement ce contenu au menu de premier niveau et avec un &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://api.drupal.org/api/function/hook_nodeapi&quot; rel=&quot;nofollow&quot;&gt;hook_nodeapi&lt;/a&gt; je fabrique synchronise le premier niveau de taxo rubrique. En gros 10 lignes de code. Du coup la rubrique étant un nœud associé à mon premier niveau de menu, je gère la &quot;frontpage&quot; par un simple node template. Emballé. &lt;/li&gt;
&lt;li&gt;Pour les sous-rubriques, je laisse le client ajouter ses termes de taxo et je laisse navigation_menu les associer proprement. Du coup la liste des articles est simplement un template sur la liste standard de drupal des articles possedant un terme donné.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
  Donc en somme, si l&#039;idée fonctionne, une usine à gaz avec 4500 lignes de code Views d&#039;un côté, et un petit module custom disons de 100 lignes, pas de vues, et une pure exploitation des fonctionnalités de base de drupal. Sans aucun doute moins sexy ;-)
&lt;/p&gt;
&lt;p&gt;&lt;a name=&#039;chapter_14&#039; rel=&quot;nofollow&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;
  Il ne faut pas croire que je sois de mauvais esprit ici. j&#039;ai même un certain respect pour la personne qui a servi de référent technique sur ce projet. Mais cette aventure a été instructive à plus d&#039;un titre. Tout d&#039;abord cela me décomplexe lorsqu&#039;on me dit &quot;Bouh, tu fais du code custom, c&#039;est moins facile à maintenir que des modules&quot;. C&#039;est sans aucun doute vrai lorsque le besoin est assez simple pour que les modules utilisés se suffisent à eux-même. Mais pousser la logique modulaire au point de télécommander des modules avec des milliers de lignes de code, c&#039;est aberrant. Aberrant car je suis persuadé que mon équivalent &quot;code simple&quot; est cent fois plus lisible (en tout cas il est 100 fois plus documenté...). Ensuite ces modules ont été pensés pour être utilisés à travers des interfaces graphiques. C&#039;est d&#039;ailleurs souvent dommage car j&#039;aurais préféré, même pour views, que l&#039;API précède l&#039;interface pour que tout le monde soit content. Toujours est il que du coup leur paramétrage ressemble plus à un remplissage de formulaire qu&#039;à l&#039;utilisation d&#039;une API propre. Enfin, purée c&#039;est d&#039;une lenteur tout cela. A chaque click on a l&#039;impression de manipuler un 38 tonnes avec des baquettes de tambour... et chaque &quot;frontpage&quot; de rubrique génère, pour un utilisateur authentifié, pas moins de 786 requêtes SQL !!!!!!!!!!
&lt;/p&gt;
&lt;p&gt;
  En conclusion, ce que j&#039;en retire c&#039;est que context est un module qui mérite que l&#039;on s&#039;y penche mais je lui reproche sa dépendance à ctools absolument inutile et proprement rédhibitoire. Feature est une plaisanterie. Drupal a un problème de déploiement indéniable et même grave à l&#039;heure d&#039;un usage professionnel de l&#039;outil. Feature n&#039;est donc qu&#039;un emplâtre sur une jambe de bois. C&#039;est lourd, peu stable, et surtout ne couvre pas toutes les fonctionnalités obligeant à recourir à du code custom. Autant utiliser &lt;a class=&quot;external&quot; target=&quot;_blank&quot; href=&quot;http://drupal.org/project/backup_migrate&quot; rel=&quot;nofollow&quot;&gt;Backup &amp;amp; Migrate&lt;/a&gt;. Views est un très bon outil pour le cadre d&#039;usage &quot;wordpress&quot; de drupal (non péjoratif, car j&#039;aime beaucoup wordpress), permettant à un utilisateur peu ou moyennement expérimenté de construire son site rapidement. Dans le cadre d&#039;un usage professionnel par des développeurs professionnels, l&#039;utilisation de cet outil comme API ne m&#039;a clairement pas convaincu. C&#039;est bordélique au possible et je crains le pire lors des changements de version (en gros views3 implique tout à la poubelle, comme ce fût le cas pour Views1).
&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/436">Articles</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/122">CCK</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/276">context</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/215">drupalfr.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/591">features</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/484">planetlibre.org</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/125">views</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/483">Yoran</category>
 <pubDate>Sun, 11 Jul 2010 18:20:10 +0000</pubDate>
 <dc:creator>arNuméral</dc:creator>
 <guid isPermaLink="false">938 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Utiliser plusieurs bases de données pour un site Drupal</title>
 <link>http://planete.drupalfr.org/node/929</link>
 <description>&lt;p&gt;On m&amp;#8217;a posé une question intéressante il y a quelques jours, à savoir comment faire pour accéder à une autre base de données que celle sur laquelle est installé Drupal. N&amp;#8217;ayant jamais rencontré cette problématique je me suis penché sur cette question.&lt;/p&gt;
&lt;p&gt;Le principe est simple, il suffit de renseigner les connexions vers les différentes bases de données et de switcher entre elles lorsque vous en avez besoin.&lt;/p&gt;
&lt;p&gt;Par défaut Drupal sait quelle base utiliser grâce aux informations contenues dans le fichier default/settings.php.&lt;/p&gt;
&lt;p&gt;Vous devriez avoir quelque chose qui ressemble à ça :&lt;/p&gt;
&lt;p&gt;$db_url = &#039;mysql://admin:pass@localhost/drupal&#039;;&lt;/p&gt;
&lt;p&gt;Afin de lui permettre d&amp;#8217;utiliser d&amp;#8217;autres bases de données nous allons modifier et ajouter dans ce fichier les informations de connexions nécessaires.&lt;/p&gt;
&lt;p&gt;// Notre connexion par défaut&lt;br /&gt;
$db_url[&#039;default&#039;] = &#039;mysql://admin:pass@localhost/drupal&#039;;&lt;br /&gt;
// Nos nouvelles connexions&lt;br /&gt;
$db_url[&#039;second&#039;] = &#039;mysql://root:pwd@localhost/anotherdb&#039;;&lt;br /&gt;
$db_url[&#039;db3&#039;] = &#039;mysql://user:pwd@localhost/yetanotherdb&#039;;&lt;/p&gt;
&lt;p&gt;Pour utiliser une autre base de données il suffit simplement de l&amp;#8217;activer avec la fonction db_set_active en passant le nom de votre connexion.&lt;/p&gt;
&lt;p&gt;db_set_active(&#039;second&#039;);&lt;/p&gt;
&lt;p&gt;db_query(&#039;SELECT * FROM table_in_anotherdb&#039;);&lt;/p&gt;
&lt;p&gt;//Retour sur la table défaut une fois terminée.&lt;br /&gt;
db_set_active(&#039;default&#039;);&lt;/p&gt;
&lt;p&gt;N&amp;#8217;oubliez pas une fois terminé de revenir sur la base par défaut &lt;img src=&quot;http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt; : Suite à la remarque de &lt;a href=&quot;http://drupal.org/user/27985&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;FGM&lt;/a&gt; il n&amp;#8217;est pas possible d&amp;#8217;inclure dans le fichier settings.php des connexions vers différents types de base de données. C&amp;#8217;est à dire que vous ne pouvez pas avoir une connexion qui utilise le driver Mysql et le driver Pgsql. &lt;/p&gt;
&lt;p&gt;Pour comprendre il faut regarder la fonction db_set_active() dans le fichier includes/databases.inc. C&amp;#8217;est lors de l&amp;#8217;appel à cette fonction qu&amp;#8217;est chargé le driver souhaité. Imaginons que je charge en premier le driver mysql (includes/database.mysql.inc) et ensuite le driver pgsql (includes/database.pgsql.inc). Nous nous retrouvons à ce moment là avec deux fichiers chargés en mémoire contenant les mêmes noms de fonctions. Or il est impossible de redéclarer une fonction sans que cela ne génère une erreur php. &lt;/p&gt;
&lt;p&gt;Comme quoi bloguer permet d&amp;#8217;apprendre. Encore merci à Frédéric !&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/780">Base de données</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/666">Documentations</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/663">Julien</category>
 <pubDate>Wed, 30 Jun 2010 08:03:19 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">929 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Comment créer un profil d’installation</title>
 <link>http://planete.drupalfr.org/node/917</link>
 <description>&lt;p&gt;Plus Drupal mûrit plus on cherche à industrialiser la production de sites. Une des solutions que l&amp;#8217;on propose maintenant courament face à cette demande est l&amp;#8217;utilisation de profils d&amp;#8217;installation.&lt;br /&gt;
Oui, mais comment fait-on pour les créer ?&lt;/p&gt;
&lt;p&gt;C&amp;#8217;est très simple, commençons par reprendre l&amp;#8217;arborescence de Drupal. On passe tellement de temps à travailler dans &lt;em&gt;&lt;strong&gt;/sites/all/modules&lt;/strong&gt;&lt;/em&gt; que l&amp;#8217;on en oublie parfois qu&amp;#8217;il existe d&amp;#8217;autres répertoires où l&amp;#8217;on peut travailler (mais jamais dans &lt;strong&gt;&lt;em&gt;/modules&lt;/em&gt;&lt;/strong&gt; ! Pensez aux chatons).&lt;/p&gt;
&lt;p&gt;A la racine du dossier de Drupal il existe un répertoire &lt;em&gt;&lt;strong&gt;/profiles&lt;/strong&gt;&lt;/em&gt; qui contient à minima un dossier &lt;em&gt;&lt;strong&gt;default&lt;/strong&gt;&lt;/em&gt;. C&amp;#8217;est le profil qui est utilisé à chaque fois que vous faites une installation de base de Drupal 6. Si vous avez la curiosité de regarder le contenu de ce dossier vous allez vous rendre compte qu&amp;#8217;il n&amp;#8217;est pas très volumineux car il ne contient que le fichier &lt;em&gt;&lt;strong&gt;default.profile&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Organisation d&amp;#8217;un profil d&amp;#8217;installation&lt;/h2&gt;
&lt;p&gt;Le profil d&amp;#8217;installation est donc composé comme suit :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;/profiles/monprofil/monprofil.profile&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;/profiles/monprofil/modules&lt;/li&gt;
&lt;li&gt;/profiles/monprofil/themes&lt;/li&gt;
&lt;li&gt;/profiles/monprofil/translations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seul &lt;em&gt;&lt;strong&gt;monprofil.profile&lt;/strong&gt;&lt;/em&gt; est obligatoire, les dossiers supplémentaires modules, themes et translations sont respectivement présents pour permettre l&amp;#8217;utilisation de modules supplémentaires, de thèmes additionnels ou de langue complémentaires.&lt;br /&gt;
L&amp;#8217;intérêt du profil d&amp;#8217;installation est qu&amp;#8217;il est distribuable, c&amp;#8217;est pour cette raison que si vous utilisez des modules autres que ceux du core vous devez les placer au sein d&amp;#8217;un répertoire modules. (Si les modules sont présents dans &lt;em&gt;&lt;strong&gt;/sites/*/modules&lt;/strong&gt;&lt;/em&gt; le code fonctionnera mais en terme le logique il est recommandé de placer ces modules dans &lt;em&gt;&lt;strong&gt;/profiles/monprofil/modules&lt;/strong&gt;&lt;/em&gt;).&lt;br /&gt;
Il en va de même pour les thèmes.&lt;/p&gt;
&lt;h2&gt;Et d&amp;#8217;un point de vue code ?&lt;/h2&gt;
&lt;p&gt;Dans la plus petite version possible d&amp;#8217;un profil d&amp;#8217;installation (identique à &lt;strong&gt;&lt;em&gt;default.profile&lt;/em&gt;&lt;/strong&gt;) il faut à minima déclarer ces fonctions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1) &lt;a href=&quot;http://api.drupal.org/api/function/example_profile_modules/6&quot; rel=&quot;nofollow&quot;&gt;example_profile_modules()&lt;/a&gt; // retourne un tableau des modules à installer&lt;/li&gt;
&lt;li&gt;2) &lt;a href=&quot;http://api.drupal.org/api/function/example_profile_details/6&quot; rel=&quot;nofollow&quot;&gt;example_profile_details()&lt;/a&gt; // retourne un tableau avec les détails du profil avec les deux clés &lt;em&gt;name&lt;/em&gt; et &lt;em&gt;description&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Optionnelles&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3) &lt;a href=&quot;http://api.drupal.org/api/function/example_profile_task_list/6&quot; rel=&quot;nofollow&quot;&gt;example_profile_task_list()&lt;/a&gt; // Etapes intermédiaires du profil&lt;/li&gt;
&lt;li&gt;4) &lt;a href=&quot;http://api.drupal.org/api/function/example_profile_tasks/6&quot; rel=&quot;nofollow&quot;&gt;example_profile_tasks(&amp;#038;$task, $url)&lt;/a&gt; // Execute les dernières taches du profil d&amp;#8217;installation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;example_profile_modules()&lt;/h3&gt;
&lt;p&gt;Cette fonction est généralement utilisée pour activer les modules de core dont vous allez avoir besoin. Pour activer les modules contribs, on a l&amp;#8217;habitude de créer une étape intermédiaire compte tenu du fait qu&amp;#8217;ils dépendent très souvent des modules de core et qu&amp;#8217;ils sont nombreux (on utilisera l&amp;#8217;API de batch afin de ne pas faire tomber le serveur).&lt;/p&gt;
&lt;p&gt;function MONPROFIL_profile_modules&amp;#40;&amp;#41; &amp;#123;&lt;br /&gt;
  return array&amp;#40;&#039;color&#039;, &#039;comment&#039;, &#039;help&#039;, &#039;menu&#039;, &#039;taxonomy&#039;, &#039;dblog&#039;&amp;#41;;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;h3&gt;example_profile_details()&lt;/h3&gt;
&lt;p&gt;Difficile de sélectioner votre profil d&amp;#8217;installation si cette fonction n&amp;#8217;est pas présente car elle indique son petit nom et une description.&lt;/p&gt;
&lt;p&gt;function MONPROFIL_profile_details&amp;#40;&amp;#41; &amp;#123;&lt;br /&gt;
  return array&amp;#40;&lt;br /&gt;
    &#039;name&#039; =&amp;#62; st&amp;#40;&#039;Custom installation profile&#039;&amp;#41;,&lt;br /&gt;
    &#039;description&#039; =&amp;#62; st&amp;#40;&#039;This is my first installation profile&#039;&amp;#41;&lt;br /&gt;
  &amp;#41;;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;Note : Au sein d&amp;#8217;un profil d&amp;#8217;installation il faut utiliser la fonction st() au lieu de t() pour internationaliser vos chaines de caractères. Les fichiers .po doivent se trouver au sein du dossier &lt;em&gt;&lt;strong&gt;/profiles/monprofil/translations&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;example_profile_task_list()&lt;/h3&gt;
&lt;p&gt;Si vous créez des étapes intermédiaires dans votre profil il est intéressant d&amp;#8217;indiquer à votre utilisateur sa progression. Ce sont les états que l&amp;#8217;on retrouve à gauche au cours de l&amp;#8217;installation.&lt;/p&gt;
&lt;p&gt;function openatrium_profile_task_list&amp;#40;&amp;#41; &amp;#123;&lt;br /&gt;
 return array&amp;#40;&lt;br /&gt;
  &#039;intranet-modules-batch&#039; =&amp;#62; st&amp;#40;&#039;Install intranet modules&#039;&amp;#41;,&lt;br /&gt;
  &#039;intranet-configure-batch&#039; =&amp;#62; st&amp;#40;&#039;Configure intranet&#039;&amp;#41;,&lt;br /&gt;
 &amp;#41;;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;h3&gt;example_profile_tasks(&amp;#038;$task,  $url)&lt;/h3&gt;
&lt;p&gt;C&amp;#8217;est &lt;strong&gt;la&lt;/strong&gt; fonction la plus utile du profil d&amp;#8217;installation car c&amp;#8217;est dans cette dernière que l&amp;#8217;on va faire la configuration des modules, la création de types de contenus, la création de nodes, d&amp;#8217;utilisateurs bref c&amp;#8217;est là que l&amp;#8217;on fait réellement ce qui nous intéresse.&lt;br /&gt;
Voici une copie de l&amp;#8217;implémentation de cette fonction dans le profil d&amp;#8217;installation d&amp;#8217;&lt;a href=&quot;http://openatrium.com/&quot; rel=&quot;nofollow&quot;&gt;Open Atrium&lt;/a&gt;, je reviendrai ci-dessous en détails sur les parties importantes.&lt;/p&gt;
&lt;p&gt;function openatrium_profile_tasks&amp;#40;&amp;#38;$task, $url&amp;#41; &amp;#123;&lt;br /&gt;
 global $profile, $install_locale;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 // Just in case some of the future tasks adds some output&lt;br /&gt;
 $output = &#039;&#039;;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 // Download and install translation if needed&lt;br /&gt;
 if &amp;#40;$task == &#039;profile&#039;&amp;#41; &amp;#123;&lt;br /&gt;
 // Rebuild the language list.&lt;br /&gt;
 // When running through the CLI, the static language list will be empty&lt;br /&gt;
 // unless we repopulate it from the ,newly available, database.&lt;br /&gt;
 language_list&amp;#40;&#039;name&#039;, TRUE&amp;#41;;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 // If we reach here, means no language install, move on to the next task&lt;br /&gt;
 $task = &#039;intranet-modules&#039;;&lt;br /&gt;
 &amp;#125;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 // We are running a batch task for this profile so basically do nothing and return page&lt;br /&gt;
 if &amp;#40;in_array&amp;#40;$task, array&amp;#40;&#039;intranet-modules-batch&#039;, &#039;intranet-translation-batch&#039;, &#039;intranet-configure-batch&#039;&amp;#41;&amp;#41;&amp;#41; &amp;#123;&lt;br /&gt;
 include_once &#039;includes/batch.inc&#039;;&lt;br /&gt;
 $output = _batch_page&amp;#40;&amp;#41;;&lt;br /&gt;
 &amp;#125;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 // Run additional configuration tasks&lt;br /&gt;
 // @todo Review all the cache/rebuild options at the end, some of them may not be needed&lt;br /&gt;
 // @todo Review for localization, the time zone cannot be set that way either&lt;br /&gt;
 if &amp;#40;$task == &#039;intranet-configure&#039;&amp;#41; &amp;#123;&lt;br /&gt;
 $batch&amp;#91;&#039;title&#039;&amp;#93; = st&amp;#40;&#039;Configuring @drupal&#039;, array&amp;#40;&#039;@drupal&#039; =&amp;#62; drupal_install_profile_name&amp;#40;&amp;#41;&amp;#41;&amp;#41;;&lt;br /&gt;
 $batch&amp;#91;&#039;operations&#039;&amp;#93;&amp;#91;&amp;#93; = array&amp;#40;&#039;_openatrium_intranet_configure&#039;, array&amp;#40;&amp;#41;&amp;#41;;&lt;br /&gt;
 $batch&amp;#91;&#039;operations&#039;&amp;#93;&amp;#91;&amp;#93; = array&amp;#40;&#039;_openatrium_intranet_configure_check&#039;, array&amp;#40;&amp;#41;&amp;#41;;&lt;br /&gt;
 $batch&amp;#91;&#039;finished&#039;&amp;#93; = &#039;_openatrium_intranet_configure_finished&#039;;&lt;br /&gt;
 variable_set&amp;#40;&#039;install_task&#039;, &#039;intranet-configure-batch&#039;&amp;#41;;&lt;br /&gt;
 batch_set&amp;#40;$batch&amp;#41;;&lt;br /&gt;
 batch_process&amp;#40;$url, $url&amp;#41;;&lt;br /&gt;
 // Jut for cli installs. We&#039;ll never reach here on interactive installs.&lt;br /&gt;
 return;&lt;br /&gt;
 &amp;#125;  &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
 return $output;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;Premier point important, le déroulé des étapes :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;profile&lt;/li&gt;
&lt;li&gt;intranet-modules&lt;/li&gt;
&lt;li&gt;intranet-modules-batch&lt;/li&gt;
&lt;li&gt;intranet-configure&lt;/li&gt;
&lt;li&gt;intranet-configure-batch&lt;/li&gt;
&lt;li&gt;profile-finished&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La première étape d&amp;#8217;un profil d&amp;#8217;installation à partir de laquelle l&amp;#8217;installeur vous donne la main est toujours &amp;laquo;&amp;nbsp;profile&amp;nbsp;&amp;raquo; et vous devez avoir comme dernière étape &amp;laquo;&amp;nbsp;profile-finished&amp;nbsp;&amp;raquo; pour rendre la main à l&amp;#8217;installeur. Vous ne pouvez donc pas intervenir sur ce qui se passe avant et après !&lt;/p&gt;
&lt;p&gt;Votre profil d&amp;#8217;installation va donc passer autant de fois que nécessaire dans la fonction &lt;strong&gt;hook_profile_tasks()&lt;/strong&gt;, les seuls conditions nécessaires pour que la répétition cesse sont :&lt;/p&gt;
&lt;ul class=&quot;checklist&quot;&gt;
&lt;li&gt;Vous donnez la valeur &amp;laquo;&amp;nbsp;profile-finished&amp;nbsp;&amp;raquo; à la variable $task&lt;/li&gt;
&lt;li&gt;Vous ne changez pas la valeur de la variable $task&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour passer d&amp;#8217;une étape à une autre vous devez changer la valeur de $task. Si vous affichez un formulaire ou exécutez une action en batch vous allez devoir utiliser &lt;strong&gt;variable_set(&amp;#8216;install_task&amp;#8217;, &amp;#8216;valeur-tache&amp;#8217;);&lt;/strong&gt; pour stocker l&amp;#8217;étape dans laquelle vous êtes.&lt;/p&gt;
&lt;p&gt;On voit également dans le profil d&amp;#8217;installation d&amp;#8217;Open Atrium comment gérer une opération en batch, c&amp;#8217;est une action en deux étapes, la première consiste à créer le batch, définir la(es) opération(s), la fonction à exécuter à la fin du batch et toutes les variables propres aux batchs (cf &lt;a href=&quot;http://api.drupal.org/api/group/batch/6&quot; rel=&quot;nofollow&quot;&gt;Batch API&lt;/a&gt; pour plus d&amp;#8217;informations) et la seconde lance le traitement du batch&lt;strong&gt; _batch_page();&lt;/strong&gt; . Difficile à inventer si on ne l&amp;#8217;a jamais vu &lt;img src=&quot;http://juliendubois.fr/drupal_blog/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;Je vais terminer avec un snippet pour afficher un formulaire comme étape du profil d&amp;#8217;installation, c&amp;#8217;est là aussi une opération particulière car il faut faire deux choses, il faut d&amp;#8217;abord bloquer la redirection du formulaire avec &lt;strong&gt;$form[&#039;#redirect&#039;] = FALSE;&lt;/strong&gt; et ensuite préciser vers quelle url soumettre le formulaire grâce à &lt;strong&gt;$form[&#039;#action&#039;] = $url;&lt;/strong&gt; (en pensant à passer $url comme paramètre supplémentaire à votre formulaire) pour que votre formulaire permette la poursuite de l&amp;#8217;exécution du profil.&lt;/p&gt;
&lt;p&gt;// Extract of the hook_profile_tasks&lt;br /&gt;
 // Define extra actions if the development environment is enabled&lt;br /&gt;
 if &amp;#40;$task == &#039;development-environment&#039;&amp;#41; &amp;#123;&lt;br /&gt;
  $output = drupal_get_form&amp;#40;&#039;custom_profile_dev_form&#039;, $url&amp;#41;;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
  if &amp;#40;!variable_get&amp;#40;&#039;developement_environment_checked&#039;, false&amp;#41;&amp;#41; &amp;#123;&lt;br /&gt;
   drupal_set_title&amp;#40;st&amp;#40;&#039;Select the environment you want to setup&#039;&amp;#41;&amp;#41;;&lt;br /&gt;
   return $output;&lt;br /&gt;
  &amp;#125;&lt;br /&gt;
  else &amp;#123;&lt;br /&gt;
   $setup_dev_env = variable_get&amp;#40;&#039;setup_dev_env&#039;, FALSE&amp;#41;;&lt;br /&gt;
   variable_del&amp;#40;&#039;developement_environment_checked&#039;&amp;#41;;&lt;br /&gt;
   variable_del&amp;#40;&#039;setup_dev_env&#039;&amp;#41;;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
   // Setup the environment dev if checked&lt;br /&gt;
   if &amp;#40;$setup_dev_env&amp;#41; &amp;#123;&lt;br /&gt;
    $task = &#039;setup-dev-env&#039;;&lt;br /&gt;
   &amp;#125;&lt;br /&gt;
   else &amp;#123;&lt;br /&gt;
    $task = &#039;install-extra-modules&#039;;&lt;br /&gt;
   &amp;#125;&lt;br /&gt;
  &amp;#125;&lt;br /&gt;
 &amp;#125;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
// --&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
// Custom form&lt;br /&gt;
function custom_profile_dev_form&amp;#40;&amp;#38;$form_state, $url&amp;#41; &amp;#123;&lt;br /&gt;
 $form = array&amp;#40;&amp;#41;;&lt;br /&gt;
 $form&amp;#91;&#039;#redirect&#039;&amp;#93; = false;&lt;br /&gt;
 $form&amp;#91;&#039;#action&#039;&amp;#93; = $url;&lt;br /&gt;
 $form&amp;#91;&#039;development_environment&#039;&amp;#93; = array&amp;#40;&lt;br /&gt;
 &#039;#title&#039; =&amp;#62; st&amp;#40;&#039;Enable development environment&#039;&amp;#41;,&lt;br /&gt;
 &#039;#type&#039; =&amp;#62; &#039;radios&#039;,&lt;br /&gt;
 &#039;#options&#039; =&amp;#62; array&amp;#40;&#039;No&#039;, &#039;Yes&#039;&amp;#41;,&lt;br /&gt;
 &#039;#default_value&#039; =&amp;#62; 1,&lt;br /&gt;
 &#039;#required&#039; =&amp;#62; TRUE,&lt;br /&gt;
 &#039;#description&#039; =&amp;#62; st&amp;#40;&#039;This will install modules like Devel and create dummy content.&#039;&amp;#41;,&lt;br /&gt;
 &amp;#41;;&lt;br /&gt;
 $form&amp;#91;&#039;submit&#039;&amp;#93; = array&amp;#40;&lt;br /&gt;
 &#039;#type&#039; =&amp;#62; &#039;submit&#039;,&lt;br /&gt;
 &#039;#value&#039; =&amp;#62; st&amp;#40;&#039;Confirm&#039;&amp;#41;,&lt;br /&gt;
 &amp;#41;;&lt;br /&gt;
 return $form;&lt;br /&gt;
&amp;#125;&lt;/p&gt;
&lt;p&gt;Voilà qui termine un assez long article sur les profils d&amp;#8217;installation, n&amp;#8217;hésitez pas à partager vos astuces et à poser vos questions dans les commentaires.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/766">installation</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/652">Julien Dubois</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/767">productivité</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/768">profil</category>
 <pubDate>Fri, 11 Jun 2010 09:00:31 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">917 at http://planete.drupalfr.org</guid>
</item>
<item>
 <title>Jouez à cache-cache avec Drupal</title>
 <link>http://planete.drupalfr.org/node/923</link>
 <description>&lt;p&gt;&lt;strong&gt;Sommaire&lt;/strong&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#first&quot; rel=&quot;nofollow&quot;&gt;1. Premiers pas avec le caching&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#api&quot; rel=&quot;nofollow&quot;&gt;2. L’API de cache de Drupal&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#miseenplace&quot; rel=&quot;nofollow&quot;&gt;3. Mise en place du cache&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#nettoyage&quot; rel=&quot;nofollow&quot;&gt;4. Nettoyage du cache&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#fraicheur&quot; rel=&quot;nofollow&quot;&gt;5. Fraîcheur de l’information&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://juliendubreuil.fr#tabledediee&quot; rel=&quot;nofollow&quot;&gt;6. Créer une table de cache dédiée&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
Qui n&amp;#8217;a jamais eu besoin d&amp;#8217;améliorer les performances de son site pour booster Drupal?&lt;/p&gt;
&lt;p&gt;Effectivement, lorsque l&amp;#8217;on travaille sur des gros sites il faut se poser des questions sur les performances de Drupal, parce qu&amp;#8217;on le sait tous, Drupal est gourmand. L&amp;#8217;affichage d&amp;#8217;une simple page peut parfois engendrer l&amp;#8217;exécution de 50 voir 150 requêtes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://juliendubreuil.fr/wp-content/uploads/2010/06/462302573_b278d2be0e1.jpg&quot; alt=&quot;&quot; title=&quot;drupal cache&quot; width=&quot;500&quot; height=&quot;255&quot; class=&quot;aligncenter size-full wp-image-892&quot; /&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.flickr.com/photos/dragonspics/462302573/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;©copyright&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Imaginez vous cette même page appelée par plusieurs internautes en même temps. On obtient alors des centaines de requêtes et informations recalculées inutilement qui vont solliciter les serveurs et vont ainsi consommer du CPU et de la RAM alors qu&amp;#8217;elles auraient pu tout aussi bien être sauvegardées.&lt;/p&gt;
&lt;p&gt;Pour sauvegarder ces informations il faut donc mettre en place un système de caching qui va mémoriser pour un temps donné des informations afin de ne pas les recalculer.&lt;/p&gt;
&lt;p&gt;Le caching de page va avoir plusieurs impacts sur notre site :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Baisse du temps de chargement de la page&lt;/li&gt;
&lt;li&gt;Diminution de l&amp;#8217;utilisation des serveurs qui pourront faire autre chose à la place.&lt;/li&gt;
&lt;li&gt;Améliorer votre référencement auprès de Google, puisqu&amp;#8217;il prend maintenant en compte la vitesse de chargement des pages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La solution de caching n&amp;#8217;est pas l&amp;#8217;arme ultime pour améliorer les performances de votre site mais elle permet d&amp;#8217;alléger la charge de travail du serveur et de le rendre plus disponible.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;first&quot; rel=&quot;nofollow&quot;&gt;Premiers pas avec le caching&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;La solution la plus simple à mettre en place est d&amp;#8217;activer le cache de page depuis l&amp;#8217;administration de Drupal [admin/settings/performance]. C&amp;#8217;est un cache simple mais efficace qui mémorise le résultat de la page. Malheureusement cette solution n&amp;#8217;est disponible que pour la naviguation des utilisateurs anonymes, mais n&amp;#8217;ayez crainte il existe belle et bien une solution pour les visiteurs authentifiés &lt;img src=&quot;http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Cette solution consiste à effectuer soi-même la mise en cache et l&amp;#8217;affichage en utilisant l&amp;#8217;Api de Drupal, mais cela implique néanmoins de savoir ce que vous voulez sauvegarder et afficher.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;api&quot; rel=&quot;nofollow&quot;&gt;L&amp;#8217;API de cache de Drupal&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Celle-ci est composée de trois fonctions :&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://api.drupal.org/api/function/cache_set/6&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;cache_set&lt;/a&gt; pour sauvegarder&lt;/p&gt;
&lt;p&gt;cache_set($cid, $data, $table = &amp;#8216;cache&amp;#8217;, $expire = CACHE_PERMANENT, $headers = NULL)&lt;br /&gt;
- $cid : C&amp;#8217;est la clé permettant l&amp;#8217;identification de ce que vous voulez sauvegarder. Celle-ci doit être unique, utilisez quelque chose qui ne pourra pas être créé par un autre module. Le plus simple est de préfixer votre clé avec le nom de votre module.&lt;br /&gt;
- $data : Ce sont les données à sauvegarder, ne vous inquiétez pas du typage et de la structure de vos données celles-ci sont sérialisées lors de l&amp;#8217;enregistrement.&lt;br /&gt;
- $table : Par défaut vous enregistrerez dans la table nommé &amp;#8216;cache&amp;#8217; mais vous pouvez tout aussi bien spécifier une autre table.&lt;br /&gt;
- $expire : Si vous souhaitez rafraîchir les informations stockées en cache vous allez devoir définir une période de validité pour celles-ci.&lt;br /&gt;
- $headers : Cette variable est utile si vous souhaitez passer des informations d&amp;#8217;en-tête HTTP aux pages mises en cache.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://api.drupal.org/api/function/cache_get/6&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;cache_get&lt;/a&gt; pour récupérer les informations&lt;/p&gt;
&lt;p&gt;cache_get($cid, $table = &amp;#8216;cache&amp;#8217;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://api.drupal.org/api/function/cache_clear_all/6&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;cache_clear_all&lt;/a&gt; pour nettoyer ce qui a été enregistré&lt;/p&gt;
&lt;p&gt;cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)&lt;br /&gt;
- $wildcard : Par défaut à False, cette variable peut, si elle est passée à True, sélectionner toutes les occurrences retrouvées commençant par le $cid renseigné.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;miseenplace&quot; rel=&quot;nofollow&quot;&gt;Mise en place du cache&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;function my_module_function() {&lt;br /&gt;
  // Récupération du cache s&#039;il existe&lt;br /&gt;
  $cache = cache_get(&#039;my_module_data&#039;);&lt;br /&gt;
  if (is_object($cache) &amp;#038;&amp;#038; !empty($cache-&amp;gt;data)) {&lt;br /&gt;
    $my_data = $cache-&amp;#62;data;&lt;br /&gt;
  }&lt;br /&gt;
  else {&lt;/p&gt;
&lt;p&gt;    // fonction de génération de votre contenu&lt;/p&gt;
&lt;p&gt;    // Sauvegarde des informations calculées.&lt;br /&gt;
    cache_set(&#039;my_module_data&#039;, $my_data);&lt;br /&gt;
  }&lt;br /&gt;
  return $my_data;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Analysons le code ci-dessus simplifié pour l&amp;#8217;exemple. Dans un premier temps la fonction cache_get() à été utilisée pour savoir si oui ou non, nous avions des données enregistrées a retourner directement à l&amp;#8217;utilisateur. Dans le cas contraire les informations ont été générées puis mise dans la table de cache via la fonction cache_set().&lt;/p&gt;
&lt;p&gt;Dans cette table vous pouvez stocker tout ce que vous voulez, un rendu html ou encore le calcul d&amp;#8217;une lourde opération mais dites vous bien que les informations dans cette table ne sont qu&amp;#8217;éphémères et peuvent à tout moment disparaître.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;nettoyage&quot; rel=&quot;nofollow&quot;&gt;Nettoyage du cache&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Il peut vous arriver de vouloir vider vos données sauvegardées tout simplement pour que celles-ci soient régénérées ou pour faire un export complet de votre base (ne prenez pas les données contenues dans les tables de cache, elle ne font que grossir la taille de votre export sans réel besoin).&lt;/p&gt;
&lt;p&gt;Le nettoyage des caches se fait avec la fonction cache_clear_all() qui permet de supprimer ce qui nous concerne sans toucher au reste.&lt;br /&gt;
Par défaut celle-ci n&amp;#8217;a besoin que d&amp;#8217;une chaîne de texte ($cid) afin de trouver et effacer l&amp;#8217;occurence dans la table de cache, mais si $wildcard est passé à True alors toutes les valeurs commençant par votre $cid seront effacées.&lt;/p&gt;
&lt;p&gt;cache_clear_all(&#039;my_module_data&#039;, &#039;cache&#039;, TRUE);&lt;/p&gt;
&lt;p&gt;Cet exemple supprime toutes les entrées de cache commencant par &amp;#8216;my_module&amp;#8217;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;fraicheur&quot; rel=&quot;nofollow&quot;&gt;Fraîcheur de l&amp;#8217;information&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Par défaut les informations que vous avez sauvegardées en cache sont gardées indéfiniment ou du moins jusqu&amp;#8217;à ce que vous les ayez effacées avec la fonction cache_clear_all. La problématique sur la fraîcheur de données se pose alors car cette méthode n&amp;#8217;est pas viable si vous souhaitez cacher des informations qui doivent être recalculées souvent.&lt;/p&gt;
&lt;p&gt;Pour palier au cache permanent nous allons définir lors de l&amp;#8217;enregistrement une date d&amp;#8217;expiration aux données. Celle-ci sera comparée à la date en cours lors de la récupération afin de voir si les données sont encore valables.&lt;/p&gt;
&lt;p&gt;cache_set(&#039;my_module_data&#039;, $my_data, &#039;cache&#039;, time() + 300);&lt;/p&gt;
&lt;p&gt;La date d&amp;#8217;expiration doit être au format unix timestamp et la façon la plus simple pour définir cette valeur est d&amp;#8217;ajouter une période en seconde au timestamp en cours. Cet exemple défini une validité de 5 minutes (60sec x 5).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;tabledediee&quot; rel=&quot;nofollow&quot;&gt;Créer une table de cache dédiée&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nous venons de voir comment sauvegarder des informations dans la table de cache par défaut de Drupal, mais il est aussi possible de créer votre propre table de cache surtout si vous pensez avoir beaucoup d&amp;#8217;informations à stocker. Ceci évitera d&amp;#8217;avoir une grosse et unique table de cache.&lt;/p&gt;
&lt;p&gt;Voici un petit exemple pour mieux comprendre l&amp;#8217;interêt d&amp;#8217;une table de cache dédiée. Imaginons que j&amp;#8217;ai 200.000 urls raccourcies à mettre en cache. Par défaut cela aurait crée 200.000 nouveaux enregistrements dans la table de cache standard, ce qui aurait eu pour conséquence d&amp;#8217;augmenter le temps d&amp;#8217;exécution des requêtes sur la base de données parce que Mysql aurait été obligé de parcourir tous les enregistrements à chaque fois. En créant notre table dédiée on garde les performances de la table cache et on ne parcourt nos 200.000 valeurs qu&amp;#8217;en cas de besoin.&lt;/p&gt;
&lt;p&gt;Le plus simple à faire pour créer un autre table de cache est de faire une copie de la table standard &amp;#8216;cache&amp;#8217; comme cela on est sûr d&amp;#8217;avoir le même schéma de base de données. Pour cela la récupération du schema original et non modifié de la table &amp;#8216;cache&amp;#8217; sera fait avec la fonction drupal_get_schema_unprocessed($module, $table = NULL).&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt;
* Implementation of hook_schema().&lt;br /&gt;
*/&lt;br /&gt;
function my_module_schema(){&lt;br /&gt;
  $schema = array();&lt;br /&gt;
  $schema[&#039;cache_my_module&#039;] = drupal_get_schema_unprocessed(&#039;system&#039;, &#039;cache&#039;);&lt;br /&gt;
  return $schema;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Par convention nommez votre table &amp;#8216;cache_&amp;#8217; puis le nom de votre module ce qui dans l&amp;#8217;exemple ci dessus donne &amp;#8216;cache_my_module&amp;#8217;.&lt;/p&gt;
&lt;p&gt;Le schema de base de données est prêt, il faut maintenant écrire les fonctions permettant la création et la suppression de celui-ci (hook_install et hook_uninstall) dans le fichier .install du module.&lt;/p&gt;
&lt;p&gt;A ce stade la mise en place de la table de cache dédiée est terminée, il ne reste plus qu&amp;#8217;à activer le module et à vérifier que celle-ci à bien été ajoutée à la base de donnée.&lt;/p&gt;
&lt;p&gt;Pensez aussi à modifier les fonctions drupal_cache_get(), drupal_cache_set() et cache_clear_all() pour qu&amp;#8217;elles pointent vers la bonne table. &lt;img src=&quot;http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;cache_set(&#039;my_module_data&#039;, $my_data, &#039;cache_my_module&#039;);&lt;br /&gt;
cache_get(&#039;my_module_data&#039;, &#039;cache_my_module&#039;);&lt;/p&gt;
&lt;p&gt;Un dernière chose sur le stockage des informations en cache, il est tout à fait possible de les sauvegarder vers un serveur spécialisé type memcached, APC, ou autre.&lt;/p&gt;
&lt;p&gt;Vous voilà maintenant prêt à améliorer votre code. Si vous voulez en lire plus voici la &lt;a href=&quot;http://drupal.org/node/145279&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;présentation officielle de l&amp;#8217;api cache&lt;/a&gt; de Drupal ou sinon le &lt;a href=&quot;http://www.lullabot.com/articles/a-beginners-guide-to-caching-data&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot; rel=&quot;nofollow&quot;&gt;guide&lt;/a&gt; Lullabot sur l&amp;#8217;utilisation de l&amp;#8217;api.&lt;/p&gt;
</description>
 <category domain="http://planete.drupalfr.org/taxonomy/term/100" />
 <category domain="http://planete.drupalfr.org/taxonomy/term/770">Api</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/771">cache</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/161">Développement</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/114">Drupal</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/656">Drupal 6</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/663">Julien</category>
 <category domain="http://planete.drupalfr.org/taxonomy/term/284">Tutoriels</category>
 <pubDate>Tue, 08 Jun 2010 07:00:20 +0000</pubDate>
 <dc:creator>admin</dc:creator>
 <guid isPermaLink="false">923 at http://planete.drupalfr.org</guid>
</item>
</channel>
</rss>
