<?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>Julien Dubreuil</title>
	<atom:link href="http://juliendubreuil.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://juliendubreuil.fr</link>
	<description>Julien Dubreuil - Développeur Drupal - Blog d&#039;un passionné, un peu touche à tout, dans le monde du web.</description>
	<lastBuildDate>Wed, 28 Jul 2010 10:27:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utiliser plusieurs bases de données pour un site Drupal</title>
		<link>http://juliendubreuil.fr/drupal/utiliser-plusieurs-bases-de-donnees-pour-un-site-drupal</link>
		<comments>http://juliendubreuil.fr/drupal/utiliser-plusieurs-bases-de-donnees-pour-un-site-drupal#comments</comments>
		<pubDate>Wed, 30 Jun 2010 08:03:19 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Documentations]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Base de données]]></category>
		<category><![CDATA[Drupal 6]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=914</guid>
		<description><![CDATA[On m&#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&#8217;ayant jamais rencontré cette problématique je me suis penché sur cette question.
Le principe est simple, il suffit de renseigner les connexions vers les différentes bases [...]]]></description>
			<content:encoded><![CDATA[<p>On m&#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&#8217;ayant jamais rencontré cette problématique je me suis penché sur cette question.</p>
<p>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.</p>
<p>Par défaut Drupal sait quelle base utiliser grâce aux informations contenues dans le fichier default/settings.php.<br />
<span id="more-914"></span><br />
Vous devriez avoir quelque chose qui ressemble à ça :</p>
<pre class="brush: php;">
$db_url = 'mysql://admin:pass@localhost/drupal';
</pre>
<p>Afin de lui permettre d&#8217;utiliser d&#8217;autres bases de données nous allons modifier et ajouter dans ce fichier les informations de connexions nécessaires.</p>
<pre class="brush: php;">
// Notre connexion par défaut
$db_url['default'] = 'mysql://admin:pass@localhost/drupal';
// Nos nouvelles connexions
$db_url['second'] = 'mysql://root:pwd@localhost/anotherdb';
$db_url['db3'] = 'mysql://user:pwd@localhost/yetanotherdb';
</pre>
<p>Pour utiliser une autre base de données il suffit simplement de l&#8217;activer avec la fonction db_set_active en passant le nom de votre connexion.</p>
<pre class="brush: php;">
db_set_active('second');

db_query('SELECT * FROM table_in_anotherdb');

//Retour sur la table défaut une fois terminée.
db_set_active('default');
</pre>
<p>N&#8217;oubliez pas une fois terminé de revenir sur la base par défaut <img src='http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Edit</strong> : Suite à la remarque de <a href="http://drupal.org/user/27985" rel="nofollow" target="_blank" >FGM</a> il n&#8217;est pas possible d&#8217;inclure dans le fichier settings.php des connexions vers différents types de base de données. C&#8217;est à dire que vous ne pouvez pas avoir une connexion qui utilise le driver Mysql et le driver Pgsql. </p>
<p>Pour comprendre il faut regarder la fonction db_set_active() dans le fichier includes/databases.inc. C&#8217;est lors de l&#8217;appel à cette fonction qu&#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. </p>
<p>Comme quoi bloguer permet d&#8217;apprendre. Encore merci à Frédéric !</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/utiliser-plusieurs-bases-de-donnees-pour-un-site-drupal/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Jouez à cache-cache avec Drupal</title>
		<link>http://juliendubreuil.fr/drupal/jouez-a-cache-cache-avec-drupal</link>
		<comments>http://juliendubreuil.fr/drupal/jouez-a-cache-cache-avec-drupal#comments</comments>
		<pubDate>Tue, 08 Jun 2010 07:00:20 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Api]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Drupal 6]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=848</guid>
		<description><![CDATA[Sommaire
1. Premiers pas avec le caching
2. L’API de cache de Drupal
3. Mise en place du cache
4. Nettoyage du cache
5. Fraîcheur de l’information
6. Créer une table de cache dédiée

Qui n&#8217;a jamais eu besoin d&#8217;améliorer les performances de son site pour booster Drupal?
Effectivement, lorsque l&#8217;on travaille sur des gros sites il faut se poser des questions sur [...]]]></description>
			<content:encoded><![CDATA[<div style=" margin: 10px; padding: 10px; float: left; width: 170px; font-size: 12px; color: #1e6e98;"><strong>Sommaire</strong><br />
<a href="#first">1. Premiers pas avec le caching</a><br />
<a href="#api">2. L’API de cache de Drupal</a><br />
<a href="#miseenplace">3. Mise en place du cache</a><br />
<a href="#nettoyage">4. Nettoyage du cache</a><br />
<a href="#fraicheur">5. Fraîcheur de l’information</a><br />
<a href="#tabledediee">6. Créer une table de cache dédiée</a></div>
<p><span></span><br />
Qui n&#8217;a jamais eu besoin d&#8217;améliorer les performances de son site pour booster Drupal?</p>
<p>Effectivement, lorsque l&#8217;on travaille sur des gros sites il faut se poser des questions sur les performances de Drupal, parce qu&#8217;on le sait tous, Drupal est gourmand. L&#8217;affichage d&#8217;une simple page peut parfois engendrer l&#8217;exécution de 50 voir 150 requêtes.</p>
<p style="text-align: center;"><img src="http://juliendubreuil.fr/wp-content/uploads/2010/06/462302573_b278d2be0e1.jpg" alt="" title="drupal cache" width="500" height="255" class="aligncenter size-full wp-image-892" /><br />
<a href="http://www.flickr.com/photos/dragonspics/462302573/" rel="nofollow" target="_blank" style="font-size:9px; color: grey;">©copyright</a></p>
<p>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&#8217;elles auraient pu tout aussi bien être sauvegardées.</p>
<p>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.<br />
<span id="more-848"></span><br />
Le caching de page va avoir plusieurs impacts sur notre site :</p>
<ul>
<li>Baisse du temps de chargement de la page</li>
<li>Diminution de l&#8217;utilisation des serveurs qui pourront faire autre chose à la place.</li>
<li>Améliorer votre référencement auprès de Google, puisqu&#8217;il prend maintenant en compte la vitesse de chargement des pages.</li>
</ul>
<p>La solution de caching n&#8217;est pas l&#8217;arme ultime pour améliorer les performances de votre site mais elle permet d&#8217;alléger la charge de travail du serveur et de le rendre plus disponible.</p>
<p><span></span></p>
<h2><a name="first">Premiers pas avec le caching</a></h2>
<p>La solution la plus simple à mettre en place est d&#8217;activer le cache de page depuis l&#8217;administration de Drupal [admin/settings/performance]. C&#8217;est un cache simple mais efficace qui mémorise le résultat de la page. Malheureusement cette solution n&#8217;est disponible que pour la naviguation des utilisateurs anonymes, mais n&#8217;ayez crainte il existe belle et bien une solution pour les visiteurs authentifiés <img src='http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Cette solution consiste à effectuer soi-même la mise en cache et l&#8217;affichage en utilisant l&#8217;Api de Drupal, mais cela implique néanmoins de savoir ce que vous voulez sauvegarder et afficher.</p>
<p><span> </span></p>
<h2><a name="api">L&#8217;API de cache de Drupal</a></h2>
<p>Celle-ci est composée de trois fonctions :</p>
<h4><a href="http://api.drupal.org/api/function/cache_set/6" rel="nofollow" target="_blank">cache_set</a> pour sauvegarder</h4>
<p>cache_set($cid, $data, $table = &#8216;cache&#8217;, $expire = CACHE_PERMANENT, $headers = NULL)<br />
<span style="color:#7F7F7F;">- $cid : C&#8217;est la clé permettant l&#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.<br />
- $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&#8217;enregistrement.<br />
- $table : Par défaut vous enregistrerez dans la table nommé &#8216;cache&#8217; mais vous pouvez tout aussi bien spécifier une autre table.<br />
- $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.<br />
- $headers : Cette variable est utile si vous souhaitez passer des informations d&#8217;en-tête HTTP aux pages mises en cache.</span></p>
<h4><a href="http://api.drupal.org/api/function/cache_get/6" rel="nofollow" target="_blank">cache_get</a> pour récupérer les informations</h4>
<p>cache_get($cid, $table = &#8216;cache&#8217;)</p>
<h4><a href="http://api.drupal.org/api/function/cache_clear_all/6" rel="nofollow" target="_blank">cache_clear_all</a> pour nettoyer ce qui a été enregistré</h4>
<p>cache_clear_all($cid = NULL, $table = NULL, $wildcard = FALSE)<br />
<span style="color:#7F7F7F;">- $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é.</span></p>
<p><span> </span></p>
<h2><a name="miseenplace">Mise en place du cache</a></h2>
<pre class="brush: php;">
function my_module_function() {
  // Récupération du cache s'il existe
  if (($cache = cache_get('my_module_data')) &amp;&amp; !empty($cache-&gt;data)) {
    $my_data = $cache-&gt;data;
  }
  else {
    // fonction de génération de votre contenu

    // Sauvegarde des informations calculées.
    cache_set('my_module_data', $my_data);
  }
  return $my_data;
}</pre>
<p>Analysons le code ci-dessus simplifié pour l&#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&#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().</p>
<p>Dans cette table vous pouvez stocker tout ce que vous voulez, un rendu html ou encore le calcul d&#8217;une lourde opération mais dites vous bien que les informations dans cette table ne sont qu&#8217;éphémères et peuvent à tout moment disparaître.</p>
<p><span> </span></p>
<h2><a name="nettoyage">Nettoyage du cache</a></h2>
<p>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).</p>
<p>Le nettoyage des caches se fait avec la fonction cache_clear_all() qui permet de supprimer ce qui nous concerne sans toucher au reste.<br />
Par défaut celle-ci n&#8217;a besoin que d&#8217;une chaîne de texte ($cid) afin de trouver et effacer l&#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.</p>
<pre class="brush: php;">cache_clear_all('my_module_data', 'cache', TRUE);</pre>
<p>Cet exemple supprime toutes les entrées de cache commencant par &#8216;my_module&#8217;.</p>
<p><span> </span></p>
<h2><a name="fraicheur">Fraîcheur de l&#8217;information</a></h2>
<p>Par défaut les informations que vous avez sauvegardées en cache sont gardées indéfiniment ou du moins jusqu&#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&#8217;est pas viable si vous souhaitez cacher des informations qui doivent être recalculées souvent.</p>
<p>Pour palier au cache permanent nous allons définir lors de l&#8217;enregistrement une date d&#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.</p>
<pre class="brush: php;">cache_set('my_module_data', $my_data, 'cache', time() + 300);</pre>
<p>La date d&#8217;expiration doit être au format unix timestamp et la façon la plus simple pour définir cette valeur est d&#8217;ajouter une période en seconde au timestamp en cours. Cet exemple défini une validité de 5 minutes (60sec x 5).</p>
<p><span> </span></p>
<h2><a name="tabledediee">Créer une table de cache dédiée</a></h2>
<p>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&#8217;informations à stocker. Ceci évitera d&#8217;avoir une grosse et unique table de cache.</p>
<p>Voici un petit exemple pour mieux comprendre l&#8217;interêt d&#8217;une table de cache dédiée. Imaginons que j&#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&#8217;augmenter le temps d&#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&#8217;en cas de besoin.</p>
<p>Le plus simple à faire pour créer un autre table de cache est de faire une copie de la table standard &#8216;cache&#8217; comme cela on est sûr d&#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 &#8216;cache&#8217; sera fait avec la fonction drupal_get_schema_unprocessed($module, $table = NULL).</p>
<pre class="brush: php;">/**
* Implementation of hook_schema().
*/
function my_module_schema(){
  $schema = array();
  $schema['cache_my_module'] = drupal_get_schema_unprocessed('system', 'cache');
  return $schema;
}</pre>
<p>Par convention nommez votre table &#8216;cache_&#8217; puis le nom de votre module ce qui dans l&#8217;exemple ci dessus donne &#8216;cache_my_module&#8217;.</p>
<p>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.</p>
<p>A ce stade la mise en place de la table de cache dédiée est terminée, il ne reste plus qu&#8217;à activer le module et à vérifier que celle-ci à bien été ajoutée à la base de donnée.</p>
<p>Pensez aussi à modifier les fonctions drupal_cache_get(), drupal_cache_set() et cache_clear_all() pour qu&#8217;elles pointent vers la bonne table. <img src='http://juliendubreuil.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush: php;">
cache_set('my_module_data', $my_data, 'cache_my_module');
cache_get('my_module_data', 'cache_my_module');
</pre>
<p>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.</p>
<p>Vous voilà maintenant prêt à améliorer votre code. Si vous voulez en lire plus voici la <a href="http://drupal.org/node/145279" rel="nofollow" target="_blank">présentation officielle de l&#8217;api cache</a> de Drupal ou sinon le <a href="http://www.lullabot.com/articles/a-beginners-guide-to-caching-data" rel="nofollow" target="_blank">guide</a> Lullabot sur l&#8217;utilisation de l&#8217;api.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/jouez-a-cache-cache-avec-drupal/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Créer un formateur CCK</title>
		<link>http://juliendubreuil.fr/drupal/creer-un-formateur-cck</link>
		<comments>http://juliendubreuil.fr/drupal/creer-un-formateur-cck#comments</comments>
		<pubDate>Tue, 18 May 2010 08:15:42 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[CCK]]></category>
		<category><![CDATA[Niveau avancé]]></category>
		<category><![CDATA[Theme]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=832</guid>
		<description><![CDATA[Sommaire
1. Déclaration du formateur CCK
2. Implémentation de la fonction de thème
3. Création du thème


Un formateur CCK permet de transformer l&#8217;affichage d&#8217;un champ en ce que l&#8217;on veut, ce n&#8217;est ni plus, ni moins qu&#8217;une fonction de thème.
Le choix de l&#8217;utilisation d&#8217;un formateur se fait par l&#8217;intermédiaire de l&#8217;administration des types de contenus via la rubrique [...]]]></description>
			<content:encoded><![CDATA[<div style=" margin: 10px; padding: 10px; float: left; width: 170px; font-size: 12px; color: #1e6e98;"><strong>Sommaire</strong><br />
<a href="#declaration">1. Déclaration du formateur CCK</a><br />
<a href="#implementation">2. Implémentation de la fonction de thème</a><br />
<a href="#creation">3. Création du thème</a>
</div>
<p><span></span><br />
Un formateur CCK permet de transformer l&#8217;affichage d&#8217;un champ en ce que l&#8217;on veut, ce n&#8217;est ni plus, ni moins qu&#8217;une fonction de thème.</p>
<p>Le choix de l&#8217;utilisation d&#8217;un formateur se fait par l&#8217;intermédiaire de l&#8217;administration des types de contenus via la rubrique &#8216;Afficher les champs&#8217;. Pour chaque champ vous avez un menu déroulant avec les différents formateurs disponibles.</p>
<p>Prenons l&#8217;exemple d&#8217;un champ image. Grâce aux différents formateurs disponibles vous avez le choix d&#8217;afficher à l&#8217;internaute un lien url du fichier, le chemin de l&#8217;image ou encore l&#8217;image elle même.<br />
<span id="more-832"></span><br />
La réalisation d&#8217;un formateur est vraiment simple. Nous allons donc voir comment en créer un afin de transformer l&#8217;affichage d&#8217;un champ texte dans lequel on saisit des numéros de téléphone en quelque chose de plus lisible. Cet exemple n&#8217;a pas grand interêt mais il va nous permettre de mettre en œuvre facilement la création d&#8217;un formateur.</p>
<p><span> </span></p>
<h2><a name="declaration">1) Déclaration du formateur CCK</a></h2>
<p>Tout commence par la déclaration de notre formateur à Drupal par le biais de la fonction hook_field_formatter_info()</p>
<pre class="brush: php;">/**
* Implementation of hook_field_formatter_info().
*/
function monmodule_field_formatter_info() {
  $formatters = array(
    'customphonenumber' =&gt; array(
      'label' =&gt; t('Modif num tél'),
      'field types' =&gt; array('text'),
      'description' =&gt; t("Transformation de l'affichage d'un numéro de téléphone"),
    ),
  );

  return $formatters;
}</pre>
<p>Grâce à cette fonction nous venons de déclarer notre nouveau formateur &#8216;customphonenumber&#8217; ainsi que ses paramètres.<br />
- label : c&#8217;est le nom qui sera affiché dans la liste des formateurs disponibles<br />
- field types : c&#8217;est la liste des champs cck sur lesquels vous pourrez appliquer le formateur.<br />
- description : la description complète de votre champ.</p>
<p><span> </span></p>
<h2><a name="implementation">2) Implémentation de la fonction de thème</a></h2>
<p>Nous allons maintenant implémenter le hook_theme() afin d&#8217;appliquer un thème à notre formateur.</p>
<pre class="brush: php;">/**
* Implementation of hook_theme().
*/
function monmodule_theme() {
  $theme = array(
    'monmodule_formatter_customphonenumber' =&gt; array(
      'arguments' =&gt; array('element' =&gt; NULL),
    ),
  );

  return $theme;
}</pre>
<p>Il ne nous reste plus qu&#8217;à construire notre thème afin de modifier l&#8217;apparence du champ.</p>
<p><span> </span></p>
<h2><a name="creation">3) Création de notre thème</a></h2>
<p>Notre thème va nous permettre d&#8217;effectuer les transformations que l&#8217;on veut sur notre champ. Toutes les informations du champs se trouvent dans la variable $element.</p>
<pre class="brush: php;">/**
* Theming functions.
*/
function theme_monmodule_formatter_customphonenumber($element) {
  $output = '';
  $phone_number = $element['#item']['value'];
  $output = wordwrap(filter_xss($phone_number), 2, '.', 1);

  return $output;
}</pre>
<p><span></span></p>
<p>Maintenant pour appliquer votre formateur il ne vous reste plus qu&#8217;à vous rendre sur la page &#8216;Afficher les champs&#8217; de votre type de contenu afin de le sélectionner. N&#8217;oubliez pas que pour que votre champ apparaisse dans la liste, vous devez régénérer les thèmes disponibles en flushant vos caches, afin que vos modifications soient prises en compte.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/creer-un-formateur-cck/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bien choisir vos modules en 5 conseils</title>
		<link>http://juliendubreuil.fr/drupal/conseils-pour-choisir-vos-modules-drupal</link>
		<comments>http://juliendubreuil.fr/drupal/conseils-pour-choisir-vos-modules-drupal#comments</comments>
		<pubDate>Tue, 04 May 2010 08:00:49 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Débutant]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=776</guid>
		<description><![CDATA[En réalisant ma petite sélection de modules,je me suis aperçu que ce n&#8217;était pas évident de définir si un module était bon ou non, d&#8217;autant plus si on découvre Drupal. Voici donc quelques petits trucs que j&#8217;applique lorsque je cherche un module.

 
 
#1 &#8211; Les Statistiques d&#8217;usage.
Sur chaque page de modules il y a [...]]]></description>
			<content:encoded><![CDATA[<p><span>En réalisant <a id="md-3" title="ma petite sélection de modules" href="../selection-de-modules-pour-drupal">ma petite sélection de modules</a>,je me suis aperçu que ce n&#8217;était pas évident de définir si un module était bon ou non, d&#8217;autant plus si on découvre Drupal. Voici donc quelques petits trucs que j&#8217;applique lorsque je cherche un module.</span></p>
<p style="text-align: center;"><img class="size-full wp-image-841  aligncenter" title="puzzle_modules" src="http://juliendubreuil.fr/wp-content/uploads/2010/05/puzzle_modules.jpg" alt="" width="500" height="220" /></p>
<p><span> </span><br />
<span> </span></p>
<h2>#1 &#8211; Les Statistiques d&#8217;usage.</h2>
<p>Sur chaque page de modules il y a un lien en bas de page appelé &#8216;<em>View usage statistics</em>&#8216; qui vous renvoie vers une page dédiée aux statistiques d&#8217;utilisation du module. La courbe présentée vous donne une estimation de l&#8217;utilisation du module (cette courbe ne colle pas forcément avec la réalité car les statistiques sont calculées grâce aux sites ayant le module update activé). Vous pouvez néanmoins tirer des conclusions de cette courbe, si celle-ci ne fait que progresser c&#8217;est bon signe, à l&#8217;inverse si elle chute il faut se poser des questions. Pourquoi a t-elle chuté? Y&#8217;a t&#8217;il un autre module qui fait mieux que celui-ci? A ce moment vous êtes bon pour continuer votre recherche.</p>
<p><span id="more-776"></span><br />
<span><a href="http://juliendubreuil.fr/wp-content/uploads/2010/04/stats-module-up.jpg" rel="lightbox[776]"><img class="aligncenter size-medium wp-image-794" title="stats-module-up" src="http://juliendubreuil.fr/wp-content/uploads/2010/04/stats-module-up-300x117.jpg" alt="" width="300" height="117" /></a><a href="http://juliendubreuil.fr/wp-content/uploads/2010/04/stats-module-dow.jpg" rel="lightbox[776]"><img class="aligncenter size-medium wp-image-795" title="stats-module-dow" src="http://juliendubreuil.fr/wp-content/uploads/2010/04/stats-module-dow-300x117.jpg" alt="" width="300" height="117" /></a></span></p>
<p><span> </span></p>
<h2>#2 &#8211; La date de la dernière release.</h2>
<p>La date de la dernière version disponible d&#8217;un module est un bon indicateur. Si celle-ci est proche de la réalité cela veut dire que le mainteneur du module est toujours actif et qu&#8217;il corrige ou ajoute encore des fonctionnalités à son module. C&#8217;est important de savoir que si vous avez besoin vous pourrez trouver un peu d&#8217;aide au près de celui qui a développé le module. Attention cependant, ce n&#8217;est pas non plus parce qu&#8217;un module à une date de release assez vieille que celui-ci n&#8217;est pas ou plus maintenu, il faut prendre en compte le point #3 dans ce cas.</p>
<p><span> </span></p>
<h2>#3 &#8211; Le Nombre d&#8217;issue ouverte et le temps qu&#8217;il a fallut pour les résoudre</h2>
<p>Pour chaque module il est possible d&#8217;ouvrir des issues. Une issue, c&#8217;est une question ou une demande formulée au mainteneur, qui peut prendre plusieurs formes. Cela peut être un bug, une demande d&#8217;aide ou d&#8217;ajout de fonctionnalité, ou encore la proposition d&#8217;un patch&#8230;<br />
Sur chaque page de module il y a un encadré dédié aux issues en haut à gauche, sur cet espace vous pouvez visualiser le nombre d&#8217;issue et de bug non résolus. Forcément, plus les chiffres sont élevés plus vous avez de questions à vous poser sur le module.</p>
<p style="text-align: center;"><a href="http://juliendubreuil.fr/wp-content/uploads/2010/04/modules-issues.jpg" rel="lightbox[776]"><img class="aligncenter size-full wp-image-803" title="modules-issues" src="http://juliendubreuil.fr/wp-content/uploads/2010/04/modules-issues.jpg" alt="" width="230" height="232" /></a></p>
<p>Ce qui est donc important de regarder c&#8217;est le nombre d&#8217;issues encore ouvertes et le temps qu&#8217;a mis le mainteneur pour répondre et corriger celles qui sont fermées afin de connaître son temps de réaction.</p>
<p><span> </span></p>
<h2>#4 &#8211; Le ou les responsables du modules</h2>
<p>Si vous débutez avec Drupal vous allez avoir un peu de mal à appliquer ce conseil, mais à force de jouer avec Drupal vous allez vous apercevoir que certains noms reviennent parmi les contributeurs. Donc lorsque vous tombez sur un module développé par quelqu&#8217;un de &laquo;&nbsp;réputé&nbsp;&raquo; vous pouvez vous attendre à un travail de qualité.</p>
<p><span> </span></p>
<h2>#5 &#8211; La qualité du code</h2>
<p>Ce conseil s&#8217;applique si vous savez développer un module puisqu&#8217;il vous faut regarder le code source de celui-ci. Regarder la façon dont est codé un module est un bon indicateur, vous pouvez ainsi voir si les normes de codages de Drupal sont respectées (utilisation de l&#8217;api, respect des standards, indentation et documentation du code&#8230;) et puis cela vous permettra de  mieux comprendre comment fonctionne le module si vous l&#8217;utilisez.<br />
<span> </span><br />
<span>Voilà maintenant que vous savez repérer un module qui a du potentiel vous pouvez vous plonger dans la liste de modules de Drupal</span><span>.</span><br />
<span> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/conseils-pour-choisir-vos-modules-drupal/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sélection de modules pour Drupal</title>
		<link>http://juliendubreuil.fr/drupal/choisir-ses-modules-drupal</link>
		<comments>http://juliendubreuil.fr/drupal/choisir-ses-modules-drupal#comments</comments>
		<pubDate>Fri, 23 Apr 2010 15:02:35 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Modules]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=737</guid>
		<description><![CDATA[Une des tâches  les moins faciles avec Drupal est de trouver &#8216;le&#8217; module qui correspond  à votre besoin, celui dont vous rêvez qu&#8217;il vous suffira simplement  d&#8217;installer pour qu&#8217;il exauce tous vos souhaits. Avec un peu plus de  5500 modules disponibles et un besoin un peu spécifique c&#8217;est comme  chercher [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><span>Une des tâches  les moins faciles avec Drupal est de trouver &#8216;le&#8217; module qui correspond  à votre besoin, celui dont vous rêvez qu&#8217;il vous suffira simplement  d&#8217;installer pour qu&#8217;il exauce tous vos souhaits. Avec un peu plus de  5500 modules disponibles et un besoin un peu spécifique c&#8217;est comme  chercher une aiguille dans une botte de foin. Au fil de mes trouvailles  j&#8217;ai commencé une petite liste des modules qui me semblaient  intéressants, puis tout doucement, celle-ci à grossi.</span></p>
<p style="text-align: center;"><img class="aligncenter" title="module dans une botte de foin" src="http://farm3.static.flickr.com/2345/1779534748_93cefcfb13_b.jpg" alt="" width="402" height="263" /></p>
<p><span>Vous trouverez donc sur <a title="selection de modules Drupal" href="http://juliendubreuil.fr/selection-de-modules-pour-drupal">cette page une petite sélection de modules</a> classés par thème, dont certains très connus et d&#8217;autres moins.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/choisir-ses-modules-drupal/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dupliquer un champ CCK sur un type de contenu en programmation</title>
		<link>http://juliendubreuil.fr/drupal/dupliquer-un-champ-cck-sur-un-type-de-contenu-en-programmation</link>
		<comments>http://juliendubreuil.fr/drupal/dupliquer-un-champ-cck-sur-un-type-de-contenu-en-programmation#comments</comments>
		<pubDate>Mon, 22 Mar 2010 08:02:52 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[CCK]]></category>
		<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Hook]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=723</guid>
		<description><![CDATA[Aujourd&#8217;hui j&#8217;ai eu besoin de dupliquer un champ CCK existant, d&#8217;un type de contenu à un autre. Chose facile lorsque l&#8217;on passe par l&#8217;administration, quelques petits clics et hop le tour est joué, mais comment fait-on en programmation ?
Imaginez un type de contenu &#8216;Articles&#8217; composé des champs traditionnels title et body et de mon champ [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui j&#8217;ai eu besoin de dupliquer un champ CCK existant, d&#8217;un type de contenu à un autre. Chose facile lorsque l&#8217;on passe par l&#8217;administration, quelques petits clics et hop le tour est joué, mais comment fait-on en programmation ?</p>
<p>Imaginez un type de contenu &#8216;Articles&#8217; composé des champs traditionnels title et body et de mon champ extra ainsi qu&#8217;un deuxième type de contenu &#8216;Actualités&#8217;. Nous allons donc voir comment récupérer ce champ du premier contenu pour l&#8217;intégrer au deuxième.</p>
<p>Tout d&#8217;abord il nous faut récupérer le champ. Pour cela nous allons utiliser la fonction content_fields() de CCK en lui passant le nom du champ à récupérer et le contenu sur lequel le trouver.</p>
<pre class="brush: php;">
  $cck_field_copy = content_fields('field_articles_extra', 'articles');
</pre>
<p><em>Note : le nom du champ cck se trouve dans l&#8217;onglet &#8216;Gérer les champs&#8217; sur l&#8217;interface d&#8217;administration de votre type de contenu. C&#8217;est le nom machine que vous avez saisi lors de la création.</em><br />
<span id="more-723"></span><br />
Voici ce que contient mon champ field_articles_extra : </p>
<pre class="brush: php;">
array (
  'field_name' => 'field_articles_extra',
  'type_name' => 'articles',
  'display_settings' =>
  array (
    'label' =>
    array (
      'format' => 'above',
      'exclude' => 0,
    ),
    'teaser' =>
    array (
      'format' => 'default',
      'exclude' => 0,
    ),
    'full' =>
    array (
      'format' => 'default',
      'exclude' => 0,
    ),
    4 =>
    array (
      'format' => 'default',
      'exclude' => 0,
    ),
    2 =>
    array (
      'format' => 'default',
      'exclude' => 0,
    ),
    3 =>
    array (
      'format' => 'default',
      'exclude' => 0,
    ),
  ),
  'widget_active' => '1',
  'type' => 'text',
  'required' => '0',
  'multiple' => '0',
  'db_storage' => '1',
  'module' => 'text',
  'active' => '1',
  'locked' => '0',
  'columns' =>
  array (
    'value' =>
    array (
      'type' => 'text',
      'size' => 'big',
      'not null' => false,
      'sortable' => true,
      'views' => true,
    ),
  ),
  'text_processing' => '0',
  'max_length' => '',
  'allowed_values' => '',
  'allowed_values_php' => '',
  'widget' =>
  array (
    'rows' => 5,
    'size' => '60',
    'default_value' =>
    array (
      0 =>
      array (
        'value' => '',
        '_error_element' => 'default_value_widget][field_articles_extra][0][value',
      ),
    ),
    'default_value_php' => NULL,
    'label' => 'Extra',
    'weight' => '31',
    'description' => '',
    'type' => 'text_textfield',
    'module' => 'text',
  ),
)
</pre>
<p>Maintenant que nous avons notre champ, nous allons l'adapter pour notre nouveau type de contenu en changent le nom du champ et le nom du type de contenu auquel il appartient :</p>
<pre class="brush: php;">
// Modification de la variable pour le contenu weblinks
  $cck_field_copy['field_name'] = 'field_actualites_extra';
  $cck_field_copy['type_name'] = 'actualites';
</pre>
<p>Notre champ est prêt, il suffit maintenant d&#8217;utiliser les fonctions du module CCK pour insérer ce champ à notre contenu Actualités.</p>
<pre class="brush: php;">
 // Chargement des dépendances CCK pour ajouter le champ.
  module_load_include('inc', 'content', 'includes/content.crud');
  // Ajout du champ slug au contenu weblinks.
  content_field_instance_create($slug_cck_field);
</pre>
<p>L&#8217;ajout de ce nouveau champ ne doit être fait qu&#8217;une seule fois et avant de commencer à créer des contenus, pour cela le meilleur endroit est le fichier .install dans le hook_install()</p>
<pre class="brush: php;">
/**
 * Implements hook_install().
 *
 * Ajout du champ CCK slug au contenu weblinks.
 */
function MyModule_install() {
  // Copie du champ CCK extra sur le contenu articles.
  $cck_field_copy = content_fields('field_articles_extra', 'articles');  

  // Modification de la variable pour le contenu Actualités
  $cck_field_copy['field_name'] = 'field_actualites_extra';
  $cck_field_copy['type_name'] = 'actualites';

  // Chargement des dépendances CCK pour ajouter le champ.
  module_load_include('inc', 'content', 'includes/content.crud');

  // Ajout du champ extra au contenu Actualités.
  content_field_instance_create($cck_field_copy);
}
</pre>
<p>Nous venons d&#8217;installer notre champ, mais il faut aussi penser à créer la procédure de désinstallation.</p>
<pre class="brush: php;">
/**
 * Implements hook_uninstall().
 *
 * Ajout du champ CCK slug au contenu weblinks.
 */
function MyModule_uninstall() {
  // Chargement des dépendances CCK pour supprimer le champ.
  module_load_include('inc', 'content', 'includes/content.crud');

  // Suppression du champ extra du contenu Actualités.
  content_field_instance_delete('$cck_field_copy', 'actualites');

}
</pre>
<p>Pour tester il ne vous reste plus qu&#8217;à installer votre module. Si celui-ci est déjà installé désactivez le et désinstallez le avant. Votre champ est maintenant sur votre contenu</p>
<p>Merci à <a href="http://twitter.com/opidentica" target="_blank" rel="nofollow">Opi</a> et <a href="http://twitter.com/iNade" target="_blank" rel="nofollow">Inade</a> pour les différents liens qu&#8217;ils m&#8217;ont donnés. </p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/dupliquer-un-champ-cck-sur-un-type-de-contenu-en-programmation/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Partie II – Plus loin dans le référencement</title>
		<link>http://juliendubreuil.fr/drupal/plus-loin-dans-le-referencement-drupal</link>
		<comments>http://juliendubreuil.fr/drupal/plus-loin-dans-le-referencement-drupal#comments</comments>
		<pubDate>Fri, 12 Mar 2010 13:36:48 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Documentations]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Réferencement]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=706</guid>
		<description><![CDATA[Ce que nous venons de faire était simple mais pourtant ces actions étaient essentielles. Maintenant nous allons aller un petit peu plus loin et passer à des choses plus marrantes.


XML sitemaps
La création d’un site map ou en français d’un plan de site va permettre d’indiquer facilement aux moteurs de recherche le contenu qu’il leur est [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ce que nous venons de faire était simple mais pourtant ces actions étaient essentielles. Maintenant nous allons aller un petit peu plus loin et passer à des choses plus marrantes.
</p>
<p><br/></p>
<h3>XML sitemaps</h3>
<p style="text-align: justify;">La création d’un site map ou en français d’un plan de site va permettre d’indiquer facilement aux moteurs de recherche le contenu qu’il leur est possible d’explorer sur notre site.</p>
<p style="text-align: justify;">Un Site map est une cartographie d&#8217;adresses des différents contenus qui composent votre site Internet auxquels on ajoute des informations, de précieuses méta-données.</p>
<p style="text-align: justify;">Pour réaliser un site map facilement vous pouvez utiliser les modules Site map ou XML site map qui ont été conçu pour répondre aux spécifications de sitemaps.org.</p>
<p><a id="hvw_" title="Mettre en place un sitemap sur votre site." href="../drupal/creation-plan-de-site-ou-sitemap-pour-drupal">Mettre en place un sitemap sur votre site.</a><br />
Modules requis : <a id="v8v6" title="site map" href="http://drupal.org/project/site_map">site map</a> ou <a id="cbar" title="xml site map" href="http://drupal.org/project/xmlsitemap">xml site map</a><br />
<br/></p>
<h3>Robots txt</h3>
<p style="text-align: justify;">Lorsqu&#8217;un moteur de recherche analyse votre site web on dit que celui-ci indexe votre contenu, ce robot d&#8217;indexation est appelé Crawler (&laquo;&nbsp;Butineurs&nbsp;&raquo;). Il fonctionne comme un internaute, il navigue de lien en lien, analyse le contenu et indexe les mots clés qu&#8217;il rencontre dans le but de capitaliser le plus de page web possible.<br />
<span id="more-706"></span><br />
Afin de préciser au Crawler ce qu&#8217;il doit ou ce qu&#8217;il n&#8217;a pas le droit d&#8217;indexer on utilise un fichier nommé Robot.txt contenant des règles d&#8217;autorisation ou d&#8217;exclusion. Ce fichier est la première chose lue par le moteur d&#8217;indexation lors de son passage sur votre site. Si toutefois vous n&#8217;aviez pas de fichier Robots.txt sur votre site, le Crawler considèrera qu&#8217;il peut analyser tout le contenu de votre site.</p>
<p style="text-align: justify;">Notez que dans l&#8217;archive de Drupal que vous avez téléchargée, il y a déja un fichier Robots.txt</p>
<p style="text-align: justify;">Pour plus de renseignements sur la configuration du fichier je vous renvoie sur <a id="ob5m" title="wikipédia" href="http://fr.wikipedia.org/wiki/Robots.txt">wikipédia</a> et sur <a id="t1j:" title="annuaires-info" href="http://www.annuaire-info.com/robots-txt/fichier/">annuaire-info</a> pour quelques exemples.</p>
<p style="text-align: justify;">Avec Drupal il y a un module pour presque tout, alors il existe un module pour gérer le fichier robots.txt depuis l&#8217;interface d&#8217;administration, mais notez que ce module est surtout utile dans le cas de gestion de multi-site ou vous auriez un fichier par site.
</p>
<p><br/></p>
<h3>Global redirect</h3>
<p style="text-align: justify;">Dans la premiere partie de cet article nous avons mis en place les &laquo;&nbsp;belles urls&nbsp;&raquo; afin d&#8217;avoir des urls de type http://monsite.fr/drupal-référencement. A ce stade nous nous retrouvons avec un problème de duplication de contenu. En effet Drupal ne desactive pas l&#8217;ancienne adresse et le contenu devient accessible par deux adresses.<br />
Cet action est dangeureuse, Google n&#8217;aime pas ça et il assigne cela à de la multiplication artificielle de contenu qu&#8217;il punit en inscrivant votre site à sa liste noire.</p>
<p style="text-align: justify;">Pour éliminer ce problème nous allons utiliser le module global redirect qui, au moment de l&#8217;accès à une page, interrompera le chargement de celle-ci et redirigera vers l&#8217;alias de la page.</p>
<p style="text-align: justify;">L&#8217;administration du module se fait depuis la page [ Admin › configuration du site › globalredirect ] mais la configuration par défaut est parfaite.</p>
<p>Modules requis : <a id="mami" title="global redirect" href="http://drupal.org/project/globalredirect">global redirect</a><br />
<br/></p>
<h3>Path redirect</h3>
<p style="text-align: justify;">Le nom de ce module parle de lui même. Path redirect permet de rediriger des urls vers un autre chemin interne ou externe. Ce qui est pratique lorsque votre contenu a bougé ou que vous souhaitez détourner le trafic vers une autre page.</p>
<p style="text-align: justify;">Pour créer une redirection c&#8217;est très simple, il vous suffit de vous rendre sur la page dédiée : [ Admin › construction du site › urls redirigées ] d&#8217;insérer l&#8217;ancienne adresse, la nouvelle adresse et les variables à passer avec l&#8217;url.</p>
<p style="text-align: justify;">Vous pouvez depuis le menu &#8216;Paramètres&#8217; choisir d&#8217;informer l&#8217;internaute qu&#8217;il subit une redirection vers une autre page.</p>
<p style="text-align: justify;">Modules requis : <a id="qcc0" title="Path redirect" href="http://drupal.org/project/path_redirect">Path redirect</a>
</p>
<p><br/></p>
<h3>Search 404</h3>
<p style="text-align: justify;">Lorsque vous essayez d&#8217;accéder à un contenu inexistant ou que l&#8217;adresse url à changé Drupal vous affiche une page d&#8217;erreur, c&#8217;est la fameuse page 404.</p>
<p style="text-align: justify;">Le module seach 404 va nous permettre d&#8217;aller plus loin dans l&#8217;aide aux internautes puisqu&#8217;il permet lorsqu&#8217;une page est introuvable d&#8217;exécuter une recherche en fonction de la demande initiale.</p>
<p style="text-align: justify;">Prenez par exemple la page http://monsite.fr/does/not/exist, search 404 va effectuer une recherche sur la phrase &laquo;&nbsp;does not exist&nbsp;&raquo;.</p>
<p style="text-align: justify;">L&#8217;administration du module [ Admin › configuration du site › Search 404 settings ] permet de modifier le comportement du module lorsqu&#8217;il trouve une réponse pour rediriger l&#8217;internaute. Vous pouvez ainsi choisir de forcer l&#8217;utilisateur à être redirigé vers la première réponse. Je déconseille fortement d&#8217;activer cette option, car vos utilisateurs risquent de ne pas comprendre comment et pourquoi ils sont arrivés à cet endroit.</p>
<p>Modules requis : <a id="mv2k" title="Search 404" href="http://drupal.org/project/search404">Search 404</a><br />
<br/></p>
<p style="text-align: justify;">
Vous êtes maintenant bien préparé pour mener votre combat au référencement. Mais installer des modules n&#8217;est pas suffisant, il faut aussi surveiller et optimiser ce qui à été fait. Pour cela rendez-vous dans la troisième partie ou nous aborderons ce sujet qui vous donnera quelques pistes à étudier.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/plus-loin-dans-le-referencement-drupal/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Créer et appliquer un patch pour un module sous Linux</title>
		<link>http://juliendubreuil.fr/drupal/creer-et-appliquer-un-patch-pour-un-module-sous-linux</link>
		<comments>http://juliendubreuil.fr/drupal/creer-et-appliquer-un-patch-pour-un-module-sous-linux#comments</comments>
		<pubDate>Mon, 08 Mar 2010 12:44:45 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Modules]]></category>
		<category><![CDATA[Patch]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=692</guid>
		<description><![CDATA[Il est parfois inévitable de devoir modifier un module contribué afin d&#8217;étendre les possibilités de celui-ci ou tout simplement pour corriger quelque chose.
Dans tous les cas il ne faut pas modifier les fichiers du module et les mettre sur votre site parce qu&#8217;à ce moment il vous sera compliqué de mettre à jour votre module. [...]]]></description>
			<content:encoded><![CDATA[<p>Il est parfois inévitable de devoir modifier un module contribué afin d&#8217;étendre les possibilités de celui-ci ou tout simplement pour corriger quelque chose.<br />
Dans tous les cas il ne faut pas modifier les fichiers du module et les mettre sur votre site parce qu&#8217;à ce moment il vous sera compliqué de mettre à jour votre module. Imaginez le jour ou vous voudrez appliquer la nouvelle version de celui-ci, toutes vos modifications seront écrasées.</p>
<p>Pour modifier correctement un module vous devez créer un patch que vous appliquerez par la suite au module original.</p>
<p>Dans un premier temps nous allons voir comment générer notre patch puis comment l&#8217;appliquer. Il existe plusieurs façons pour faire cela. La solution que je vous propose n&#8217;est qu&#8217;une solution parmi tant d&#8217;autres.<br />
<span id="more-692"></span><br />
Comme exemple j&#8217;ai pris la fonction facebook_status_activity() du module facebook_status ci-dessous. Cette fonction permet, lorsque le module activity est installé, d&#8217;insérer des activités lorsqu&#8217;un utilisateur a mis à jour son statut.</p>
<pre class="brush: php;">function facebook_status_activity($owner, $poster, $status) {
  //If we're using Activity 2, this function doesn't need to be run.
  if (!module_exists('activity') || function_exists('activity_help')) {
    return FALSE;
  }
  //Privacy setting check.
  if (activity_user_privacy_optout($poster)) {
    return FALSE;
  }
  $data = array(
    'owner' =&gt; theme('username', $owner),
    'poster' =&gt; theme('username', $poster),
    'status-unformatted' =&gt; check_plain($status-&gt;status),
    'status-themed' =&gt; theme('facebook_status_item', $status),
    'status_time' =&gt; $status-&gt;status_time,
  );
  $target_users_roles = array(
    ACTIVITY_ALL =&gt; 'all',
    $owner-&gt;uid =&gt; 'owner',
  );
  //If $owner-&gt;uid == $poster-&gt;uid, this will just overwrite the owner role.
  $target_users_roles[$poster-&gt;uid] = 'poster';
  activity_insert($poster-&gt;uid, 'facebook_status', 'facebook_status', 'update', $data, $target_users_roles);
}</pre>
<p>Avant tout, nous allons créer une copie de notre fichier que nous allons nommer facebook_status.origine.module et qui sera notre version de référence pour effectuer notre comparaison.</p>
<p>Maintenant nous allons pouvoir apporter toutes nos modifications au fichier facebook_status.module. Dans notre cas nous allons ajouter une nouvelle entrée au tableau data, qui contiendra l&#8217;id du statut.</p>
<pre class="brush: php;">'status-id' =&gt; $status-&gt;sid.</pre>
<p><br/></p>
<h3>1. Repérer les différences avec la commande diff</h3>
<p>A ce stade nous avons nos deux fichiers, l&#8217;original et le modifié. La commande diff va nous permettre de voir la différence entre les deux fichiers :</p>
<pre class="brush: patch;">$ diff facebook_status.module.origine facebook_status.module
1558a1559
&gt;     'status-id' =&gt; $status-&gt;sid,</pre>
<p>La comparaison entre la version originale et la nouvelle version nous indique qu&#8217;entre la ligne 1558 et 1559 une différence a été trouvée. Ici c&#8217;est une nouvelle ligne qui a été insérée, on peut le voir grâce au symbôle &#8216;&gt;&#8217;. Dans le cas d&#8217;une suppression le symbôle aurait été &#8216;&lt;&#8217;.</p>
<p>La commande diff permet également de connaître les différences entre les fichiers de deux répertoires. Pour cela, il suffit d&#8217;ajouter le paramètre -r à la commande :</p>
<pre class="brush: patch;">diff -r facebook_status.module facebook_status_origine.module</pre>
<p><br/></p>
<h3>2. Créer le fichier de patch</h3>
<p>Nous allons maintenant créer un fichier contenant cette modification que l&#8217;on pourra appliquer facilement par la suite. Nous allons réutiliser la fonction diff avec l&#8217;option -u qui en plus de notre différence va nous donner les 3 lignes avant et après notre modification.</p>
<pre class="brush: patch;">$ diff -u facebook_status.module.origine facebook_status.module &gt; facebook_status.module.patch
$ cat facebook_status.module.patch
--- facebook_status.module.origine    2010-03-04 15:47:47.000000000 +0100
+++ facebook_status.module    2010-03-01 14:16:47.000000000 +0100
@@ -1556,6 +1556,7 @@
   $data = array(
     'owner' =&gt; theme('username', $owner),
     'poster' =&gt; theme('username', $poster),
+    'status-id' =&gt; $status-&gt;sid,
     'status-unformatted' =&gt; check_plain($status-&gt;status),
     'status-themed' =&gt; theme('facebook_status_item', $status),
     'status_time' =&gt; $status-&gt;status_time,</pre>
<p>Les différences trouvées ont été enregistrées dans un fichier nommé facebook_status.module.patch.<br />
<br/></p>
<h3>3. Patcher avec la commande patch</h3>
<p>Maintenant que nous avons un fichier patch exploitable nous allons pouvoir l&#8217;appliquer à la version originale de notre fichier. Vous pouvez supprimer le fichier facebook_status.module et renommer le fichier facebook_status.module.origine en facebook_status.module afin que les choses retournent à leur état initial ou tout simplement retélécharger le module.</p>
<p>Pour mettre à jour notre fichier, rendez vous dans le repertoire du fichier à patcher et utilisez la commande patch :</p>
<pre class="brush: patch;">$ patch &lt; facebook_status.module.patch
patching file facebook_status.module</pre>
<p>Votre fichier est maintenant patché, vous pouvez l&#8217;ouvrir pour visualiser les modifications.</p>
<h4>Edit :</h4>
<p>Dans le cas ou vous auriez à appliquer votre patch à l&#8217;ensemble d&#8217;un dossier vous pouvez ajouter l&#8217;option p0 à la commande patch comme le soumet Julien Dubois
<pre class="brush: patch;">$ patch -p0 &lt; facebook_status.module.patch</pre>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/creer-et-appliquer-un-patch-pour-un-module-sous-linux/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Modifier les emails envoyés depuis votre site.</title>
		<link>http://juliendubreuil.fr/drupal/modifier-les-emails-envoyes-depuis-votre-site</link>
		<comments>http://juliendubreuil.fr/drupal/modifier-les-emails-envoyes-depuis-votre-site#comments</comments>
		<pubDate>Mon, 01 Mar 2010 12:40:59 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[module]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=675</guid>
		<description><![CDATA[Pour compléter mon précendent billet voici comment modifier les emails envoyés depuis votre site.
Pour générer l&#8217;envoi de mail depuis un module nous avons utilisé les fonctions hook_mail() et drupal_mail(). Pour la modification nous allons utiliser la fonction hook_mail_alter(&#38;$message) afin d&#8217;avoir un accès complet à tous les emails envoyés.
La variable $message contient toutes les informations nécessaires [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Pour compléter mon <a id="l-l-" title="précendent billet" href="drupal/envoyer-des-emails-depuis-un-module">précendent billet</a> voici comment modifier les emails envoyés depuis votre site.</p>
<p>Pour générer l&#8217;envoi de mail depuis un module nous avons utilisé les fonctions <a id="j55h" title="hook_mail($key, &amp;$message, $params)" href="http://api.drupal.org/api/function/hook_mail/6">hook_mail()</a> et <a id="sa_:" title="drupal_mail()" href="http://api.drupal.org/api/function/drupal_mail">drupal_mail()</a>. Pour la modification nous allons utiliser la fonction <a id="xlin" title="hook_mail_alter(&amp;$message)" href="http://api.drupal.org/api/function/hook_mail_alter/6">hook_mail_alter(&amp;$message)</a> afin d&#8217;avoir un accès complet à tous les emails envoyés.</p>
<p>La variable <strong>$message contient toutes les informations nécessaires à l&#8217;envoi de l&#8217;email</strong> et à ce stade, l&#8217;email à été formaté et est prêt à l&#8217;envoi. Dans cette variable on retrouve donc les infos headers, le body, le sujet, les paramètres passés lors de la génération de l&#8217;email et surtout l&#8217;identifiant renseigné.<br />
<span id="more-675"></span><br />
C&#8217;est grâce à ce dernier que nous allons pouvoir identifier et modifier un email en particulier. <strong>Cette clé est constituée des deux prermiers paramètres fusionnés</strong> passés à la fonction drupal_mail, soit dans notre cas MyModule et envoi_email.<br />
Voici un exemple pour ajouter la signature de votre site au bas de notre email.</p>
<pre class="brush: php;">function MyOtherModule_mail_alter(&amp;$message) {
  if ($message['id'] == 'MyModule_envoi_email') {
    $message['body'] .= "--\nMail envoyé depuis " . variable_get('sitename', t('Drupal'));
  }
}</pre>
<p>$message['body'] est un tableau, vous pouvez donc lui rajouter autant d&#8217;entrées que vous voulez</p>
<p>Edit : Suite à mes échanges avec Opi sur mon impossibilité à passer un tableau à la variable $message['body'] j&#8217;ai cherché ce qu&#8217;il se passait. En fait, entre la déclaration de mon e-mail et la modification de celui-ci, le module htmlmail qui était installé sur mon drupal transformait le tableau en une chaîne de caractères :/<br />
Si vous subissez le même problème, il suffit de modifier le poids de vos modules pour qu&#8217;ils s&#8217;exécutent dans l&#8217;ordre voulu.</p>
<p>Articles relatifs : <a id="ge2e" title="Envoyer des emails depuis un module" href="../drupal/envoyer-des-emails-depuis-un-module">Envoyer des emails depuis un module</a></p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/modifier-les-emails-envoyes-depuis-votre-site/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Envoyer des emails depuis un module</title>
		<link>http://juliendubreuil.fr/drupal/envoyer-des-emails-depuis-un-module</link>
		<comments>http://juliendubreuil.fr/drupal/envoyer-des-emails-depuis-un-module#comments</comments>
		<pubDate>Mon, 22 Feb 2010 09:29:56 +0000</pubDate>
		<dc:creator>Julien</dc:creator>
				<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Developpement]]></category>
		<category><![CDATA[Hook]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[module]]></category>

		<guid isPermaLink="false">http://juliendubreuil.fr/?p=605</guid>
		<description><![CDATA[Envoyer des emails depuis votre module est simple à faire, il suffit de déclarer le hook_mail() puis de faire appel à la fonction drupal_mail(). Vous trouverez ci-dessous, un exemple de code que vous pouvez intégrer dans votre module :

Dans un premier temps nous allons déclarer le hook_mail qui va être utilisé pour construire l&#8217;email avec [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Envoyer des emails depuis votre module est simple à faire, il suffit de déclarer le <a id="fn22" title="hook_mail($key, &amp;$message, $params)" href="http://api.drupal.org/api/function/hook_mail/6">hook_mail()</a> puis de faire appel à la fonction <a id="h3rj" title="drupal_mail()" href="http://api.drupal.org/api/function/drupal_mail">drupal_mail()</a>. Vous trouverez ci-dessous, un exemple de code que vous pouvez intégrer dans votre module :</p>
<p style="text-align: center;"><img class="aligncenter" src="http://farm1.static.flickr.com/107/306109649_dd3df466fa.jpg" alt="" width="500" height="333" /></p>
<p style="text-align: justify;">Dans un premier temps nous allons déclarer le hook_mail qui va être utilisé pour construire l&#8217;email avec la configuration que nous avons choisie et les paramètres que nous allons passer via la fonction drupal_mail. Vous pouvez spécifier plusieurs options :</p>
<p>$key : Identifiant unique pour votre email.<br />
$message : Tableau de valeurs contenant les informations relatives à l&#8217;email.<br />
* &#8216;id&#8217; : Identifiant pour distinguer l&#8217;email envoyé.<br />
* &#8216;to&#8217; : L&#8217;adresse du destinataire<br />
* &#8217;subject&#8217; : Le sujet de votre email<br />
* &#8216;body&#8217; : Le contenu de votre email.<br />
* &#8216;from&#8217; : L&#8217;adresse de l&#8217;émetteur<br />
* &#8216;headers : Les informations d&#8217;en-tête de votre email.<br />
$params : Tableau de paramètres dans lequel vous pouvez récupérer les informations que vous allez passer dans la fonction drupal_mail.</p>
<p><span id="more-605"></span></p>
<pre class="brush: php;">function MyModule_mail($key, &amp;$message, $params) {
  // note: l'utilisation d'une clé va nous permettre de distinguer plusieurs templates d'emails pouvant être envoyés par un même module.
  switch ($key) {
    case 'envoi_email':
      // note: Ici nous récupérons les informations passées dans le tableau $params
      $message['subject'] = $params['subject'];
      $message['body'] = $params['body'];
      break;
  }
}</pre>
<p style="text-align: justify;">La fonction drupal_mail() va nous permettre de définir un ou plusieurs templates d&#8217;emails dans lesquels nous allons pouvoir spécifier le contenu, le sujet et passer des paramètres pouvant être utilisés par la fonction hook_mail que nous venons de déclarer.</p>
<p>$module : Nom de votre module.<br />
$key : La clé qui va vous permettre d&#8217;identifier votre email.<br />
$to : L&#8217;adresse du destinataire.<br />
$language : La langue dans laquelle sera traduit votre email.<br />
$params : Le tableau optionnel de valeurs à passer à la fonction hook_mail.<br />
$from : L&#8217;adresse de l&#8217;émetteur<br />
$send : Configure l&#8217;envoi immédiat ou non de l&#8217;email</p>
<p style="text-align: justify;">Vous pouvez appeler cette fonction à la suite d&#8217;une action d&#8217;un utilisateur sur votre site ou encore lors de la soumission d&#8217;un formulaire.</p>
<pre class="brush: php;">$to = 'you@example.com';
$from = 'me@example.com';

$params = array(
  'body' =&gt; t("Vous venez de recevoir cet email depuis mon site drupal"),
  'subject' =&gt;t("test d'envoi d'email"),
);

if (drupal_mail('MyModule', 'envoi_email', $to, language_default(), $params, $from, TRUE)) {
  drupal_set_message("Votre email à été envoyé à " . $valid_email);
}
else {
  drupal_set_message("Une erreur s'est produite lors de l'envoi de votre email");
}</pre>
<p>Note : Si vous comptez envoyer des emails à des utilisateurs enregistrés sur votre site pensez à utiliser leurs paramètres, comme la langue d&#8217;affichage que vous pourrez trouver dans l&#8217;objet $user.</p>
<p>Credit photo : <a href="http://www.flickr.com/photos/julesangel/306109649/">JulesAngel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://juliendubreuil.fr/drupal/envoyer-des-emails-depuis-un-module/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.111 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-07-30 21:24:16 -->
