<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Drupal Blog</title>
	<atom:link href="http://juliendubois.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://juliendubois.fr</link>
	<description>Pérégrinations en terres Drupaliennes</description>
	<lastBuildDate>Mon, 30 Apr 2012 15:40:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Info utile #2 &#8211; Simpletest et le multilinguisme</title>
		<link>http://juliendubois.fr/simpletest-et-le-multilinguisme/</link>
		<comments>http://juliendubois.fr/simpletest-et-le-multilinguisme/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 15:40:53 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=209</guid>
		<description><![CDATA[J&#8217;ai identifié un problème assez ennuyeux il y a quelques jours lorsque j&#8217;essayais de lancer des tests simpletests depuis un module du core, quelque soit le test déclenché, le batch plantait. Après vérification que la résolution du nom de ma VM se faisait bien localement, c&#8217;est la panne sèche, pas d&#8217;idée sur la cause du [...]]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai identifié un problème assez ennuyeux il y a quelques jours lorsque j&#8217;essayais de lancer des tests simpletests depuis un module du core, quelque soit le test déclenché, le batch plantait. Après vérification que la résolution du nom de ma VM se faisait bien localement, c&#8217;est la panne sèche, pas d&#8217;idée sur la cause du problème.</p>
<p>La cause du problème était pourtant sous mes yeux depuis le début, dans la barre d&#8217;adresse, ce petit préfixe qui traîne et qui ne paie pas de mine, en remplaçant le &#8216;fr&#8217; par un &#8216;en&#8217; ou en le supprimant, le problème s&#8217;est résolu.</p>
<p>Pensez-y si le problème vous arrive, la négociation de langue n&#8217;est pas compatible avec simpletest.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/simpletest-et-le-multilinguisme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Info utile #1 &#8211; Les fonctions de validation</title>
		<link>http://juliendubois.fr/info-utile-fonctions-validation/</link>
		<comments>http://juliendubois.fr/info-utile-fonctions-validation/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 08:47:39 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 7]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[handlers]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=198</guid>
		<description><![CDATA[Voilà un billet d&#8217;un style un peu différent, plus court qu&#8217;à l&#8217;habitude, à propos d&#8217;une information bête au sujet des fonctions de validation qui m&#8217;a fait perdre une heure hier et qui aurait pu être évitée. Si vous vous retrouvez dans la situation où vous ajoutez une fonction de validation sur un formulaire mais que [...]]]></description>
			<content:encoded><![CDATA[<p>Voilà un billet d&#8217;un style un peu différent, plus court qu&#8217;à l&#8217;habitude, à propos d&#8217;une information bête au sujet des fonctions de validation qui m&#8217;a fait perdre une heure hier et qui aurait pu être évitée.</p>
<p><a rel="attachment wp-att-199" href="http://juliendubois.fr/info-utile-fonctions-validation/infos/"><img class="aligncenter size-full wp-image-199" title="infos" src="http://juliendubois.fr/wp-content/uploads/2011/08/infos.jpg" alt="" width="630" height="220" /></a><span id="more-198"></span></p>
<p>Si vous vous retrouvez dans la situation où vous ajoutez une fonction de validation sur un formulaire mais que cette fonction n&#8217;est pas exécutée (et que bien sûr vous avez vérifié par trois fois la syntaxe de votre code), prenez le temps de regarder le détail du formulaire.</p>
<p>En fait il faut savoir que lorsque vous cliquez sur un élément de formulaire de type bouton, ses fonctions de validation et d&#8217;exécution sont exécutée et <strong>seulement celles de ce bouton</strong>. Ce qui au final est logique car cela vous permet d&#8217;avoir un comportement différent par bouton sans avoir de risque d&#8217;interférences entre les fonctions de validation / exécution de votre bouton et celles du formulaire global. Le détail des mécanismes de ces fonctions à exécuter se trouve dans la fonction <a href="http://api.drupal.org/api/drupal/includes--form.inc/function/form_execute_handlers/7">form_execute_handlers()</a>.</p>
<p>A noter également qu&#8217;il existe un attribut du Form API qui a été introduit dans Drupal 7 qui permet de limiter les valeurs à contrôler lors de la soumission du formulaire, il s&#8217;agit de l&#8217;attribut <a href="http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/7#limit_validation_errors">#limit_validation_errors</a>. Cet attribut prends un tableau comme valeur avec la liste des entrées du $form_state['values'] qui doivent être validées. Pratique pour contourner un champ obligatoire lorsque l&#8217;on a un bouton qui supprime un noeud par exemple.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/info-utile-fonctions-validation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rules : Ajouter programmatiquement des événements, actions ou conditions</title>
		<link>http://juliendubois.fr/rules-ajouter-programmatiquement-des-evenements-actions-ou-conditions/</link>
		<comments>http://juliendubois.fr/rules-ajouter-programmatiquement-des-evenements-actions-ou-conditions/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 10:00:55 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 6]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[condition]]></category>
		<category><![CDATA[événement]]></category>
		<category><![CDATA[rules]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=163</guid>
		<description><![CDATA[Dans les épisodes précédents vous avez pu lire une première présentation de Rules, module très utile et avec qui vous allez devoir devenir meilleurs amis lorsque vous utiliserez Drupal Commerce. Nous allons donc voir comment exposer vos propres événements, conditions et actions à Rules. Rules est très flexible et offre la possibilité par défaut de [...]]]></description>
			<content:encoded><![CDATA[<p>Dans les épisodes précédents vous avez pu lire une <a href="http://juliendubois.fr/rules-penetrez-dans-le-monde-merveilleux-des-actions-automatisees/">première présentation de Rules</a>, module très utile et avec qui vous allez devoir devenir meilleurs amis lorsque vous utiliserez <a href="http://drupal.org/project/commerce">Drupal Commerce</a>.</p>
<p>Nous allons donc voir comment exposer vos propres événements, conditions et actions à Rules. Rules est très flexible et offre la possibilité par défaut de rajouter les briques dont vous pourriez avoir besoin pour vos développements.</p>
<p><a href="http://juliendubois.fr/wp-content/uploads/2011/03/powerful.jpg"><img class="aligncenter size-full wp-image-177" title="Rules is powerful" src="http://juliendubois.fr/wp-content/uploads/2011/03/powerful.jpg" alt="" width="630" height="220" /></a><span id="more-163"></span></p>
<p>Commençons par les événements qui déclenchent les rules. Nous allons déclencher un événement lorsqu&#8217;un type de contenu précis sera visualisé, nous pourrions le faire avec les composants de base de Rules mais cela permet d&#8217;avoir un exemple assez simple. N&#8217;hésitez pas à <a href="http://drupal.org/node/298476">consulter la documentation</a> rédigée par fago pour rules, elle est assez complète et à jour.</p>
<p>Pour déclarer un événement il suffit d&#8217;implementer le hook <a href="http://library.acquia.com/api/drupal/sites--all--modules--rules--rules--rules.api.php/function/hook_rules_event_info/6">hook_rules_event_info()</a> et de décrire tous vos événements avec leurs paramètres. Exemple :</p>
<div id="wpshdo_1" class="wp-synhighlighter-outer"><div id="wpshdt_1" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_1"></a><a id="wpshat_1" class="wp-synhighlighter-title" href="#codesyntax_1"  onClick="javascript:wpsh_toggleBlock(1)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_1" onClick="javascript:wpsh_code(1)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_1" onClick="javascript:wpsh_print(1)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_1" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="kw2">&lt;?php</span>
<span class="co4">/**
* Implements hook_rules_event_info().
* Déclaration d'un événement basé sur le type du node vu.
*/</span>
<span class="kw2">function</span> monmodule_rules_event_info<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
    <span class="st_h">'nodearticle_is_viewed'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="co1">// Nom de l'événement à invoquer via Rules.</span>
      <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st0">&quot;Un node de type article est entrain d'être vu&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="co1">// Description de la rule.</span>
      <span class="st_h">'module'</span> <span class="sy0">=&gt;</span> <span class="st_h">'Mon Module'</span><span class="sy0">,</span> <span class="co1">// Groupe dans lequel faire apparaitre l'événement (node, utilisateur ou mon module).</span>
      <span class="st_h">'arguments'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span> <span class="co1">// Tableau des paramètres à passer à la fonction.</span>
        <span class="st_h">'article'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'type'</span> <span class="sy0">=&gt;</span> <span class="st_h">'node'</span><span class="sy0">,</span> <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st_h">'Article visualisé.'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="co1">// Ici seulement le node.</span>
      <span class="br0">&#41;</span><span class="sy0">,</span>
    <span class="br0">&#41;</span><span class="sy0">,</span>
  <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span>
<span class="sy1">?&gt;</span></pre></div></div></div>
<p>Pour que l&#8217;implémentation de l&#8217;événement soit complète il ne reste plus qu&#8217;à signaler à rules que l&#8217;événement se produit. Pour cela il suffit d&#8217;appeler la fonction <a href="http://www.drupalcode.com/api/function/rules_invoke_event/contrib-6.x-1.x">rules_invoke_event()</a> au bon moment. Dans notre exemple il suffit de faire cela au sein du hook_nodeapi() si le node est affiché et qu&#8217;il a le type article.</p>
<pre><div id="wpshdo_2" class="wp-synhighlighter-outer"><div id="wpshdt_2" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_2"></a><a id="wpshat_2" class="wp-synhighlighter-title" href="#codesyntax_2"  onClick="javascript:wpsh_toggleBlock(2)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_2" onClick="javascript:wpsh_code(2)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_2" onClick="javascript:wpsh_print(2)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_2" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="co4">/**
* Implements hook_nodeapi().
*/</span>
<span class="kw2">function</span> monmodule_nodeapi<span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$node</span><span class="sy0">,</span> <span class="re0">$op</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$op</span> <span class="sy0">==</span> <span class="st_h">'view'</span> <span class="sy0">&amp;&amp;</span> <span class="re0">$node</span><span class="sy0">-&gt;</span><span class="me1">type</span> <span class="sy0">==</span> <span class="st_h">'article'</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    rules_invoke_event<span class="br0">&#40;</span><span class="st_h">'nodearticle_is_viewed'</span><span class="sy0">,</span> <span class="re0">$node</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Invocation de l'événement.</span>
  <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></pre>
<p>Regardons maintenant comment déclarer de nouvelles conditions, l&#8217;exemple ici consiste à déterminer si le node que nous sommes entrain de visualiser possède un champ CCK précis (de type nodereférence )avec une valeur.</p>
<p>Cette fois ci il faut implémenter le hook <a href="http://library.acquia.com/api/drupal/sites--all--modules--rules--rules--rules.api.php/function/hook_rules_condition_info/6">hook_rules_condition_info()</a> pour arriver à nos fins. Comme d&#8217;habitude un exemple est plus parlant.</p>
<div id="wpshdo_3" class="wp-synhighlighter-outer"><div id="wpshdt_3" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_3"></a><a id="wpshat_3" class="wp-synhighlighter-title" href="#codesyntax_3"  onClick="javascript:wpsh_toggleBlock(3)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_3" onClick="javascript:wpsh_code(3)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_3" onClick="javascript:wpsh_print(3)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_3" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="co4">/**
 * Implements hook_rules_condition_info().
 */</span>
<span class="kw2">function</span> monmodule_rules_condition_info<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
    <span class="st_h">'monmodule_has_nodereference'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
      <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st_h">'Mon node a un node référence.'</span><span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="st_h">'arguments'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
        <span class="st_h">'node'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'type'</span> <span class="sy0">=&gt;</span> <span class="st_h">'node'</span><span class="sy0">,</span> <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st_h">'Node à vérifier'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="st_h">'module'</span> <span class="sy0">=&gt;</span> <span class="st_h">'User'</span><span class="sy0">,</span>
    <span class="br0">&#41;</span><span class="sy0">,</span>
  <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div>
<p>Comme pour la déclaration d&#8217;un événement, les conditions font appel à une fonction de callback, ici <strong>monmodule_has_nodereference</strong>. Dans cette fonction nous allons implémenter concrètement effectuer le test de la condition à évaluer.</p>
<div id="wpshdo_4" class="wp-synhighlighter-outer"><div id="wpshdt_4" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_4"></a><a id="wpshat_4" class="wp-synhighlighter-title" href="#codesyntax_4"  onClick="javascript:wpsh_toggleBlock(4)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_4" onClick="javascript:wpsh_code(4)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_4" onClick="javascript:wpsh_print(4)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_4" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="kw2">function</span> monmodule_has_reference<span class="br0">&#40;</span><span class="re0">$node</span><span class="sy0">,</span> <span class="re0">$settings</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/isset"><span class="kw3">isset</span></a><span class="br0">&#40;</span><span class="re0">$node</span><span class="sy0">-&gt;</span><span class="me1">field_book</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><a href="http://www.php.net/is_null"><span class="kw3">is_null</span></a><span class="br0">&#40;</span><span class="re0">$node</span><span class="sy0">-&gt;</span><span class="me1">field_book</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'nid'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
      <span class="kw1">return</span> <span class="kw4">TRUE</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
  <span class="br0">&#125;</span>
  <span class="kw1">return</span> <span class="kw4">FALSE</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div>
<p>Ici nous évaluons la valeur d&#8217;un éventuel node reference pour le champ field_book mais le nom de ce champ pourrait être exposé dans la configuration de la condition, cette valeur se retrouverait dans le paramètre $settings. Pour voir <a href="http://drupal.org/node/298534">comment configurer les conditions et actions</a>, reportez à la documentation.</p>
<p>Une fois que les événements et conditions sont là, il ne reste qu&#8217;une chose à faire, écrire le code qui va être exécuté une fois notre évènement déclenché et notre condition remplie. Vous l&#8217;avez compris cette fois il faut exposer cette action via le hook <a href="http://library.acquia.com/api/drupal/sites--all--modules--rules--rules--rules.api.php/function/hook_rules_action_info/6">hook_rules_action_info</a>().</p>
<div id="wpshdo_5" class="wp-synhighlighter-outer"><div id="wpshdt_5" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_5"></a><a id="wpshat_5" class="wp-synhighlighter-title" href="#codesyntax_5"  onClick="javascript:wpsh_toggleBlock(5)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_5" onClick="javascript:wpsh_code(5)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_5" onClick="javascript:wpsh_print(5)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_5" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="co4">/**
 * Implements hook_rules_action_info().
 */</span>
<span class="kw2">function</span> monmodule_rules_action_info<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  <span class="kw1">return</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
    <span class="st_h">'monmodule_domyaction'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
      <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st_h">'Effectuer mon traitement'</span><span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="st_h">'arguments'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span>
        <span class="st_h">'node'</span> <span class="sy0">=&gt;</span> <a href="http://www.php.net/array"><span class="kw3">array</span></a><span class="br0">&#40;</span><span class="st_h">'type'</span> <span class="sy0">=&gt;</span> <span class="st_h">'node'</span><span class="sy0">,</span> <span class="st_h">'label'</span> <span class="sy0">=&gt;</span> t<span class="br0">&#40;</span><span class="st_h">'Node exposé'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="br0">&#41;</span><span class="sy0">,</span>
      <span class="st_h">'module'</span> <span class="sy0">=&gt;</span> <span class="st_h">'Mon Module'</span><span class="sy0">,</span>
    <span class="br0">&#41;</span><span class="sy0">,</span>
  <span class="br0">&#41;</span><span class="sy0">;</span>
<span class="br0">&#125;</span></pre></div></div></div>
<p>Et toujours sur le même principe, la fonction de callback que vous avez déclaré est appelée lorsque la rule est déclenchée et satisfait les conditions configurée.</p>
<div id="wpshdo_6" class="wp-synhighlighter-outer"><div id="wpshdt_6" class="wp-synhighlighter-expanded"><table border="0" width="100%"><tr><td align="left" width="80%"><a name="#codesyntax_6"></a><a id="wpshat_6" class="wp-synhighlighter-title" href="#codesyntax_6"  onClick="javascript:wpsh_toggleBlock(6)" title="Click to show/hide code block">Source code</a></td><td align="right"><a href="#codesyntax_6" onClick="javascript:wpsh_code(6)" title="Show code only"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/code.png" /></a>&nbsp;<a href="#codesyntax_6" onClick="javascript:wpsh_print(6)" title="Print code"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/printer.png" /></a>&nbsp;<a href="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/About.html" target="_blank" title="Show plugin information"><img border="0" style="border: 0 none" src="http://juliendubois.fr/wp-content/plugins/wp-synhighlight/themes/default/images/info.gif" /></a>&nbsp;</td></tr></table></div><div id="wpshdi_6" class="wp-synhighlighter-inner" style="display: block;"><div class="php" style="font-family:monospace;"><pre class="de1"><span class="kw2">function</span> monmodule_domyaction<span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$node</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
  drupal_set_message<span class="br0">&#40;</span>t<span class="br0">&#40;</span><span class="st0">&quot;Ce noeud est de type article et possède au moins un node comme node reference dans le champ field_book&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
  <span class="co1">// Effectuer tous les traitements imaginables.</span>
<span class="br0">&#125;</span></pre></div></div></div>
<p>Etendre Rules 1 est donc quelque chose de très simple, tout se passe principalement dans ces trois hooks et grâce à eux vous pouvez étendre les possibilités de Rules à l&#8217;infini. N&#8217;hésitez pas à <a href="http://drupal.org/node/298476">consulter la documentation</a> pour découvrir d&#8217;autres fonctionnalités offertes par Rules.</p>
<p>Rules 2 (Drupal 7)  permet d&#8217;utiliser Rules comme une API de façon beaucoup plus simple,  cette nouvelle version explore très facilement les types d&#8217;entités et si vous installé <a href="http://drupal.org/project/entity">entity metadata</a>, vous pourrez également exploiter la puissance des informations additionnelles mises à disposition (accès à toutes les données d&#8217;un type d&#8217;entity).</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/rules-ajouter-programmatiquement-des-evenements-actions-ou-conditions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rules, pénétrez dans le monde merveilleux des actions automatisées</title>
		<link>http://juliendubois.fr/rules-penetrez-dans-le-monde-merveilleux-des-actions-automatisees/</link>
		<comments>http://juliendubois.fr/rules-penetrez-dans-le-monde-merveilleux-des-actions-automatisees/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 07:00:48 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Drupal 6]]></category>
		<category><![CDATA[Drupal 7]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[condition]]></category>
		<category><![CDATA[événement]]></category>
		<category><![CDATA[rules]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=157</guid>
		<description><![CDATA[Comment faire pour déclencher des actions avancées de façon conditionnelles avec Drupal ? Avec trigger et action les modules de core ? Oui pourquoi pas, mais connaissez-vous Rules ? Rules est un module développé par Wolfgang Ziegler AKA fago et est simplement une pure merveille et ça ne serait pas surprenant qu&#8217;il soit intégré à [...]]]></description>
			<content:encoded><![CDATA[<p>Comment faire pour déclencher des actions avancées de façon conditionnelles avec Drupal ? Avec trigger et action les modules de core ? Oui pourquoi pas, mais connaissez-vous <a title="Page du projet Rules sur drupal.org" href="http://drupal.org/project/rules">Rules</a> ?</p>
<p>Rules est un module développé par Wolfgang Ziegler AKA <a title="Profil de fago sur drupal.org" href="http://drupal.org/user/16747">fago</a> et est simplement une pure merveille et ça ne serait pas surprenant qu&#8217;il soit intégré à core sur Drupal 8 en remplacement de trigger et action. Rules était puissant sous Drupal 6 et l&#8217;est encore plus sous Drupal 7 (enfin là !).</p>
<p><a href="http://juliendubois.fr/wp-content/uploads/2011/01/surprise.jpg"><img class="aligncenter size-full wp-image-180" title="Rules est surprenant" src="http://juliendubois.fr/wp-content/uploads/2011/01/surprise.jpg" alt="" width="630" height="220" /></a><span id="more-157"></span></p>
<p>Ensemble nous allons construire quelques rules simples via l&#8217;interface de Drupal et une action &laquo;&nbsp;custom&nbsp;&raquo; en implémentant les hooks à notre disposition.</p>
<blockquote><p><strong>Définition :</strong> <em>Une </em>rule<em> représente une ou plusieurs actions réalisées lorsqu&#8217;une ou plusieurs conditions sont remplies suite au déclenchement d&#8217;un événement.</em></p></blockquote>
<p>Trois termes clés ressortent ici :</p>
<p><strong>Condition</strong><br />
Une condition peut être le test d&#8217;une valeur d&#8217;un champ CCK, le rôle d&#8217;un utilisateur, le type d&#8217;un node, la valeur de l&#8217;URL, la force de Rules est que chaque module peut étendre les conditions disponibles avec par exemple Organic Groups qui donne la possibilité de tester si l&#8217;utilisateur est membre d&#8217;un groupe.<br />
Les conditions peuvent être multiples et peuvent être groupées et combinées via des opérateurs logique (ET et OU).</p>
<p><strong>Action</strong><br />
Une action est une opération à executer lorsque les conditions listées précédement sont toutes remplies. Charger un noeud, envoyer un email, afficher un message, attribuer un rôle et dépublier un node sont des exemples d&#8217;actions possibles. Les actions pouvant être executées sont elles aussi extensibles par les modules contrib.<br />
Les actions peuvent être multiples.</p>
<p><strong>Evénement</strong><br />
Un événement est une opération qui déclenche l&#8217;évaluation des conditions d&#8217;une rule. Exemples possibles : un node est visualisé, un commentaire est publié, un utilisateur se connecte, etc. Les événements sont eux aussi extensibles par les modules contrib.</p>
<p>Un exemple complet d&#8217;une rule serait donc d&#8217;attribuer le rôle contributeur à un utilisateur lorsqu&#8217;il soumet un node de type article.</p>
<p>La puissance de Rules réside dans le fait que les actions peuvent se combiner et les conditions peuvent s&#8217;additionner pour donner des rules très complexes.</p>
<p>Note : Ceux qui ont déjà travaillé avec Ubercart et les predicats retrouveront des similitudes avec Rules.</p>
<p>Il faut ajouter aux conditions, actions et événements un élément clé supplémentaire, les arguments. Lorsque l&#8217;on veut évaluer une condition sur le rôle de l&#8217;utilisateur, il est nécessaire d&#8217;avoir l&#8217;objet utilisateur à disposition. Lorsque l&#8217;on veut tester le type d&#8217;un node, il fait avoit l&#8217;objet node à disposition. L&#8217;utilisateur ou le node sont donc les arguments utilisés dans l&#8217;évaluation des conditions ou des événements. Les arguments à transmettre dépendent du déclencheur que vous avez configuré pour lancer l&#8217;évaluation d&#8217;une rule. Lorsqu&#8217;une action ou une condition que vous aimeriez utiliser dans votre rule n&#8217;est pas disponible, cela signifie que vous n&#8217;avez pas à disposition l&#8217;argument dont vous avez besoin (exemple : vous voulez tester le type du node alors que vous avez utilisé l&#8217;événement de déclenchement de la rule &laquo;&nbsp;lorsque l&#8217;utilisateur se connecte&nbsp;&raquo;, vous avez à disposition l&#8217;utilisateur alors que vous voulez utiliser le noeud). La solution dans ces cas là est d&#8217;utiliser un rules set.</p>
<p>Le <strong>rules set</strong> est un ensemble de rules à executer. Les rules sets peuvent être utilisés lorsque les actions doivent être programmées dans le temps, exemple : dépublier tous les lundi les articles de la page d&#8217;accueil datant de plus d&#8217;une semaine. Les rules sets ont l&#8217;avantage de pouvoir cumuler les arguments (utilisateur, noeud, taxonomie, etc) et donc d&#8217;élargir les conditions et actions pouvant être executées.</p>
<p>Partie 2 sur les rules implémentées programmatiquement à venir.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/rules-penetrez-dans-le-monde-merveilleux-des-actions-automatisees/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Créer un tri par glisser déposer</title>
		<link>http://juliendubois.fr/creer-un-tri-par-glisser-deposer/</link>
		<comments>http://juliendubois.fr/creer-un-tri-par-glisser-deposer/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 07:30:44 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Drupal 6]]></category>
		<category><![CDATA[Theming]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[sortable]]></category>
		<category><![CDATA[theme]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=147</guid>
		<description><![CDATA[Votre module serait vraiment plus sympa si une liste d&#8217;éléments pouvait être triée via un glisser-déposer, non ? Long et compliqué à implémenter vous dites ? Et bien détromprez-vous, il existe des outils dans le coeur de Drupal pour justement pouvoir facilement implémenter cela, découverte de l&#8217;élément de formulaire de type #weight qui est assez [...]]]></description>
			<content:encoded><![CDATA[<p>Votre module serait vraiment plus sympa si une liste d&#8217;éléments pouvait être triée via un glisser-déposer, non ? Long et compliqué à implémenter vous dites ? Et bien détromprez-vous, il existe des outils dans le coeur de Drupal pour justement pouvoir facilement implémenter cela, découverte de l&#8217;élément de formulaire de type #weight qui est assez méconnu.<span id="more-147"></span></p>
<p>Implémenter une telle fonctionnalité relève de l&#8217;ordre du theming, vous cherchez à afficher un formulaire d&#8217;une façon particulière et les éléments que vous voulez réordonner vont devoir être themés comme un tableau. La fonction qui nous intéresse pour arriver à nos fins s&#8217;appelle <a href="http://api.drupal.org/api/function/drupal_add_tabledrag/6">drupal_add_tabledrag()</a>, elle est appelée au sein d&#8217;une fonction de theming que l&#8217;on applique à l&#8217;élément de formulaire qui englobe vos éléments à réordonner, regardons un peu de code :</p>
<pre lang="php">/**
 * Implements hook_theme().
 */
function module_reorder_text_theme($existing, $type, $theme, $path) {
 return array(
 'MODULE_reorder_text' => array(
 'arguments' => array($form => NULL),
 ),
}
</pre>
<p>Il faut donc dans un premier temps déclarer votre fonction de thème. Cette fonction sera directement appliquée à un élément du formulaire comme suit :</p>
<pre lang="php">function orderable_form($form_state) {
 $form = array();
 $form['#theme'] = 'module_reorder_text';
}
</pre>
<p>Regardons maintenant plus en détails le contenu de la fonction de thème :</p>
<pre lang="php">function theme_module_reorder_text($form) {
 // Titre des colonnes du tableau à trier
 $header = array('', t('Weight'), t('Content'));
 // Ajout du comportement "triable" sur le tableau qui a l'ID "sortable-table"
 // Order signifie que les éléments seront triables voir la documentation pour les autres comportements
 // Sibling : comportement à utiliser sur les éléments du tableau
 // sortable-weight est un nom de classe à utiliser sur les champs qui sont liés dans le tableau
 drupal_add_tabledrag('sortable-table', 'order', 'sibling', 'sortable-weight');
 // $form['items'] est un tableau d'éléments à trier, cet élément de tableau a sa propriété #tree à TRUE.
 foreach ($form['items'] as $key => $value) {
  $value['weight']['#attributes']['class'] = 'upload-weight';
  // Il est nécessaire d'utiliser la fonction drupal_render() pour afficher le champ en HTML
  // Le javascript va remplacer le champ weight par des éléments qui peuvent être glissés / déposés pour réorganiser le tri.
  $row = array('', drupal_render($value['weight']), drupal_render($value['text']));
  $rows[] = array('data' => $row, 'class' => 'draggable');
 }
 $output .= theme('table', $header, $rows, array('id' => 'sortable-table'));
 return $output;
}
</pre>
<p><a href="http://juliendubois.fr/wp-content/uploads/2010/09/sort.jpg"><img src="http://juliendubois.fr/wp-content/uploads/2010/09/sort.jpg" alt="" title="sort" width="782" height="181" class="aligncenter size-full wp-image-152" /></a><br />
Le vrai point important ici consiste à utiliser la fonction drupal_render() pour afficher le contenu des éléments du tableau.<br />
C&#8217;est vraiment grâce à ce genre de petits détails que Drupal devient toujours plus indispensable. Merci Drupal !</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/creer-un-tri-par-glisser-deposer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Ajouter une étape de confirmation à vos formulaires</title>
		<link>http://juliendubois.fr/ajouter-une-etape-de-confirmation-a-vos-formulaires/</link>
		<comments>http://juliendubois.fr/ajouter-une-etape-de-confirmation-a-vos-formulaires/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 11:09:16 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 6]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=140</guid>
		<description><![CDATA[C&#8217;est une petite fonctionnalité dont vous pourriez avoir besoin, voici une présentation du fonctionnement d&#8217;une telle fonctionnalité. A première vue cela peut sembler très facile à implémenter mais au final ça ne l&#8217;est pas tant que ça. Prenons l&#8217;exemple d&#8217;un formulaire qui permet de clore des votes sur des sessions, cette action étant importante nous [...]]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est une petite fonctionnalité dont vous pourriez avoir besoin, voici une présentation du fonctionnement d&#8217;une telle fonctionnalité.<br />
A première vue cela peut sembler très facile à implémenter mais au final ça ne l&#8217;est pas tant que ça.</p>
<p><a href="http://juliendubois.fr/wp-content/uploads/2010/08/confirm1.jpg"><img class="aligncenter size-full wp-image-145" title="confirm" src="http://juliendubois.fr/wp-content/uploads/2010/08/confirm1.jpg" alt="" width="630" height="220" /></a><span id="more-140"></span></p>
<p>Prenons l&#8217;exemple d&#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.</p>
<p>Je simplifie volontairement le formulaire que l&#8217;on créé, résumons le à un simple bouton d&#8217;action :</p>
<pre lang="php"><?php
/**
 * Form to close votes on sessions.
 */
function feature_conference_close_sessions_form(&#038;$form_state) {
 $form['submit'] = array(
 '#type' => 'submit',
 '#value' => t('Clore les votes'),
 );
 return $form;
}
?></pre>
<p>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&#8217;a pas encore été confirmé par l&#8217;utilisateur.</p>
<pre lang="php"><?php
/**
 * Redirect to confirmation form.
 */
function feature_conference_close_sessions_form_submit($form, &#038;$form_state) {
 $form_state['redirect'] = 'sessions/close/confirm';
}
?></pre>
<p>Sachant que nous faisons une redirection vers une entrée de menu, il faut la déclarer via un hook_menu().</p>
<pre lang="php"><?php
/**
 * Implement hook_menu().
 */
function feature_conference_menu() {
 return array(
 'sessions/close/confirm' => array(
 'page callback' => 'drupal_get_form',
 'page arguments' => array('feature_conference_close_sessions_confirm_form'),
 'access callback' => TRUE,
 ),
}
?></pre>
<p>Dans ce formulaire il vous faut utiliser la fonction confirm_form() (http://api.drupal.org/api/function/confirm_form/6) pour obtenir la page de confirmation.</p>
<pre lang="php"><?php
/**
 * Confirmation form before closing sessions.
 */
function feature_conference_close_sessions_confirm_form(&#038;$form_state) {
 $form = array();
 $desc = "Les votes ne seront plus possibles.";
 return confirm_form($form, "Êtes-vous sûr de vouloir clore les votes ?",
 "<front>", $desc);
}
?></pre>
<p>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.</p>
<pre lang="php"><?php
/**
 * Close votes on sessions, send email to rejected contributions' authors
 */
function feature_conference_close_sessions_confirm_form_submit($form, &#038;$form_state) {
 // Set a variable to status closed
 variable_set('feature_conference_status', 'closed');
 drupal_set_message("Les votes sur les sessions sont maintenant clos.");
 drupal_goto('<front>');
}
?></pre>
<p>Et nous voilà avec un formulaire de confirmation fonctionnel. Le cas d&#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&#8217;url de traitement car le fait d&#8217;effectuer une redirection entraine la perte des données soumise par le formulaire principal.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/ajouter-une-etape-de-confirmation-a-vos-formulaires/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exposer des critères supplémentaires à Context</title>
		<link>http://juliendubois.fr/exposer-des-criteres-supplementaires-a-context/</link>
		<comments>http://juliendubois.fr/exposer-des-criteres-supplementaires-a-context/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 06:30:42 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 6]]></category>
		<category><![CDATA[context]]></category>
		<category><![CDATA[development seeds]]></category>
		<category><![CDATA[panels]]></category>
		<category><![CDATA[spaces]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=122</guid>
		<description><![CDATA[Est-il toujours nécessaire de présenter Context, le module de Development Seed (Grands utilisateurs du célèbre triptyque Panels, Context et Spaces utilisé dans la distribution Open Atrium) ? Oui ? Et bien je vais citer Marie-Hélène qui vous le présente sur Drupalistic Context est une manière pratique et relativement rationnelle de configurer l&#8217;affichage des blocs en [...]]]></description>
			<content:encoded><![CDATA[<p>Est-il toujours nécessaire de présenter <a title="Page projet du module Context sur Drupal.org" href="http://drupal.org/project/context">Context</a>, le module de <a href="http://developmentseed.org/">Development Seed</a> (Grands utilisateurs du célèbre triptyque <a title="Page projet du module Panels sur Drupal.org" href="http://drupal.org/project/panels">Panels</a>, <a title="Page projet du module Context sur Drupal.org" href="http://drupal.org/project/context">Context</a> et <a title="Page projet du module Spaces sur Drupal.org" href="http://drupal.org/project/spaces">Spaces</a> utilisé dans la distribution Open Atrium) ? Oui ? Et bien je vais citer Marie-Hélène qui vous le présente sur <a title="Article sur Context" href="http://www.drupalistic.net/module/context">Drupalistic</a><br />
<span id="more-122"></span></p>
<blockquote><p>Context est une manière pratique et relativement rationnelle de  configurer l&#8217;affichage des blocs en fonction de la &laquo;&nbsp;section&nbsp;&raquo; du site sur  laquelle on se trouve.</p>
<p>Un exemple couramment cité est de définir un <em>context </em>blog,  actif lorsque l&#8217;utilisateur visualise un billet de blog, dans lequel  vont apparaître les blocs &laquo;&nbsp;derniers commentaires&nbsp;&raquo;, ou &laquo;&nbsp;derniers  billets&nbsp;&raquo;, par exemple. Cela évite, lorsque l&#8217;on souhaite modifier  l&#8217;aspect d&#8217;une section, de devoir éditer la configuration de chaque bloc  et la modifier à la main, en risquant d&#8217;oublier un paramètre.</p></blockquote>
<p>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 &laquo;&nbsp;Group post&nbsp;&raquo;. Pour cela vous devez implémenter le hook <strong><em>hook_context_conditions()</em></strong> qui permet d&#8217;ajouter des conditions à remplir pour déterminer le contexte.<br />
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 &laquo;&nbsp;group post&nbsp;&raquo;.</p>
<pre lang="php">/**
 * Implements hook_context_conditions().
 */
function group_post_expose_context_conditions() {
 $items = array();
 $groups = array();
 $types = node_get_types();
 // Parcourir la liste des types de contenus pour trouver si des types de contenu
 // sont des "group" (lire des "group post")
 foreach ($types as $type) {
   if (variable_get('og_content_type_usage_' . $type->type, 'omitted') == "group") {
     $groups[$type->type] = $type->name;
   }
 }
 // Si des types de contenu sont des group post
 // Il suffit de les ajouter à l'entrée de formulaire $items
 // Ce champ est utilisé dans context
 if (count($groups) > 0) {
   $items['group_posts'] = array(
     '#title' => t('Group post family'),
     '#description' => t('If the post is displayed as a child of the group (the group is in the url).'),
     '#type' => 'checkboxes',
     '#options' => $groups,
   );
 }
 return $items;
}</pre>
<div id="attachment_123" class="wp-caption aligncenter" style="width: 578px"><a href="http://juliendubois.fr/wp-content/uploads/2010/07/group_post_family.jpg"><img class="size-full wp-image-123" title="group_post_family" src="http://juliendubois.fr/wp-content/uploads/2010/07/group_post_family.jpg" alt="" width="568" height="382" /></a><p class="wp-caption-text">Aperçu des données exposées</p></div>
<p>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 &laquo;&nbsp;concours&nbsp;&raquo; lorsque l&#8217;utilisateur visualise un group post de type &laquo;&nbsp;concours&nbsp;&raquo;.<br />
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.<br />
Voici un snippet dans le contexte de notre exemple :</p>
<pre lang="php">/**
* Implements hook_nodeapi().
*/
function group_post_expose_nodeapi($node, $op) {
  if($node->type == "concours" &#038;&#038; $op == "view") {
    // "group_posts" est le nom du champ définit dans le hook_context_conditions()
    // $node->type représente la valeur à donner à cette condition (ce champ de formulaire) (ici "concours").
    context_set_by_condition('group_posts', $node->type);
  }
}</pre>
<p>Et le tour est joué ! Lorsque nous afficherons un noeud de type concours, notre contexte sera actif, libre à vous de l&#8217;utiliser comme bon vous semble, vous pouvez afficher un bloc supplémentaire, cacher une région etc.</p>
<p>Si vous aussi vous avez des astuces à partager sur Context, n&#8217;hésitez pas à les publier dans les commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/exposer-des-criteres-supplementaires-a-context/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Comment créer un profil d&#8217;installation</title>
		<link>http://juliendubois.fr/creer-un-profil-installation-drupal/</link>
		<comments>http://juliendubois.fr/creer-un-profil-installation-drupal/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 09:00:31 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 6]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[productivité]]></category>
		<category><![CDATA[profil]]></category>

		<guid isPermaLink="false">http://91.121.95.57/?p=69</guid>
		<description><![CDATA[Plus Drupal mûrit plus on cherche à industrialiser la production de sites. Une des solutions que l&#8217;on propose maintenant courament face à cette demande est l&#8217;utilisation de profils d&#8217;installation. Oui, mais comment fait-on pour les créer ? C&#8217;est très simple, commençons par reprendre l&#8217;arborescence de Drupal. On passe tellement de temps à travailler dans /sites/all/modules [...]]]></description>
			<content:encoded><![CDATA[<p>Plus Drupal mûrit plus on cherche à industrialiser la production de sites. Une des solutions que l&#8217;on propose maintenant courament face à cette demande est l&#8217;utilisation de profils d&#8217;installation.<br />
Oui, mais comment fait-on pour les créer ?<span id="more-69"></span></p>
<p>C&#8217;est très simple, commençons par reprendre l&#8217;arborescence de Drupal. On passe tellement de temps à travailler dans <em><strong>/sites/all/modules</strong></em> que l&#8217;on en oublie parfois qu&#8217;il existe d&#8217;autres répertoires où l&#8217;on peut travailler (mais jamais dans <strong><em>/modules</em></strong> ! Pensez aux chatons).</p>
<p>A la racine du dossier de Drupal il existe un répertoire <em><strong>/profiles</strong></em> qui contient à minima un dossier <em><strong>default</strong></em>. C&#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&#8217;il n&#8217;est pas très volumineux car il ne contient que le fichier <em><strong>default.profile</strong></em>.</p>
<h2>Organisation d&#8217;un profil d&#8217;installation</h2>
<p>Le profil d&#8217;installation est donc composé comme suit :</p>
<ul>
<li><strong><span style="color: #000000;">/profiles/monprofil/monprofil.profile</span></strong></li>
<li>/profiles/monprofil/modules</li>
<li>/profiles/monprofil/themes</li>
<li>/profiles/monprofil/translations</li>
</ul>
<p>Seul <em><strong>monprofil.profile</strong></em> est obligatoire, les dossiers supplémentaires modules, themes et translations sont respectivement présents pour permettre l&#8217;utilisation de modules supplémentaires, de thèmes additionnels ou de langue complémentaires.<br />
L&#8217;intérêt du profil d&#8217;installation est qu&#8217;il est distribuable, c&#8217;est pour cette raison que si vous utilisez des modules autres que ceux du core vous devez les placer au sein d&#8217;un répertoire modules. (Si les modules sont présents dans <em><strong>/sites/*/modules</strong></em> le code fonctionnera mais en terme le logique il est recommandé de placer ces modules dans <em><strong>/profiles/monprofil/modules</strong></em>).<br />
Il en va de même pour les thèmes.</p>
<h2>Et d&#8217;un point de vue code ?</h2>
<p>Dans la plus petite version possible d&#8217;un profil d&#8217;installation (identique à <strong><em>default.profile</em></strong>) il faut à minima déclarer ces fonctions :</p>
<ul>
<li>1) <a href="http://api.drupal.org/api/function/example_profile_modules/6">example_profile_modules()</a> // retourne un tableau des modules à installer</li>
<li>2) <a href="http://api.drupal.org/api/function/example_profile_details/6">example_profile_details()</a> // retourne un tableau avec les détails du profil avec les deux clés <em>name</em> et <em>description</em>)</li>
</ul>
<p>Optionnelles</p>
<ul>
<li>3) <a href="http://api.drupal.org/api/function/example_profile_task_list/6">example_profile_task_list()</a> // Etapes intermédiaires du profil</li>
<li>4) <a href="http://api.drupal.org/api/function/example_profile_tasks/6">example_profile_tasks(&#038;$task, $url)</a> // Execute les dernières taches du profil d&#8217;installation</li>
</ul>
<h3>example_profile_modules()</h3>
<p>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&#8217;habitude de créer une étape intermédiaire compte tenu du fait qu&#8217;ils dépendent très souvent des modules de core et qu&#8217;ils sont nombreux (on utilisera l&#8217;API de batch afin de ne pas faire tomber le serveur).</p>
<pre lang="php">function MONPROFIL_profile_modules() {
  return array('color', 'comment', 'help', 'menu', 'taxonomy', 'dblog');
}</pre>
<h3>example_profile_details()</h3>
<p>Difficile de sélectioner votre profil d&#8217;installation si cette fonction n&#8217;est pas présente car elle indique son petit nom et une description.</p>
<pre lang="php">function MONPROFIL_profile_details() {
  return array(
    'name' => st('Custom installation profile'),
    'description' => st('This is my first installation profile')
  );
}</pre>
<p><span style="text-decoration: underline;">Note :</span> Au sein d&#8217;un profil d&#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 <em><strong>/profiles/monprofil/translations</strong></em>.</p>
<h3>example_profile_task_list()</h3>
<p>Si vous créez des étapes intermédiaires dans votre profil il est intéressant d&#8217;indiquer à votre utilisateur sa progression. Ce sont les états que l&#8217;on retrouve à gauche au cours de l&#8217;installation.</p>
<pre lang="php">function openatrium_profile_task_list() {
 return array(
  'intranet-modules-batch' => st('Install intranet modules'),
  'intranet-configure-batch' => st('Configure intranet'),
 );
}</pre>
<h3>example_profile_tasks(&#038;$task,  $url)</h3>
<p>C&#8217;est <strong>la</strong> fonction la plus utile du profil d&#8217;installation car c&#8217;est dans cette dernière que l&#8217;on va faire la configuration des modules, la création de types de contenus, la création de nodes, d&#8217;utilisateurs bref c&#8217;est là que l&#8217;on fait réellement ce qui nous intéresse.<br />
Voici une copie de l&#8217;implémentation de cette fonction dans le profil d&#8217;installation d&#8217;<a href="http://openatrium.com/">Open Atrium</a>, je reviendrai ci-dessous en détails sur les parties importantes.</p>
<pre lang="php">function openatrium_profile_tasks(&#038;$task, $url) {
 global $profile, $install_locale;

 // Just in case some of the future tasks adds some output
 $output = '';

 // Download and install translation if needed
 if ($task == 'profile') {
 // Rebuild the language list.
 // When running through the CLI, the static language list will be empty
 // unless we repopulate it from the ,newly available, database.
 language_list('name', TRUE);

 // If we reach here, means no language install, move on to the next task
 $task = 'intranet-modules';
 }

 // We are running a batch task for this profile so basically do nothing and return page
 if (in_array($task, array('intranet-modules-batch', 'intranet-translation-batch', 'intranet-configure-batch'))) {
 include_once 'includes/batch.inc';
 $output = _batch_page();
 }

 // Run additional configuration tasks
 // @todo Review all the cache/rebuild options at the end, some of them may not be needed
 // @todo Review for localization, the time zone cannot be set that way either
 if ($task == 'intranet-configure') {
 $batch['title'] = st('Configuring @drupal', array('@drupal' => drupal_install_profile_name()));
 $batch['operations'][] = array('_openatrium_intranet_configure', array());
 $batch['operations'][] = array('_openatrium_intranet_configure_check', array());
 $batch['finished'] = '_openatrium_intranet_configure_finished';
 variable_set('install_task', 'intranet-configure-batch');
 batch_set($batch);
 batch_process($url, $url);
 // Jut for cli installs. We'll never reach here on interactive installs.
 return;
 }  

 return $output;
}</pre>
<p>Premier point important, le déroulé des étapes :</p>
<ol>
<li>profile</li>
<li>intranet-modules</li>
<li>intranet-modules-batch</li>
<li>intranet-configure</li>
<li>intranet-configure-batch</li>
<li>profile-finished</li>
</ol>
<p>La première étape d&#8217;un profil d&#8217;installation à partir de laquelle l&#8217;installeur vous donne la main est toujours &laquo;&nbsp;profile&nbsp;&raquo; et vous devez avoir comme dernière étape &laquo;&nbsp;profile-finished&nbsp;&raquo; pour rendre la main à l&#8217;installeur. Vous ne pouvez donc pas intervenir sur ce qui se passe avant et après !</p>
<p>Votre profil d&#8217;installation va donc passer autant de fois que nécessaire dans la fonction <strong>hook_profile_tasks()</strong>, les seuls conditions nécessaires pour que la répétition cesse sont :</p>
<ul class="checklist">
<li>Vous donnez la valeur &laquo;&nbsp;profile-finished&nbsp;&raquo; à la variable $task</li>
<li>Vous ne changez pas la valeur de la variable $task</li>
</ul>
<p>Pour passer d&#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 <strong>variable_set(&#8216;install_task&#8217;, &#8216;valeur-tache&#8217;);</strong> pour stocker l&#8217;étape dans laquelle vous êtes.</p>
<p>On voit également dans le profil d&#8217;installation d&#8217;Open Atrium comment gérer une opération en batch, c&#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 <a href="http://api.drupal.org/api/group/batch/6">Batch API</a> pour plus d&#8217;informations) et la seconde lance le traitement du batch<strong> _batch_page();</strong> . Difficile à inventer si on ne l&#8217;a jamais vu <img src='http://juliendubois.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Je vais terminer avec un snippet pour afficher un formulaire comme étape du profil d&#8217;installation, c&#8217;est là aussi une opération particulière car il faut faire deux choses, il faut d&#8217;abord bloquer la redirection du formulaire avec <strong>$form['#redirect'] = FALSE;</strong> et ensuite préciser vers quelle url soumettre le formulaire grâce à <strong>$form['#action'] = $url;</strong> (en pensant à passer $url comme paramètre supplémentaire à votre formulaire) pour que votre formulaire permette la poursuite de l&#8217;exécution du profil.</p>
<pre lang="php">// Extract of the hook_profile_tasks
 // Define extra actions if the development environment is enabled
 if ($task == 'development-environment') {
  $output = drupal_get_form('custom_profile_dev_form', $url);

  if (!variable_get('developement_environment_checked', false)) {
   drupal_set_title(st('Select the environment you want to setup'));
   return $output;
  }
  else {
   $setup_dev_env = variable_get('setup_dev_env', FALSE);
   variable_del('developement_environment_checked');
   variable_del('setup_dev_env');

   // Setup the environment dev if checked
   if ($setup_dev_env) {
    $task = 'setup-dev-env';
   }
   else {
    $task = 'install-extra-modules';
   }
  }
 }

// --

// Custom form
function custom_profile_dev_form(&#038;$form_state, $url) {
 $form = array();
 $form['#redirect'] = false;
 $form['#action'] = $url;
 $form['development_environment'] = array(
 '#title' => st('Enable development environment'),
 '#type' => 'radios',
 '#options' => array('No', 'Yes'),
 '#default_value' => 1,
 '#required' => TRUE,
 '#description' => st('This will install modules like Devel and create dummy content.'),
 );
 $form['submit'] = array(
 '#type' => 'submit',
 '#value' => st('Confirm'),
 );
 return $form;
}</pre>
<p>Voilà qui termine un assez long article sur les profils d&#8217;installation, n&#8217;hésitez pas à partager vos astuces et à poser vos questions dans les commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/creer-un-profil-installation-drupal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rediriger un utilisateur après avoir créé un noeud</title>
		<link>http://juliendubois.fr/rediriger-un-utilisateur-apres-avoir-cree-un-noeud/</link>
		<comments>http://juliendubois.fr/rediriger-un-utilisateur-apres-avoir-cree-un-noeud/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 23:04:21 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal 6]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=94</guid>
		<description><![CDATA[Super ! Le nouvel article que l&#8217;on veut publier avec un sondage lié est maintenant terminé, avant de le mettre en ligne il ne reste plus qu&#8217;à créer ce sondage. Purée qu&#8217;est ce que c&#8217;est coûteux en clics de devoir systématiquement créer l&#8217;article et ensuite devoir cliquer partout pour aller sur la page de création [...]]]></description>
			<content:encoded><![CDATA[<p>Super ! Le nouvel article que l&#8217;on veut publier avec un sondage lié est maintenant terminé, avant de le mettre en ligne il ne reste plus qu&#8217;à créer ce sondage. Purée qu&#8217;est ce que c&#8217;est coûteux en clics de devoir systématiquement créer l&#8217;article et ensuite devoir cliquer partout pour aller sur la page de création de sondages&#8230; J&#8217;aimerais bien que mon équipe de production fasse en sorte que je sois redirigé directement vers la création de sondage après avoir créé mes articles.</p>
<p>Vos désirs sont des ordres ! Petit tour de magie très simple pour accomplir une telle action.</p>
<p><a href="http://juliendubois.fr/wp-content/uploads/2010/06/direction.jpg"><img class="aligncenter size-full wp-image-96" title="Quelle direction ?" src="http://juliendubois.fr/wp-content/uploads/2010/06/direction.jpg" alt="" width="630" height="211" /></a></p>
<p><span id="more-94"></span>Dans un premier temps il nous faut ajouter une fonction de traitement à exécuter lorsque le formulaire de création de node est soumis.</p>
<pre lang="php">/**
 * Implementation of hook_form_alter().
 * Ajouter une fonction qui redirige l'utilisateur automatiquement
 * vers le formulaire de création de contenu d'un autre type mon utilisateur
 */
function MONMODULE_form_alter(&#038;$form, &#038;$form_state, $form_id) {
 // Ajouter notre fonction si le formulaire est un formulaire
 // de création de noeud et si le type de contenu créé est un article
 if ($form["#id"] == 'node-form' &#038;&#038; $form["type"]["#value"] == "story") {
  $form["#submit"][] = 'MONMODULE_create_submit';
 }
}</pre>
<p>Notre fonction est déclarée auprès du formulaire de création de noeud, il ne reste plus qu&#8217;à implémenter cette fonction qui va faire la redirection.</p>
<pre lang="php">/**
 *  Rediriger vers le formulaire de création de sondages
 */
function MONMODULE_create_submit($form, &#038;$form_state) {
 $_REQUEST['destination'] = 'node/add/webform';
}</pre>
<p>Et le tour est joué ! C&#8217;est aussi simple que ça.<br />
Un peu d&#8217;explications, pour faire une redirection depuis un formulaire il existe plusieurs méthodes.</p>
<h3>drupal_goto()</h3>
<p>Cette fonction permet de faire des redirections depuis Drupal vers des URLs internes ou externes en passant une série de paramètres. Le seul détail qui fâche c&#8217;est que drupal_goto() stoppe complètement l&#8217;exécution  du script en effectuant la redirection. Si un traitement devait se faire après l&#8217;exécution de votre fonction vous pouvez faire une croix dessus.</p>
<h3>$form['#redirect']</h3>
<p>Cette méthode permet d&#8217;ajouter une redirection après le traitement du formulaire, cette technique peut être utilisée à la création du formulaire ou depuis un hook_form_alter(). Si vous ne pouvez travailler que dans une fonction supplémentaire au moment de la soumission du formulaire cette technique ne peut être employée. Si la fonction de soumission du formulaire exécutée par defaut définie une autre valeur pour $form['#redirect'] votre valeur sera ecrasée.</p>
<h3>$form_state['redirect']</h3>
<p>Cette fois, si vous ne pouvez travailler que dans une fonction supplémentaire à la soumission du formulaire cette technique fonctionne, vous écrasez la valeur définie dans $form['#redirect'] pour renvoyer l&#8217;utilisateur là où vous l&#8217;avez décidé à la fin du traitement de votre fonction. Cette technique ne fonctionne en revanche pas lorsque le formulaire que vous modifiez est le formulaire de création de noeud.</p>
<h3>$_REQUEST['destination']</h3>
<p>Pourquoi devoir employer cette méthode ? Il faut savoir qu&#8217;à la création d&#8217;un noeud la dernière fonction appelée est toujours node_form_submit(). Cette fonction fixe la valeur de $form_state['redirect'] à node/NID pour rediriger l&#8217;utilisateur vers le noeud qui vient d&#8217;être créé. La seule façon propre de détourner cette action est donc de recourir à $_REQUEST qui est l&#8217;unique option de passer outre les valeurs définies dans $form et $form_state.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/rediriger-un-utilisateur-apres-avoir-cree-un-noeud/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Créer des templates (fichier.tpl.php) pour themer vos modules</title>
		<link>http://juliendubois.fr/creer-des-templates-fichier-tpl-php-pour-themer-vos-modules/</link>
		<comments>http://juliendubois.fr/creer-des-templates-fichier-tpl-php-pour-themer-vos-modules/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 09:10:56 +0000</pubDate>
		<dc:creator>Julien Dubois</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Theming]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[theme]]></category>

		<guid isPermaLink="false">http://juliendubois.fr/?p=63</guid>
		<description><![CDATA[Lors de la création de vos modules vous pouvez être amenés à mettre en forme votre contenu pour garder une approche cohérence avec la dissociation fond / forme. Il est donc nécessaire de donner la possibilité au themer de pouvoir modifier la mise en forme du contenu que vous aller afficher. Afin de rendre une [...]]]></description>
			<content:encoded><![CDATA[<p>Lors de la création de vos modules vous pouvez être amenés à mettre en forme votre contenu pour garder une approche cohérence avec la dissociation fond / forme. Il est donc nécessaire de donner la possibilité au themer de pouvoir modifier la mise en forme du contenu que vous aller afficher.<br />
Afin de rendre une telle action possible, vous allez devoir déclarer au sein de votre module un hook_theme, qui va déclarer les éléments qui pourront être themés via vos templates.<span id="more-63"></span><br />
Le <strong>hook_theme</strong> est simplement constitué d&#8217;un tableau d&#8217;éléments skinnables avec pour chaque entrée une clé &laquo;&nbsp;template&nbsp;&raquo; qui correspond au nom du fichier .tpl.php utilisé pour le theme et une clé &laquo;&nbsp;arguments&nbsp;&raquo; correspondant à un tableau de paramètres à passer à la fonction de theme().</p>
<pre lang="php">function hook_theme() {
  return array(
    'my_themeable_call' => array(
      'template' => 'gabarit.tpl.php',
      'arguments' => array("param1" => NULL),
    ),
  );
}</pre>
<p><strong>A noter :</strong> Le &laquo;&nbsp;.tpl.php&nbsp;&raquo; est facultatif car toujours suggéré par le moteur de template et il est recommandé d&#8217;utiliser le même nom comme clé et comme nom de fichier pour le template. (Les noms sont ici différents pour vous permettre de décortiquer la mécanique). <em>[Merci Cyril pour la remarque]</em></p>
<p>Voilà votre fonction de thème déclarée, il ne reste plus qu&#8217;à l&#8217;utiliser.<br />
Prenons l&#8217;exemple d&#8217;un bloc, vous souhaitez utiliser votre fonction de thème dans son contenu, il vous suffit d&#8217;utiliser dans le contenu du bloc (cf <a title="Document drupal 6 hook block" href="http://api.drupal.org/api/function/hook_block/6">hook_block</a>) votre fonction de theme : <strong>$bloc['content'] = theme(&#8216;my_themeable_call&#8217;, $param1);</strong><br />
De cette façon vous enverrez à votre fichier de template la variable <strong>$param1</strong> (pouvant contenir tout type de données). Si vous omettez de passer un argument, la valeur par défaut déclarée dans le <strong>hook_theme</strong> sera utilisée (dans notre exemple si j&#8217;omets <strong>$param1</strong>, sa valeur sera <em>NULL</em>).</p>
<p>Plaçons-nous maintenant dans notre fichier de template <strong>gabarit.tpl.php,</strong> c&#8217;est le fichier que votre themer pourra surcharger en le copiant collant dans le dossier de son thème.<br />
Les variables à disposition sont celles que vous avez passé en paramètres lors de l&#8217;appel de la fonction de thème (ici <strong>$param1</strong>) et les éventuelles variables ajoutées par les fonctions de <em>preprocess</em>. (La signature de la fonction est <strong>template_preprocess_my_themeable_call</strong>, surchargeable par <strong>THEME_preprocess_my_themeable_call</strong>).</p>
<p>De cette façon vous pouvez donc créer vos propres fichiers de theming lors de la publication de vos modules afin de vous faire adorer par les themers !</p>
<p><img class="aligncenter size-full wp-image-67" title="tag" src="http://juliendubois.fr/wp-content/uploads/2010/01/tag.jpg" alt="tag" width="600" height="188" /></p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubois.fr/creer-des-templates-fichier-tpl-php-pour-themer-vos-modules/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

