Planète JulienD

Par juliendubreuil
julien dubreuil
Drupal since 2009

Comment créer et appliquer des styles d’images avec Drupal 7 via le code

Cet article fait suite au précédent post : « Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI » ou je vous détaillais comment, via l’interface d’administration, créer un style d’image. Aujourd’hui le sujet reste le même, mais la création sera faite par la programmation.

Si comme moi, vous êtes confrontés à maintenir à jour des sites Drupal, vous avez déjà dû vous poser tout un tas de questions sur la pérennisation des configurations et de ce fait, vous vous êtes résignés à faire vos modifications directement depuis l’interface d’administration. Du coup, pour chaque chose simple qu’il est possible de faire via le back-office de Drupal, il faut trouver comment le faire en code.

Ainsi, sur la même base que l’article précédent, voici comment créer et appliquer un style d’image par la programmation.

Créer un style d’image via le code

La solution la plus simple consiste à implémenter le hook_image_default_styles() fourni par le module image, qui permet de définir un ou plusieurs style(s) d’images à Drupal dans votre fichier .module.

function sandbox_image_default_styles() {
  // La variable $style est un tableau et chaque composant sera un nouveau style.
  $styles = array();
  // La clé du tableau sera le nom machine de votre style. Pour qu’il  n’y ait pas de soucis contentez-vous de caractères alphanumériques,  d’underscores et de tirets.
  $styles['image_style_example'] = array();
  // Pour chaque style pour pouvez ajouter plusieurs effets
  $styles['image_style_example']['effects'] = array(
  // Premier effet à appliquer à l’image
    array(
      'name' => 'image_rotate',
      'data' => array(
      'degrees' => 2,
      'random' => 0,
      'bgcolor' => '#CECECE',
      ),
     'weight' => 0,
    ),
    // Deuxième effet
    array(
      'name' => 'image_scale',
      'data' => array(
      'width' => 200,
      'height' => 200,
      'upscale' => 1,
    ),
    'weight' => 1,
    ),
  );
  return $styles;
}

On ne peut plus simple non ? Vous trouverez toutes les informations concernant les effets de base disponibles dans le fichier image.effects.inc du module image.

Voici d’autres fonctions utiles si vous souhaitez intervenir sur les différents styles d’images :

- image_styles : pour récupérer tous les styles d’images.
- image_style_load : pour charger et obtenir les informations d’un style.
- image_style_save : pour sauvegarder un style (après une mise à jour par exemple).
- image_style_delete : pour supprimer un style

Si toutefois vous n’avez pas trouvé votre bonheur dans ces fonctions, voici toutes les fonctions et méthodes implémentées par le module images

Appliquer un style d’image

Pour appliquez un style d’image à une image il suffit simplement d’utiliser la fonction de thème : theme_image_style($variables).
$variables est un tableau composé de différents éléments :
- style_name: le nom du style que vous voulez appliquer
- path: Le chemin de l’image relatif au système de fichier de Drupal. (ex : public://mon-image.jpg)
- alt: un text alternatif au cas où l’image ne pourrait pas être affichée.
- title: Le titre de votre image. Celui-ci sera affiché lorsque l’image sera survolée
- attributes: un tableau associatif bien connu des fonctions de thème permettant de passer des attributs à la baslise img, tel que des class css…

Notez que votre image doit se trouver sur votre site, car cela ne fonctionne pas avec une image externe.

// Récupération de l’adresse de l’image.

$path = "images/funny_cat.jpg"; // Qui à pour adresse sites/default/files/images/funny_cat.jpg
// Transformation de celle-ci.
$uri = (file_build_uri($path));
// Génération de notre image.
$image = theme('image_style', array( 'path' =>  $uri, 'style_name' => 'image_style_example'));

Et voila vous venez de créer et appliquer un style via la programmation !

Crédits Photo

Cet article Comment créer et appliquer des styles d’images avec Drupal 7 via le code est apparu en premier sur Julien Dubreuil.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI

Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI

Depuis Drupal 7 la gestion des images et des styles d’images est native, ainsi donc plus besoin d’installer le module imagecache pour retailler, pivoter ou encore redimensionner vos photos.
Une fois créée, vous pourrez appliquer vos styles sur n’importe quelle photo, qu’elle soit affichée dans le contenu d’un node ou encore dans le rendue d’une vue. La manip’ est vraiment simple et permet de décliner une photo en une quantité indéfinie de possibilité.

Voici donc un petit guide pour vous montrer comment ajouter de nouveaux styles d’images via l’interface de Drupal et comment vous en servir.

Créer un style d’image via l’interface d’administration

Première étape, rendez-vous sur la page d’administration des styles d’images Administration » Configuration » Media et cliquez sur Image styles. Cliquez sur le lien au dessus des trois styles d’images par défaut nommé Add style, et insérez un titre à votre style d’image. Petit conseil, soyez explicite sur les noms, car plus vous en aurez, plus cela deviendra difficile de vous y retrouver.


Deuxième étape
, l’ajout d’effets aux images et pour cela vous avez à votre disposition 6 choix :
– Crop : découpe l’image selon une certaine dimension.
– Desaturate : désature l’image.
– Resize : retaille l’image.
– Rotate : retourner l’image en fonction d’un angle.
– Scale : retaille l’image en gardant les proportions.
– Scale and crop : retaille et découpe l’image.

Choisissez l’effet désiré, entrez les dimensions voulus et sauvegardez.

Troisième étape, la visualisation des résultats. Une fois votre effet validé, vous vous retrouvez sur la page de votre nouveau style d’image. En haut de celle-ci se trouve deux images afin de voir le résultat de votre effet. A gauche l’image original et à droite l’image transformée.

Derniere étape, cliquez sur Update style pour valider les modifications effectuées et pour sauvegarder votre nouveau style que vous retrouvez pour mettre en forme chaque champ image

Appliquer un style d’image

Dans le cas d’un contenu, rendez-vous la page de gestion de l’affichage des champs : Administration » Structure » Content types et cliquez sur Manage display, pour le type de contenu de votre choix. Cliquez ensuite sur la petite icône en forme d’engrenage qui devrait se trouver à droite sur la ligne de votre champ image.

Sélectionnez le style de votre choix, cliquez sur le bouton update et votre style sera maintenant appliqué à ce champ. Pour visualiser les résultat rendez-vous sur la page de votre contenu et voila.

Par juliendubreuil
julien dubreuil
Drupal since 2009

Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI

Depuis Drupal 7 la gestion des images et des styles d’images est native, ainsi donc plus besoin d’installer le module imagecache pour retailler, pivoter ou encore redimensionner vos photos.
Une fois créée, vous pourrez appliquer vos styles sur n’importe quelle photo, qu’elle soit affichée dans le contenu d’un node ou encore dans le rendue d’une vue. La manip’ est vraiment simple et permet de décliner une photo en une quantité indéfinie de possibilité.

Voici donc un petit guide pour vous montrer comment ajouter de nouveaux styles d’images via l’interface de Drupal et comment vous en servir.

Créer un style d’image via l’interface d’administration

Première étape, rendez-vous sur la page d’administration des styles d’images Administration » Configuration » Media et cliquez sur Image styles. Cliquez sur le lien au dessus des trois styles d’images par défaut nommé Add style, et insérez un titre à votre style d’image. Petit conseil, soyez explicite sur les noms, car plus vous en aurez, plus cela deviendra difficile de vous y retrouver.


Deuxième étape
, l’ajout d’effets aux images et pour cela vous avez à votre disposition 6 choix :
- Crop : découpe l’image selon une certaine dimension.
- Desaturate : désature l’image.
- Resize : retaille l’image.
- Rotate : retourner l’image en fonction d’un angle.
- Scale : retaille l’image en gardant les proportions.
- Scale and crop : retaille et découpe l’image.

Choisissez l’effet désiré, entrez les dimensions voulus et sauvegardez.

Troisième étape, la visualisation des résultats. Une fois votre effet validé, vous vous retrouvez sur la page de votre nouveau style d’image. En haut de celle-ci se trouve deux images afin de voir le résultat de votre effet. A gauche l’image original et à droite l’image transformée.

Derniere étape, cliquez sur Update style pour valider les modifications effectuées et pour sauvegarder votre nouveau style que vous retrouvez pour mettre en forme chaque champ image

Appliquer un style d’image

Dans le cas d’un contenu, rendez-vous la page de gestion de l’affichage des champs : Administration » Structure » Content types et cliquez sur Manage display, pour le type de contenu de votre choix. Cliquez ensuite sur la petite icône en forme d’engrenage qui devrait se trouver à droite sur la ligne de votre champ image.

Sélectionnez le style de votre choix, cliquez sur le bouton update et votre style sera maintenant appliqué à ce champ. Pour visualiser les résultat rendez-vous sur la page de votre contenu et voila.

Cet article Comment créer et appliquer des styles d’images avec Drupal 7 via l’UI 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

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

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

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

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 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

Par juliendubreuil
julien dubreuil
Drupal since 2009

Créer un champ texte avec auto-complétion en utilisant la form Api

Créer un champ texte avec auto-complétion en utilisant la form Api

Voici un petit bout de code et quelques explications afin de créer un champ texte avec auto-complétion pour vos formulaire en utilisant la form api de Drupal.

Dans l’exemple suivant nous allons créer un formulaire avec un champ texte qui permettra de sélectionner un noeud parmi tous les contenus publiés sur le site. Pour pimenter l’exercice on permettra à notre utilisateur de saisir plusieurs valeurs, comme il est possible de faire dans un champ tag de taxonomie.

Étape 1 : Création de la fonction de récupération de informations

La première chose à faire consiste à créer une fonction de callback afin de récupérer les titres des nodes en base de données que l’on renverra par la suite au format json.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">* Callback de récupération des titres des noeuds.</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_autocomplete_node_title</span><span class="p">(</span><span class="nv">$key</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$ret</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// L&#39;utilisateur insère une liste de tag séparés par des virgules et</span>
</span><span class='line'>  <span class="c1">// on ne traite que le dernier tag.</span>
</span><span class='line'>  <span class="nv">$keys</span> <span class="o">=</span> <span class="nx">drupal_explode_tags</span><span class="p">(</span><span class="nv">$key</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// Récuperation du dernier tag en cour de saisie par l&#39;utilisateur.</span>
</span><span class='line'>  <span class="nv">$last_string</span> <span class="o">=</span> <span class="nx">trim</span><span class="p">(</span><span class="nb">array_pop</span><span class="p">(</span><span class="nv">$keys</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$last_string</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&quot;SELECT DISTINCT (n.nid), n.title</span>
</span><span class='line'><span class="s2">           FROM {node} n</span>
</span><span class='line'><span class="s2">           WHERE status = 1</span>
</span><span class='line'><span class="s2">           AND UPPER(n.title) LIKE UPPER(&#39;%%%s%%&#39;)</span>
</span><span class='line'><span class="s2">           ORDER BY n.title ASC&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nv">$query</span> <span class="o">=</span> <span class="nx">db_query_range</span><span class="p">(</span><span class="nv">$sql</span><span class="p">,</span> <span class="nv">$last_string</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Récupération des valeurs saisies précédemment.</span>
</span><span class='line'>    <span class="nv">$prefix</span> <span class="o">=</span> <span class="o">!</span><span class="k">empty</span><span class="p">(</span><span class="nv">$keys</span><span class="p">)</span> <span class="o">?</span> <span class="nb">implode</span><span class="p">(</span><span class="s1">&#39;, &#39;</span><span class="p">,</span> <span class="nv">$keys</span><span class="p">)</span> <span class="o">.</span> <span class="s1">&#39;, &#39;</span> <span class="o">:</span> <span class="s1">&#39;&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Génération de la liste de résultats à renvoyer.</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nx">db_fetch_array</span><span class="p">(</span><span class="nv">$query</span><span class="p">))</span> <span class="p">{</span>
</span><span class='line'>     <span class="nv">$ret</span><span class="p">[</span><span class="nv">$prefix</span> <span class="o">.</span> <span class="nv">$row</span><span class="p">[</span><span class="s1">&#39;nid&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">check_plain</span><span class="p">(</span><span class="nv">$row</span><span class="p">[</span><span class="s1">&#39;title&#39;</span><span class="p">]);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// Transformation des résultats au format Json, suivi d&#39;un exit pour</span>
</span><span class='line'>    <span class="c1">// être sûr que l&#39;on ne renverra rien du thème.</span>
</span><span class='line'>    <span class="nx">drupal_json</span><span class="p">(</span><span class="nv">$ret</span><span class="p">);</span>
</span><span class='line'>    <span class="k">exit</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span>

Lorsque vous faites des comparaisons entres des chaînes de caractères pensez à tout mettre en minuscule ou majuscule si vous ne voulez pas prendre en compte la casse, ça vous permettra d’être plus tolérant sur l’orthographe.
Il est préférable de limiter le jeu de résultats obtenus, d’une part parce que ça ne nous servirait à rien d’afficher une liste de 400 titres et d’autre part, cela consommerait plus de ressources de base de données. Ainsi pour limiter ma requête j’ai utilisé la fonction db_query_range() au lieu de mettre directement une limite dans ma requête.

Étape 2 : Ajout d’une nouvelle entrée dans le menu

Maintenant que nous avons crée la récupération des titres des noeuds, il nous faut ajouter une entrée de menu pour que les données renvoyées par la fonction soit accessible depuis une url.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<span class='line'><span class="sd">/**</span>
</span><span class='line'><span class="sd">* Implementation of hook_menu().</span>
</span><span class='line'><span class="sd">*</span>
</span><span class='line'><span class="sd">* @return An array of menu items.</span>
</span><span class='line'><span class="sd">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_menu</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$items</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>  <span class="c1">// Url de récupération des titres des nodes pour l&#39;auto-complétion.</span>
</span><span class='line'>  <span class="nv">$items</span><span class="p">[</span><span class="s1">&#39;mymodule/autocomplete/node_title&#39;</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;page callback&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;mymodule_autocomplete_node_title&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;access arguments&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;access content&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="nx">MENU_CALLBACK</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$items</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

N’oubliez pas qu’après chaque modification du menu il est nécessaire de flusher le cache :)
Pour tester si vous obtenez bien des résultats, rendez-vous sur l’url que vous avez créée dans le hook_menu suivi d’un / et d’un caractère pour simuler la frappe d’un utilisateur. Ce qui donne par exemple : mymodule/autocomplete/node_title/a

Étape 3 : Paramétrage du formulaire

La dernière étape, vous l’aurez deviné si vous avez tout suivi, c’est la création du formulaire.


1
2
3
4
5
6
7
8
9
10
11
12
13
<span class='line'><span class="cm">/*</span>
</span><span class='line'><span class="cm">* Formulaire custom de selection de nodes.</span>
</span><span class='line'><span class="cm">*/</span>
</span><span class='line'><span class="k">function</span> <span class="nf">mymodule_listing_nodes_form</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="nv">$form</span> <span class="o">=</span> <span class="k">array</span><span class="p">();</span>
</span><span class='line'>  <span class="nv">$form</span><span class="p">[</span><span class="s1">&#39;nids&#39;</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;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;textfield&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="s1">&#39;#title&#39;</span> <span class="o">=&gt;</span> <span class="nx">t</span><span class="p">(</span><span class="s1">&#39;Sélectionnez vos contenus&#39;</span><span class="p">),</span>
</span><span class='line'>    <span class="c1">// Il est important de donner l&#39;url de récupération des titres sinon ça ne marche pas...</span>
</span><span class='line'>    <span class="s1">&#39;#autocomplete_path&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;mymodule/autocomplete/node_title&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="nv">$form</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span>

Le secret réside dans le fait de configurer l’option #autocomplete_path du widget textfield en lui paramétrant une url et c’est tout!

Voilà, vous savez maintenant créer des champs textes avec auto-complétion et au final c’était pas bien compliqué! :)
Je suis sûr que vous avez déjà tout compris mais bon au cas où et histoire de rentabiliser l’espace disque de mon hébergement voici les sources de cet exemple (une grand première dans l’histoire de ce blog).

Bonus

Petite astuce pendant que l’on parle d’auto-complétion. Certains naviguateurs proposent d’utiliser les réponses que vous avez déjà saisies auparavant comme votre nom, prénom et autres, mais parfois vous ne voulez pas autoriser ça dans vos forms. Et bien pour désactiver ça il vous suffit de définir la complétion du champ à off et le tour est joué.


1
2
3
4
<span class='line'><span class="nv">$form</span><span class="p">[</span><span class="s1">&#39;name&#39;</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;#type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;textfield&#39;</span><span class="p">,</span>
</span><span class='line'>  <span class="s1">&#39;#attributes&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;autocomplete&#39;</span> <span class="o">=&gt;</span><span class="s1">&#39;off&#39;</span><span class="p">),</span>
</span><span class='line'><span class="p">);</span>
</span>

Pages