Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Écrire des triggers (déclencheurs)

Référence en anglais sur drupal.org : 23 Février 2009 - 13h30
http://drupal.org/node/375833


Les déclencheurs Drupal (triggers) seront mieux compris avec une bonne définition.

Pour les administrateurs de site Drupal : un trigger est un événement individuel qui déclenche une ou plusieurs actions. Parmi les triggers, on peut trouver la publication d'un contenu, la connexion d'un utilisateur ou la suppression d'un commentaire. Vous rencontrerez habituellement les triggers dans les écrans de paramétrage de Drupal.

Pour les programmeurs: un trigger est un événement qui déclenche des actions spécifiques. Toutes les actions rattachées à un trigger s'exécutent lorsque survient l'événement.

Pouvez-vous donner un exemple pour lequel un trigger est utile ?

Les triggers sont habituellement utilisés pour permettre à Drupal de configurer une réponse à un événement. Supposons qu'un administrateur de site veuille être averti par e-mail chaque fois qu'un utilisateur se connecte. Il configurera une action « >Envoyer un e-mail » et utilisera le module trigger pour attribuer l'action à réaliser quand le trigger « user log in » se déclenchera.

Comment créer un nouveau trigger ?

En trois étapes :

  1. Vous devez décrire l'action à Drupal en utilisant hook_hook_info()
  2. Vous devez écrire hook_trigger_name() pour appeler les actions adéquates.
  3. Vous devez insérer module_invoke_all() à tous les endroits où vous voulez que le trigger se déclenche.

Créons deux triggers pour le module On this date du tutoriel (Bloc vu et Page vue).

1. Description des triggers avec hook_hook_info()

<?php
1.  
/**
2.   * Implementation of hook_hook_info().
3.   */
4.  function onthisdate_hook_info() {
5.    return array(
6.      'onthisdate' => array(
7.        'onthisdate' => array(
8.          'block_viewed' => array(
9.            'runs when' => t('Le bloc "On this date" a été vu par un utilisateur connecté'),
10.         ),
11.         'page_viewed' => array(
12.           'runs when' => t('La page "On this date" a été vue par un utilisateur connecté'),
13.         ),
14.       ),
15.     ),
16.   );
17. }
?>

hook_hook_info()doit retourner un tableau dont les clés sont les suivantes :

  • ligne 6 : La clé est l'onglet dans lequel apparaîtra la page d'administration de ces triggers
  • ligne 7 : la clé est le nom du module
  • lignes 8 et 11 : la clé est la valeur trigger de $op
  • lignes 9 et 12 : la valeur contient la description en clair de l'action pour laquelle le trigger sera déclenché.

Quelques remarques sur ce tableau :

  • Une fois qu'il est en place, les triggers apparaîtront dans la page d'administration des triggers.
  • La description de hook_hook_info() comporte une erreur. La ligne 7 est supposée déclarer le hook décrit. En fait, on doit y mettre le nom du module (du moins jusqu'à ce que cela soit corrigé).

Effectuer les actions appropriées quand hook_trigger_name() est appelé.

<?php
1.  
/**
2.   * Implementation of hook_trigger_name().
3.   */
4.  function onthisdate_onthisdate($op$user) {
5.    // We support a subset of operations.
6.    if (!in_array($op, array('block_viewed''page_viewed'))) {
7.      return;
8.    }
9.    $aids _trigger_get_hook_aids('onthisdate'$op);
10.   $context = array(
11.     'hook' => 'onthisdate',
12.     'op' => $op,
13.     'user' => $user,
14.   );
15.   actions_do(array_keys($aids), $user$context);
16. }
?>

La partie trigger_name de hook_trigger_name est déclarée à la ligne 7 de la première étape (onthisdate dans notre cas).

$op : l'une des clés déclarées aux lignes 8 et 11 de la première étape.

$user : la variable globale $user. Elle sera passée lors de notre appel au trigger.

Ligne 6 : on s'assure qu'on ne déclenche que le triggers créés.

ligne 9 : on collecte les actions à réaliser en appelant la fonction privée _trigger_get_hook_aids().

lignes 11-14 : on crée les informations contextuelles dont auront besoin les actions pour être réalisées.

Ligne 15: on réalise les actions avec la fonction actions_do().

3. Appeler le bon trigger au bon moment

Puisque nous avons défini deux triggers, nous devons maintenant nous assurer qu'ils se déclenchent au bon moment. Commençons par le trigger block_viewed.

Puisque c'est la fonction onthisdate_block() qui génère le bloc qui sera affiché, c'est là que nous ajouterons le code :

<?php
1.   
...
2.    $block['content'] = $block_content;
3. 
4.    
//Load the user object
5.    global $user;
6. 
7.    
//Fire Block Viewed Trigger
8.    module_invoke_all('onthisdate''block_viewed'$user);
9. 
10.   
return $block;
}
?>

ligne 5 : on charge l'objet global user, on peut ainsi l'envoyer quand on déclenche le trigger.

ligne8 : on déclenche le trigger en appelant la fonction module_invoke_all()

La fonction module_invoke_all() s'attend à ces arguments :

module_invoke_all('nom_du_trigger', 'operation_du_trigger', [information contextuelle supplémentaire], [information contextuelle supplémentaire],...)

Répétez le processus pour la vue page et vous aurez vos deux triggers totalement opérationnels. Il ne vous reste plus qu'à créer des actions à rattacher à ces triggers.

Une surcharge d'action avancée

Vous voulez peut-être que vos nouveaux triggers puissent utiliser des actions intégrées ? Alors lisez ce qui suit.

Vous devrez principalement modifier les actions existantes pour leur dire de travailler avec votre nouveau trigger.

Dans cet exemple nous dirons aux actions système et utilisateurs qu'elles peuvent être rattachées à notre nouveau trigger. Nous utiliserons la fonction hook_action_info_alter() pour cela.

<?php
1.  
/**
2.   * Implementation of hook_action_info_alter().
3.   */
4.  function onthisdate_action_info_alter(&$info) {
5.    foreach ($info as $type => $data) {
6.      if (stripos($type"user_") === || stripos($type"system_") === 0) {
7.        if (isset($info[$type]['hooks']['application'])) {
8.          array_merge($info[$type]['hooks']['onthisdate'], array('block_viewed''page_viewed'));
9.        }
10.       else {
11.         $info[$type]['hooks']['onthisdate'] = array('block_viewed''page_viewed',);
12.       }
13.     }
14.   }
15. }
?>

Principalement, vous parcourez chaque action disponible et ajoutez votre nouveau trigger à la liste acceptée.

ligne 5 : début de la boucle sur les actions

ligne 6 : on vérifie que l'action est l'une de celles à laquelle on veut ajouter notre trigger (si vous êtes sous PHP 4 , vous devrez remplacer stripos par strpos).

ligne 7 : on s'assure qu'on n'enlève pas un trigger déjà ajouté à la liste

ligne 8 : on ajoute notre trigger à la liste

ligne 11 : on crée la liste acceptée en ajoutant notre trigger

Remarque n° 1 : dans les lignes 8 et 11, vous ne faites qu'ajouter le tableau suivant à $info[$type]['hooks'].

<?php
  
array(
    
'trigger_name' => array(
      
'op 1',
      
'op 2',
      ...
    ),
  );
?>

Remarque n° 2 : dans beaucoup d'instances de la ligne 6, vous aurez un if bien plus réduit. Par exemple :

<?php
  
if ($type == "user_block_ip_action") {
?>

Pour d'autres informations sur l'écriture des actions, voir la page Écrire des actions (Drupal 6.x).