Planète

Par juliendubreuil
julien dubreuil
Drupal since 2009

Les hooks : connaître Drupal pour créer vos modules

Ce qu’il y a de bien avec Drupal c’est que l’on a l’impression de jouer aux lego, un module par ci, un module par là et le tout, imbriqué depuis l’interface d’administration de celui-ci. Mais comme moi, un jour vous avez voulu créer vous même vos structures et non plus seulement réaliser ce qu’il était possible de faire avec une simple boite de lego. Bref, vous avez déjà eu besoin de développer votre propre module afin de tordre le système et le faire coller à votre cahier des charges.

Cette nécessité de faire son propre module arrive bien plus vite qu’on ne le croit et c’est pour ça que je me suis dit qu’une petite liste des principales choses à connaître pour jouer avec Drupal serait utile. Du coup, j’ai essayé de me replacer quelques mois en arrière, à mes débuts avec Drupal et son api et je vous ai listé les principaux hooks que vous pourrez être amenés à utiliser au départ.

Concept et implémentation d’un hook

Avant d’aller plus loin, il y a une notion à comprendre pour développer un module avec Drupal et j’espère pour vous que vous avez déjà entendu ce mot : ‘hook’, sinon il va falloir réviser les bases de Drupal :p
Pour vous donner une bonne définition de ce qu’est un hook, rien de mieux que la documentation officielle.

Bon grossièrement, le système de hooks permet d’interagir avec le corps de Drupal et les modules installés, c’est tellement surpuissant que le module Chuck Norris utilise le concept de hook.

Un hook c’est quoi ? Un hook ce n’est ni plus ni moins qu’une fonction PHP nommée foo_bar(), ou “foo” désigne le nom de votre module (le nom du module serait donc foo.module) et “bar” le nom d’un hook spécifique. Chaque hook possède un nombre défini de paramètres et un résultat spécifique. Bref rien de compliqué si vous avez déjà programmé.

Oui mais concrètement comment ça marche ? Prenez l’exemple de la mise à jour d’un contenu. Vous faites des modifications et vous sauvegardez, Drupal va alors déclencher son processus de sauvegarde et afin que les modules puissent intervenir sur les données en cours, il va déterminer quel modules ont implémenté ce hook afin de leur donner la main.
Ce qu’il faut comprendre c’est que lorsqu’un hook est déclenché, Drupal parcourt tous les modules afin de connaître les modules voulant prendre la parole.

Si toutefois ce n’est toujours pas clair, voici la définition de wikipédia, mais je suis sûr qu’elle vous sera inutile :)

Les hooks à connaitre :

Vous l’aurez compris, pour maîtriser Drupal et en faire ce que vous voulez, il va vous falloir connaître les différents hooks à votre disposition. J’ai essayé ici de vous créer une petite liste de hooks qui vont vous permettre de débuter facilement, mais dîtes vous bien qu’il en existe beaucoup plus, je vous laisse le plaisir de les découvrir par vous même.

Note : Il y a eu plein d’évolutions entre D6 et D7 et l’une d’entre elle a consisté à diviser les hooks intervenant lors d’actions spécifiques. Par exemple le hook_nodeapi (que l’on verra par la suite) avait en D6 un deuxième paramètre nommé $op qui pouvait prendre différentes valeurs comme : load, insert, delete, view… Ainsi lorsque vous vouliez intervenir lors du chargement ou de la suppression d’un node, vous n’aviez qu’à implémenter ce hook et vérifier la valeur de la variable $op. Maintenant le hook_nodeapi n’existe plus, il a été remplacé par autant de hooks qu’il y avait d’actions. Grâce à cela, on a gagné en lisibilité du code mais on a augmenté le nombre de hooks disponibles. Ainsi plusieurs hooks que vous connaissiez en D6 ont été revus.

Gestion des blocs

Si vous utilisez Drupal, vous avez sûrement déjà dû créer un bloc depuis le back office. Comme souvent lorsqu’il est possible de faire quelque chose depuis l’interface d’administration, il est possible de le faire en code. Ainsi grâce à quelques hooks, il est facile de créer, gérer et de configurer les blocs.

hook_block_info : N’importe quel module peut ajouter des blocs, mais encore faut-il que drupal le sache, grâce à ce hook vous allez pouvoir déclarer l’ajout d’un ou de plusieurs blocs.

hook_block_view : Une fois que vous avez déclaré votre bloc il vous faut créer son contenu avec la fonction hook_block_view.

hook_block_configure : Pour chaque bloc vous pouvez ajouter un formulaire de configuration plus complet que celui fourni par défaut et pour cela il vous faut utiliser ce hook.

hook_block_save : Si vous avez mis en place le hook ci-dessus vous devez aussi utiliser le hook_bloc_save afin de sauvegarder les informations renseignées dans votre formulaire.

Liste des hooks liés aux blocs

Prenez vos contenus en main

Drupal étant un outil de gestion de contenus, vous vous doutez bien que c’est sur cette partie que l’on peut faire le plus de modifications :) Avec cette petite liste de hooks, vous trouverez forcément le bon moment pour interagir avec vos contenus.

hook_node_load – ce hook est exécuté lorsqu’un node est chargé depuis la base de données, c’est donc l’étape idéale si vous avez des données à modifier lors du chargement.

hook_node_view – à chaque fois que vous affichez un node sur votre site c’est le hook_view qui est invoqué. En gros c’est le hook que vous allez utiliser pour modifier le rendu à vos visiteurs.

hook_node_presave – c’est un hook utile puisqu’il permet d’intervenir sur les données juste avant la sauvegarde en base. Ce hook est appelé lors de l’insertion comme lors de la mise à jour.

hook_node_insert – le hook_node_insert est invoqué lors de la création du contenu en base et uniquement lors de la création

hook_node_update – à l’inverse celui-ci n’est invoqué que lors de la mise à jour du contenu.

hook_node_prepare – pour créer un nouveau contenu sur votre site vous devez utiliser le formulaire de création de contenus et justement le hook_node_prepare vous permet d’avoir la main sur celui-ci avant qu’il ne soit affiché à vos utilisateurs. Parfait si vous voulez remplir ou présélectionner des valeurs.

hook_node_delete : avec un nom si explicite, vous l’aurez compris qu’il s’agit du hook qui permet d’intervenir lorsqu’un contenu est supprimé.

Liste des hooks liés aux nodes

hook_permission : Dans la partie contenu on peut aussi y ajouter le hook_permission (connu sous le nom de hook_perm en D6) qui permet de créer de nouveaux droits d’accès que vous pourrez utiliser dans vos modules afin de restreindre ou non l’accès à vos fonctionnalités.

Les formulaires

hook_form_alter et hook_form_FORM_ID_alter : deux hooks qui ont leur importance puisque grâce à eux vous allez pouvoir modifier n’importe quel formulaire sur le site afin d’y ajouter des champs, ajouter des fonctions de validation ou encore altérer les données saisies.
Le hook_form_alter est appelé pour n’importe quel formulaire sur votre site, c’est à vous de savoir si vous êtes sur le formulaire souhaité. Si vous voulez modifier un formulaire en particulier, utilisez plutôt le deuxième hook qui ne sera invoqué que pour le FORM_ID précisé. Vous pouvez par exemple utiliser le hook_form_alter pour connaître la valeur de $form_id puis utiliser le hook_form_FORM_ID_alter.

L’administration de vos modules

Il y a trois hooks à connaître pour l’administration des modules, le hook_install et hook_uninstall qui vont de paire et le hook_update.

hook_install : ce hook est le premier invoqué lors de l’activation d’un module, c’est pendant cette étape que l’on doit par exemple installer les tables SQL nécessaires au module ainsi que la configuration par défaut de celui-ci.

hook_uninstall : C’est l’inverse du hook_install, celui-ci sert à supprimer tout ce qui touche au module, données en bases, schémas, variables… Notez que ce hook n’est pas exécuté à la désactivation du module mais lors de sa désinstallation.

hook_update_N : Le code d’un module n’est jamais figé et est souvent amené à évoluer. Grâce au hook_update_N vous allez pouvoir intervenir sur votre module afin de mettre à jour sa configuration, les données contenues dans ses tables ou même celles d’un autre module, (au passage, n’oubliez pas de mettre à jour le schéma de la base de données). N désigne le numéro de version à mettre et est découpé en 3 parties. Le premier chiffre correspond à la version de Drupal utilisé, le deuxième à la version de votre module et les deux derniers afin d’identifier les différentes mises à jour. Par exemple, la deuxième update d’un module en version 2.1 sur un Drupal 7 aura pour valeur : hook_update_7202
Pour installer vos mises à jour, il suffit de vous rendre sur la page /update.php ou alors d’utiliser les commandes Drush faites pour ça.

Gestion des urls de votre site

hook_menu : l’un des hooks les plus utilisés, mais bien que son nom évoque la gestion des menus, celui-ci permet en fait de créer de nouvelles urls sur votre site afin de mettre en place de nouvelles pages, de nouveaux formulaires ou n’importe quel service ayant besoin d’une adresse. C’est lors de la mise en place de ce hook que l’on peut utiliser le hook_permission afin de restreindre l’accès à une page en fonction d’un rôle.

hook_menu_alter : permet de modifier les propriétés de n’importe quelle url définie dans un hook_menu. Par exemple vous pouvez modifier, le titre d’une page, les droits d’accès, voir même surcharger la page callback.

Drupal et les hooks systems

hook_cron : ce hook vous permet d’exécuter des actions périodiques depuis votre Drupal, comme par exemple l’envoi de mail, la mise à jour de fichiers ou encore la génération de backup. Personnellement je préfère utiliser la cron du serveur plutôt que celle de Drupal, mais pour cela il faut avoir accès aux serveurs ce qui n’est pas possible sur un mutualisé.

hook_mail : c’est le hook à implémenter si vous voulez envoyer des emails via Drupal. Celui-ci permet aux modules de préparer des messages qui seront envoyés par la suite avec la fonction drupal_mail.

hook_mail_alter : permet de modifier les messages envoyés par les autres modules

Thème

hook_theme : recense toutes les fonctions de thème disponible sur votre site, ainsi lorsqu’un module doit implémenter une nouvelle fonction, il suffit de la déclarer au moyen de ce hook. Une fois connue par Drupal, celle-ci devient disponible à tout moment et peut être utilisée grâce à la fonction theme().


J’espère que cette liste et ces quelques explications sur le système de hook vous permettront de mieux comprendre et utiliser Drupal, il existe beaucoup plus de hook que ce qu’il y a dans cet article mais pour les découvrir il vous faudra explorer Drupal par vous même. En attendant vous trouverez ici la liste de tous les hooks que vous pourrez rencontrer avec Drupal 7

Cet article Les hooks : connaître Drupal pour créer vos modules est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Les hooks : connaître Drupal pour créer vos modules

Les hooks : connaître Drupal pour créer vos modules

Ce qu’il y a de bien avec Drupal c’est que l’on a l’impression de jouer aux lego, un module par ci, un module par là et le tout, imbriqué depuis l’interface d’administration de celui-ci. Mais comme moi, un jour vous avez voulu créer vous même vos structures et non plus seulement réaliser ce qu’il était possible de faire avec une simple boite de lego. Bref, vous avez déjà eu besoin de développer votre propre module afin de tordre le système et le faire coller à votre cahier des charges.

Cette nécessité de faire son propre module arrive bien plus vite qu’on ne le croit et c’est pour ça que je me suis dit qu’une petite liste des principales choses à connaître pour jouer avec Drupal serait utile. Du coup, j’ai essayé de me replacer quelques mois en arrière, à mes débuts avec Drupal et son api et je vous ai listé les principaux hooks que vous pourrez être amenés à utiliser au départ.

Concept et implémentation d’un hook

Avant d’aller plus loin, il y a une notion à comprendre pour développer un module avec Drupal et j’espère pour vous que vous avez déjà entendu ce mot : ‘hook’, sinon il va falloir réviser les bases de Drupal :p
Pour vous donner une bonne définition de ce qu’est un hook, rien de mieux que la documentation officielle.

Bon grossièrement, le système de hooks permet d’interagir avec le corps de Drupal et les modules installés, c’est tellement surpuissant que le module Chuck Norris utilise le concept de hook.

Un hook c’est quoi ? Un hook ce n’est ni plus ni moins qu’une fonction PHP nommée foo_bar(), ou “foo” désigne le nom de votre module (le nom du module serait donc foo.module) et “bar” le nom d’un hook spécifique. Chaque hook possède un nombre défini de paramètres et un résultat spécifique. Bref rien de compliqué si vous avez déjà programmé.

Oui mais concrètement comment ça marche ? Prenez l’exemple de la mise à jour d’un contenu. Vous faites des modifications et vous sauvegardez, Drupal va alors déclencher son processus de sauvegarde et afin que les modules puissent intervenir sur les données en cours, il va déterminer quel modules ont implémenté ce hook afin de leur donner la main.
Ce qu’il faut comprendre c’est que lorsqu’un hook est déclenché, Drupal parcourt tous les modules afin de connaître les modules voulant prendre la parole.

Si toutefois ce n’est toujours pas clair, voici la définition de wikipédia, mais je suis sûr qu’elle vous sera inutile :)

Les hooks à connaitre :

Vous l’aurez compris, pour maîtriser Drupal et en faire ce que vous voulez, il va vous falloir connaître les différents hooks à votre disposition. J’ai essayé ici de vous créer une petite liste de hooks qui vont vous permettre de débuter facilement, mais dîtes vous bien qu’il en existe beaucoup plus, je vous laisse le plaisir de les découvrir par vous même.

Note : Il y a eu plein d’évolutions entre D6 et D7 et l’une d’entre elle a consisté à diviser les hooks intervenant lors d’actions spécifiques. Par exemple le hook_nodeapi (que l’on verra par la suite) avait en D6 un deuxième paramètre nommé $op qui pouvait prendre différentes valeurs comme : load, insert, delete, view… Ainsi lorsque vous vouliez intervenir lors du chargement ou de la suppression d’un node, vous n’aviez qu’à implémenter ce hook et vérifier la valeur de la variable $op. Maintenant le hook_nodeapi n’existe plus, il a été remplacé par autant de hooks qu’il y avait d’actions. Grâce à cela, on a gagné en lisibilité du code mais on a augmenté le nombre de hooks disponibles. Ainsi plusieurs hooks que vous connaissiez en D6 ont été revus.

Gestion des blocs

Si vous utilisez Drupal, vous avez sûrement déjà dû créer un bloc depuis le back office. Comme souvent lorsqu’il est possible de faire quelque chose depuis l’interface d’administration, il est possible de le faire en code. Ainsi grâce à quelques hooks, il est facile de créer, gérer et de configurer les blocs.

hook_block_info : N’importe quel module peut ajouter des blocs, mais encore faut-il que drupal le sache, grâce à ce hook vous allez pouvoir déclarer l’ajout d’un ou de plusieurs blocs.

hook_block_view : Une fois que vous avez déclaré votre bloc il vous faut créer son contenu avec la fonction hook_block_view.

hook_block_configure : Pour chaque bloc vous pouvez ajouter un formulaire de configuration plus complet que celui fourni par défaut et pour cela il vous faut utiliser ce hook.

hook_block_save : Si vous avez mis en place le hook ci-dessus vous devez aussi utiliser le hook_bloc_save afin de sauvegarder les informations renseignées dans votre formulaire.

Liste des hooks liés aux blocs

Prenez vos contenus en main

Drupal étant un outil de gestion de contenus, vous vous doutez bien que c’est sur cette partie que l’on peut faire le plus de modifications :) Avec cette petite liste de hooks, vous trouverez forcément le bon moment pour interagir avec vos contenus.

hook_node_load – ce hook est exécuté lorsqu’un node est chargé depuis la base de données, c’est donc l’étape idéale si vous avez des données à modifier lors du chargement.

hook_node_view – à chaque fois que vous affichez un node sur votre site c’est le hook_view qui est invoqué. En gros c’est le hook que vous allez utiliser pour modifier le rendu à vos visiteurs.

hook_node_presave – c’est un hook utile puisqu’il permet d’intervenir sur les données juste avant la sauvegarde en base. Ce hook est appelé lors de l’insertion comme lors de la mise à jour.

hook_node_insert – le hook_node_insert est invoqué lors de la création du contenu en base et uniquement lors de la création

hook_node_update – à l’inverse celui-ci n’est invoqué que lors de la mise à jour du contenu.

hook_node_prepare – pour créer un nouveau contenu sur votre site vous devez utiliser le formulaire de création de contenus et justement le hook_node_prepare vous permet d’avoir la main sur celui-ci avant qu’il ne soit affiché à vos utilisateurs. Parfait si vous voulez remplir ou présélectionner des valeurs.

hook_node_delete : avec un nom si explicite, vous l’aurez compris qu’il s’agit du hook qui permet d’intervenir lorsqu’un contenu est supprimé.

Liste des hooks liés aux nodes

hook_permission : Dans la partie contenu on peut aussi y ajouter le hook_permission (connu sous le nom de hook_perm en D6) qui permet de créer de nouveaux droits d’accès que vous pourrez utiliser dans vos modules afin de restreindre ou non l’accès à vos fonctionnalités.

Les formulaires

hook_form_alter et hook_form_FORM_ID_alter : deux hooks qui ont leur importance puisque grâce à eux vous allez pouvoir modifier n’importe quel formulaire sur le site afin d’y ajouter des champs, ajouter des fonctions de validation ou encore altérer les données saisies.
Le hook_form_alter est appelé pour n’importe quel formulaire sur votre site, c’est à vous de savoir si vous êtes sur le formulaire souhaité. Si vous voulez modifier un formulaire en particulier, utilisez plutôt le deuxième hook qui ne sera invoqué que pour le FORM_ID précisé. Vous pouvez par exemple utiliser le hook_form_alter pour connaître la valeur de $form_id puis utiliser le hook_form_FORM_ID_alter.

L’administration de vos modules

Il y a trois hooks à connaître pour l’administration des modules, le hook_install et hook_uninstall qui vont de paire et le hook_update.

hook_install : ce hook est le premier invoqué lors de l’activation d’un module, c’est pendant cette étape que l’on doit par exemple installer les tables SQL nécessaires au module ainsi que la configuration par défaut de celui-ci.

hook_uninstall : C’est l’inverse du hook_install, celui-ci sert à supprimer tout ce qui touche au module, données en bases, schémas, variables… Notez que ce hook n’est pas exécuté à la désactivation du module mais lors de sa désinstallation.

hook_update_N : Le code d’un module n’est jamais figé et est souvent amené à évoluer. Grâce au hook_update_N vous allez pouvoir intervenir sur votre module afin de mettre à jour sa configuration, les données contenues dans ses tables ou même celles d’un autre module, (au passage, n’oubliez pas de mettre à jour le schéma de la base de données). N désigne le numéro de version à mettre et est découpé en 3 parties. Le premier chiffre correspond à la version de Drupal utilisé, le deuxième à la version de votre module et les deux derniers afin d’identifier les différentes mises à jour. Par exemple, la deuxième update d’un module en version 2.1 sur un Drupal 7 aura pour valeur : hook_update_7202
Pour installer vos mises à jour, il suffit de vous rendre sur la page /update.php ou alors d’utiliser les commandes Drush faites pour ça.

Gestion des urls de votre site

hook_menu : l’un des hooks les plus utilisés, mais bien que son nom évoque la gestion des menus, celui-ci permet en fait de créer de nouvelles urls sur votre site afin de mettre en place de nouvelles pages, de nouveaux formulaires ou n’importe quel service ayant besoin d’une adresse. C’est lors de la mise en place de ce hook que l’on peut utiliser le hook_permission afin de restreindre l’accès à une page en fonction d’un rôle.

hook_menu_alter : permet de modifier les propriétés de n’importe quelle url définie dans un hook_menu. Par exemple vous pouvez modifier, le titre d’une page, les droits d’accès, voir même surcharger la page callback.

Drupal et les hooks systems

hook_cron : ce hook vous permet d’exécuter des actions périodiques depuis votre Drupal, comme par exemple l’envoi de mail, la mise à jour de fichiers ou encore la génération de backup. Personnellement je préfère utiliser la cron du serveur plutôt que celle de Drupal, mais pour cela il faut avoir accès aux serveurs ce qui n’est pas possible sur un mutualisé.

hook_mail : c’est le hook à implémenter si vous voulez envoyer des emails via Drupal. Celui-ci permet aux modules de préparer des messages qui seront envoyés par la suite avec la fonction drupal_mail.

hook_mail_alter : permet de modifier les messages envoyés par les autres modules

Thème

hook_theme : recense toutes les fonctions de thème disponible sur votre site, ainsi lorsqu’un module doit implémenter une nouvelle fonction, il suffit de la déclarer au moyen de ce hook. Une fois connue par Drupal, celle-ci devient disponible à tout moment et peut être utilisée grâce à la fonction theme().

J’espère que cette liste et ces quelques explications sur le système de hook vous permettront de mieux comprendre et utiliser Drupal, il existe beaucoup plus de hook que ce qu’il y a dans cet article mais pour les découvrir il vous faudra explorer Drupal par vous même. En attendant vous trouverez ici la liste de tous les hooks que vous pourrez rencontrer avec Drupal 7

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcon London 2011, retour sur l’événement.

Ca y est l’événement Drupal européen de l’année est passé et il faudra maintenant attendre un an pour retrouver autant de Drupaleur réunis en un seul et même endroit en Europe.
Cette conférence à Londres m’a permis de découvrir cette charmante capitale et au passage, on a eu le droit à une visite en règle. Nous avons eu le plaisir de goûter à la pluie londonienne, enfin à ce stade là, ce n’était plus de la pluie mais des trombes d’eau qui déferlaient du ciel… (je comprends pourquoi les parapluies ne sont pas chers dans les boutiques pour touristes :)

Alors cette conférence ?

Ce qu’il y a de bien pendant une Drupalcon c’est qu’il y en a pour tout le monde, les développeurs, les thémeurs, les sites builders et même pour les chefs de projet, ainsi que pour tous les niveaux. Avec plus de 25 sessions par jour, sans compter les BoFs, difficile de ne pas trouver son bonheur.
Néanmoins j’ai trouvé que certaines sessions n’étaient pas assez avancées, enfin pas autant que je l’esperais. Mon impression est aussi celle de quelques autres développeurs qui comme moi, sont restés sur leur faim pour quelques unes d’entre elles. A côté de cela, les sessions «core» (qui parlent du corps de Drupal, souvent de Drupal8 et où l’on trouve toutes les rock-stars) étaient intéressantes.

Je ne sais pas si vous avez suivi la keynote d’ouverture, mais celle-ci ne m’a pas emballée. Le message que j’ai capté est que maintenant, Drupal est un produit qu’il faut vendre et qu’il va falloir faire du marketing pour le rendre encore plus populaire. C’est bien me direz-vous, que ce soit pour Drupal ou pour son écosystème, mais le problème est qu’actuellement, on (les entreprises qui font du Drupal) n’arrive déjà pas à répondre à la demande et que l’on (toujours les drupal factories) n’arrive pas à embaucher des personnes qualifiées alors pourquoi faire du marketing au risque de refuser des projets. Quelque chose m’échappe et ça me chagrine. Lors de cette keynote on a aussi eu le droit à plein de slides avec des chiffres comme s’il y avait quelque chose à justifier… D’ailleurs je n’ai pas compris la slide sur le fait qu’il a fallut 12 mois pour avoir 100.000 sites en Drupal 6 alors qu’il n’en a fallut que 6 pour atteindre le même chiffre sur Drupal 7. Sur quoi sont basés ces stats ? Le nombre de sites en ligne ? Le nombre de téléchargement sur drupal.org ? Bref, c’était pas la keynote la plus emballante de l’histoire.

Bon n’allez pas croire, après la lecture de ce précédent paragraphe que ça n’en valait pas le coup, c’était super chouette et il y avait quelques sessions qui valaient le déplacement:

N’ayant pu assister qu’à une seule session par créneau horaire (non je ne fais pas encore dans la projection astrale), il faut que je regarde les sessions que j’ai loupées. N’hésitez donc pas à compléter la liste ci-dessus.

Mention spéciale à l’équipe organisatrice qui, dès le lendemain des sessions, mettait en ligne les vidéos des conférences. Bravo pour l’efficacité!
Mais comme tout Drupaleur qui va à une Drupalcon, on n’y va pas uniquement pour les sessions, on y va aussi pour rencontrer des personnes de qualité qui ont des étoiles qui brillent dans les yeux quand on discute de technos… Bref, ça a été l’occasion de faire de chouettes rencontres et de revoir des gens que l’on n’avait pas vu depuis un moment.


Nous étions quand plus de 1700 participants, dont 80 Français. Pas mal, non ? On s’aperçoit que l’on était bien à une conférence info lorsqu’on voit le stats de bande passante utilisée, de mails échangés et de messages twitter envoyés. Affolants ces geeks… Avec un si grand nombre de participants, je comprends qu’il était difficile de faire la Drupalcon dans Londres. Heureusement que les transports Londoniens sont très efficaces, cela nous a permis de pas mettre trop de temps pour rentrer de Croydon au centre de Londres. Par contre c’est dommage qu’il y ait eu autant de distance entre les sessions, les bofs et les conférences core, mais bon je pense qu’ils n’ont pas pu faire autrement avec autant de participants.

La Drupalcon est un excellent booster, je rentre chez moi avec un bon souvenir, plein de motivation et l’intention de tester de nouvelles choses ! Merci à Ideia de m’avoir donné la chance d’aller à cette Drupalcon et merci aux organisateurs pour avoir organisé cette conférence annuelle.

Et vous qui étiez là-bas ou à distance, qu’avez vous pensé de cette conférence ?

La prochaine c’est où et c’est pour quand ?

Pendant que j’y suis et pour une fois qu’il ne s’agit pas d’un post technique, j’en profite pour rappeler que la prochaine Drupalcon Européenne aura lieu à Munich du 20 au 23 août 2012 et promet aux vues des organisateurs d’être encore meilleure que celle-ci. Bon courage à l’équipe organisatrice!

Crédits Photos – macetaria, wwphotos, pixelmord, batigolix

Cet article Drupalcon London 2011, retour sur l’événement. est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Drupalcon London 2011, retour sur l’événement.

Drupalcon London 2011, retour sur l'événement.

Ca y est l’événement Drupal européen de l’année est passé et il faudra maintenant attendre un an pour retrouver autant de Drupaleur réunis en un seul et même endroit en Europe.
Cette conférence à Londres m’a permis de découvrir cette charmante capitale et au passage, on a eu le droit à une visite en règle. Nous avons eu le plaisir de goûter à la pluie londonienne, enfin à ce stade là, ce n’était plus de la pluie mais des trombes d’eau qui déferlaient du ciel… (je comprends pourquoi les parapluies ne sont pas chers dans les boutiques pour touristes :)

Alors cette conférence ?

Ce qu’il y a de bien pendant une Drupalcon c’est qu’il y en a pour tout le monde, les développeurs, les thémeurs, les sites builders et même pour les chefs de projet, ainsi que pour tous les niveaux. Avec plus de 25 sessions par jour, sans compter les BoFs, difficile de ne pas trouver son bonheur.
Néanmoins j’ai trouvé que certaines sessions n’étaient pas assez avancées, enfin pas autant que je l’esperais. Mon impression est aussi celle de quelques autres développeurs qui comme moi, sont restés sur leur faim pour quelques unes d’entre elles. A côté de cela, les sessions «core» (qui parlent du corps de Drupal, souvent de Drupal8 et où l’on trouve toutes les rock-stars) étaient intéressantes.

Je ne sais pas si vous avez suivi la keynote d’ouverture, mais celle-ci ne m’a pas emballée. Le message que j’ai capté est que maintenant, Drupal est un produit qu’il faut vendre et qu’il va falloir faire du marketing pour le rendre encore plus populaire. C’est bien me direz-vous, que ce soit pour Drupal ou pour son écosystème, mais le problème est qu’actuellement, on (les entreprises qui font du Drupal) n’arrive déjà pas à répondre à la demande et que l’on (toujours les drupal factories) n’arrive pas à embaucher des personnes qualifiées alors pourquoi faire du marketing au risque de refuser des projets. Quelque chose m’échappe et ça me chagrine. Lors de cette keynote on a aussi eu le droit à plein de slides avec des chiffres comme s’il y avait quelque chose à justifier… D’ailleurs je n’ai pas compris la slide sur le fait qu’il a fallut 12 mois pour avoir 100.000 sites en Drupal 6 alors qu’il n’en a fallut que 6 pour atteindre le même chiffre sur Drupal 7. Sur quoi sont basés ces stats ? Le nombre de sites en ligne ? Le nombre de téléchargement sur drupal.org ? Bref, c’était pas la keynote la plus emballante de l’histoire.

Bon n’allez pas croire, après la lecture de ce précédent paragraphe que ça n’en valait pas le coup, c’était super chouette et il y avait quelques sessions qui valaient le déplacement:

N’ayant pu assister qu’à une seule session par créneau horaire (non je ne fais pas encore dans la projection astrale), il faut que je regarde les sessions que j’ai loupées. N’hésitez donc pas à compléter la liste ci-dessus.

Mention spéciale à l’équipe organisatrice qui, dès le lendemain des sessions, mettait en ligne les vidéos des conférences. Bravo pour l’efficacité!
Mais comme tout Drupaleur qui va à une Drupalcon, on n’y va pas uniquement pour les sessions, on y va aussi pour rencontrer des personnes de qualité qui ont des étoiles qui brillent dans les yeux quand on discute de technos… Bref, ça a été l’occasion de faire de chouettes rencontres et de revoir des gens que l’on n’avait pas vu depuis un moment.


Nous étions quand plus de 1700 participants, dont 80 Français. Pas mal, non ? On s’aperçoit que l’on était bien à une conférence info lorsqu’on voit le stats de bande passante utilisée, de mails échangés et de messages twitter envoyés. Affolants ces geeks… Avec un si grand nombre de participants, je comprends qu’il était difficile de faire la Drupalcon dans Londres. Heureusement que les transports Londoniens sont très efficaces, cela nous a permis de pas mettre trop de temps pour rentrer de Croydon au centre de Londres. Par contre c’est dommage qu’il y ait eu autant de distance entre les sessions, les bofs et les conférences core, mais bon je pense qu’ils n’ont pas pu faire autrement avec autant de participants.

La Drupalcon est un excellent booster, je rentre chez moi avec un bon souvenir, plein de motivation et l’intention de tester de nouvelles choses ! Merci à Ideia de m’avoir donné la chance d’aller à cette Drupalcon et merci aux organisateurs pour avoir organisé cette conférence annuelle.

Et vous qui étiez là-bas ou à distance, qu’avez vous pensé de cette conférence ?

La prochaine c’est où et c’est pour quand ?

Pendant que j’y suis et pour une fois qu’il ne s’agit pas d’un post technique, j’en profite pour rappeler que la prochaine Drupalcon Européenne aura lieu à Munich du 20 au 23 août 2012 et promet aux vues des organisateurs d’être encore meilleure que celle-ci. Bon courage à l’équipe organisatrice!

Crédits Photos – macetaria, wwphotos, pixelmord, batigolix

Par juliendubreuil
julien dubreuil
Drupal since 2009

Comment créer et mettre à jour un node par la programmation

Comment créer et mettre à jour un node par la programmation

Bien que cela puisse paraître compliqué de l’extérieur, créer et modifier des contenus Drupal sans l’aide de l’interface d’administration est une chose relativement simple lorsque l’on s’est déjà confronté au problème. Néanmoins il faut être prudent avec ce que vous voulez sauvegarder, puisqu’en outrepassant le système naturel de création de contenus via l’interface d’admin vous avez la possibilité de faire tout et n’importe quoi et d’empêcher les autres modules de fonctionner correctement.

Voici donc un poste très simple sur la création de nodes via la programmation.

1.1 Initialisation de l’objet node


1
2
3
4
5
6
7
8
9
10
11
12
<span class='line'><span class="nv">$node</span> <span class="o">=</span> <span class="k">new</span> <span class="k">stdClass</span><span class="p">();</span> <span class="c1">// Création d’un nouvel objet</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">type</span> <span class="o">=</span> <span class="s2">&quot;article&quot;</span><span class="p">;</span> <span class="c1">// Spécification du type de contenu à créer</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">title</span> <span class="o">=</span> <span class="s2">&quot;Le titre de votre nouveau node&quot;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span> <span class="o">=</span> <span class="nx">LANGUAGE_NONE</span><span class="p">;</span> <span class="c1">// Définition de la langue du contenu.</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">path</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;alias&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;article/chuck-norris-is-a-jedi&#39;</span><span class="p">);</span> <span class="c1">// Ajout de l’url du contenu</span>
</span><span class='line'><span class="nx">node_object_prepare</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Création des valeurs par défaut.</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">uid</span> <span class="o">=</span> <span class="mi">14</span><span class="p">;</span> <span class="c1">// Ajout de l’auteur du node si vous souhaitez qu&#39;il soit différent de l&#39;utilisateur en cours</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Do your stuff</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$node</span> <span class="o">=</span> <span class="nx">node_submit</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Prépare le node avant l’enregistrement (date + auteur) si les champs sont vides.</span>
</span><span class='line'><span class="nx">node_save</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span> <span class="c1">// Enregistrement du node.</span>
</span>

Notes :
* Définition de la langue : Si le module Locale n’est pas activé sur votre site, utilisez la constante LANGUAGE_NONE afin de ne pas spécifier de langue en particulier à votre contenu, sinon insérez la langue désirée.

* Node_object_prepare() : remplit par défaut certaines valeurs telles que le statut, la promotion en page d’accueil, les commentaires ou encore le sticky.

1.2 Ajout du champ body

Au passage, depuis cette dernière version le champ body n’est plus obligatoire et peut être supprimé/caché depuis l’interface de gestion des champs.


1
2
3
4
<span class='line'><span class="nv">$body_text</span> <span class="o">=</span> <span class="s1">&#39;Chuck Norris donne fréquemment du sang à la Croix-Rouge. Mais jamais le sien.&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$body_text</span><span class="p">;</span> <span class="c1">// Votre texte</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;summary&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">text_summary</span><span class="p">(</span><span class="nv">$body_text</span><span class="p">);</span> <span class="c1">// Résumé de votre champ body si vous en voulez un.</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">body</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;format&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;filtered_html&#39;</span><span class="p">;</span> <span class="c1">// Format d’entrée du champ.</span>
</span>

Notez ici la réutilisation du champ $node->language défini à l’étape précédente, cette variable vous servira souvent pour récupérer les informations de vos champs.

1.3 Remplissez vos champs

Rien de compliqué puisque la manip’ est la même que pour le champ body, il suffit d’ajouter la valeur désirée dans le champ voulu.


1
<span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_text_list</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;Pomme&#39;</span><span class="p">;</span>
</span>

Par contre certain champ ont besoin de plus d’informations comme le champ texte à qui il faut renseigner le format d’entrée.


1
2
<span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_custom_name</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;value&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;Texte dans mon champ custom&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_custom_name</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;format&#39;</span><span class="p">]</span>  <span class="o">=</span> <span class="s1">&#39;text_format&#39;</span><span class="p">;</span> <span class="c1">// Si votre champ à un format d’entrée n’oubliez pas  de le renseigner.</span>
</span>

1.4 Renseigner un champ nodereference

Si vous utilisez le module nodereference pour lier vos contenus, il vous suffit simplement d’indiquer le nid du node dans le champ pour que cela fonctionne.


1
<span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_nodereference</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][][</span><span class="s1">&#39;nid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">12</span><span class="p">;</span>
</span>

1.5 Insérer un terme à votre node

Si votre terme existe déjà, ajoutez simplement l’Id de celui-ci à votre champ.


1
<span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_tags</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][][</span><span class="s1">&#39;tid&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span> <span class="c1">// field_tags, correspond au nom du champ et 8 à son id</span>
</span>



Sinon, si vous voulez en créer un nouveau procédez comme suit :


1
2
3
4
5
6
<span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_tags</span><span class="p">[</span><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">language</span><span class="p">][]</span> <span class="o">=</span> <span class="k">array</span> <span class="p">(</span>
</span><span class='line'>  <span class="s1">&#39;vid&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>  <span class="c1">// Id du vocabulaire</span>
</span><span class='line'>  <span class="s1">&#39;tid&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;autocreate&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;name&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Mon term&#39;</span><span class="p">,</span> <span class="c1">// Votre term</span>
</span><span class='line'>  <span class="s1">&#39;vocabulary_machine_name&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;tags&#39;</span>
</span><span class='line'><span class="p">);</span>
</span>

1.6 Ajouter un fichier

Le nouveau système de fichier mérite un post à lui tout seul pour bien le comprendre et s’en servir, du coup je vous livre toute faite la solution pour ajouter un fichier déjà présent sur votre site à votre contenu.


1
2
3
4
5
6
7
8
9
10
<span class='line'><span class="nv">$filepath</span> <span class="o">=</span> <span class="nx">drupal_realpath</span><span class="p">(</span><span class="s1">&#39;misc/druplicon.png&#39;</span><span class="p">);</span>  <span class="c1">// Création du chemin du fichier</span>
</span><span class='line'><span class="c1">// Création de l’objet contenant les propriétés du fichier.</span>
</span><span class='line'><span class="nv">$file</span> <span class="o">=</span> <span class="p">(</span><span class="nx">object</span><span class="p">)</span> <span class="k">array</span><span class="p">(</span>
</span><span class='line'>  <span class="s1">&#39;uid&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;uri&#39;</span> <span class="o">=&gt;</span> <span class="nv">$filepath</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;filemime&#39;</span> <span class="o">=&gt;</span> <span class="nx">file_get_mimetype</span><span class="p">(</span><span class="nv">$filepath</span><span class="p">),</span>
</span><span class='line'>  <span class="s1">&#39;status&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="nv">$file</span> <span class="o">=</span> <span class="nx">file_copy</span><span class="p">(</span><span class="nv">$file</span><span class="p">,</span> <span class="s1">&#39;public://&#39;</span><span class="p">);</span> <span class="c1">// On déplace le fichier à la racine du système de fichiers</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">field_image</span><span class="p">[</span><span class="nx">LANGUAGE_NONE</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="k">array</span><span class="p">)</span><span class="nv">$file</span><span class="p">;</span> <span class="c1">// On assigne le fichier au champ</span>
</span>

2 Mise à jour du contenu


1
2
3
4
<span class='line'><span class="nv">$nid</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="nv">$node</span> <span class="o">=</span> <span class="nx">node_load</span><span class="p">(</span><span class="nv">$nid</span><span class="p">);</span>
</span><span class='line'><span class="nv">$node</span><span class="o">-&gt;</span><span class="na">title</span> <span class="o">=</span> <span class="s1">&#39;Mise à jour du titre&#39;</span><span class="p">;</span>
</span><span class='line'><span class="nx">node_save</span><span class="p">(</span><span class="nv">$node</span><span class="p">);</span>
</span>

On charge le node avec un id, on met à jour le champ qui nous intéresse et on le sauvegarde. Si vous avez plusieurs nodes à mettre à jour, utilisez la fonction node_load_multiple() qui vous évitera de faire plusieurs requêtes sur la base de données.

Voilà, j’espère que cet article et les quelques liens ci-dessous vous permettront de vous aider. Il y a pas mal de modules qui font de la création de nodes comme ça. En trouver un et le décortiquer reste la meilleure solution pour apprendre. Si toutefois vous avez plus d’informations, je suis preneur :)

Voici les quelques sources qui m’ont aidées à comprendre les changements de cette nouvelle version:

Crédits Photo – kikkerperspectief

Par Artusamak
Julien Dubois

Info utile #1 – Les fonctions de validation

Voilà un billet d’un style un peu différent, plus court qu’à l’habitude, à propos d’une information bête au sujet des fonctions de validation qui m’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 cette fonction n’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.

En fait il faut savoir que lorsque vous cliquez sur un élément de formulaire de type bouton, ses fonctions de validation et d’exécution sont exécutée et seulement celles de ce bouton. Ce qui au final est logique car cela vous permet d’avoir un comportement différent par bouton sans avoir de risque d’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 form_execute_handlers().

A noter également qu’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’agit de l’attribut #limit_validation_errors. 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’on a un bouton qui supprime un noeud par exemple.

Par badgones

Putty, SSH, OpenSSH, Windows et Linux

Voici un super tuto pour créer ses clés SSH, et pouvoir les utiliser à la fois sur Linux et Windows.

Using Putty on Windows to login Linux securely via OpenSSH

  • Submitted by: Man-wai CHANG
  • Update by: Man-wai CHANG
  • Date Submitted: 31 May 2006
  • Document Version: 1.0
  • Last Updated: 02/02/2008 18:46:43

This is a guide about using Putty on Windows with OpenSSH on Linux. You would learn about how to:

en lire plus

Par juliendubreuil
julien dubreuil
Drupal since 2009

Ajouter des classes CSS à la balise body facilement

Ajouter des classes CSS à la balise body facilement

Je ne sais pas si vous avez déjà voulu ajouter une classe sur la balise body en Drupal 6 mais ce n’était pas le truc le plus évident à faire. La meilleure solution se résumait à modifier le fichier template.php, à implémenter le hook template_preprocess() et à ajouter ses valeurs au tableau $vars[‘body_classes’], bref, par rapport au besoin c’était un poil compliqué.

Drupal 7 permet maintenant de faire ça plus facilement et directement dans un .module. Pour cela il faut utiliser le hook : hook_preprocess_HOOK() qui permet aux modules d’intervenir sur sur n’importe quel preprocess de thème.


1
2
3
4
5
6
7
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implements hook_preprocess_HOOK().</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">sandbox_preprocess_html</span><span class="p">(</span><span class="o">&amp;</span><span class="nv">$vars</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'> <span class="c1">// Ajout d&#39;une nouvelle classe au body</span>
</span><span class='line'> <span class="nv">$vars</span><span class="p">[</span><span class="s1">&#39;classes_array&#39;</span><span class="p">][]</span> <span class="o">=</span> <span class="s1">&#39;ma-nouvelle-classe&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Puisque la construction html de la page et donc la génération des classes pour le body est faite lors du template_preprocess_html il nous faut implémenter le hook_preprocess_html. Dans l’exemple ci-dessus j’ai juste ajouté une nouvelle classe à mon body mais vous pouvez faire tout ce que vous voulez lors de cette étape vous avez entre les mains toutes les infos permettant la construction de la structure html de la page.

Alors, la vie n’est pas plus simple avec Drupal 7 ? :)

Crédits Photo – exey

Pages