33 votes

Pouvez-vous créer votre propre crochet dans Drupal ?

Est-il possible de créer votre propre le crochet dans un module Drupal pour que d'autres modules Drupal le consomment ? Si non, existe-t-il un mécanisme dans Drupal permettant aux développeurs tiers de fournir des hooks ? Si tout a été refusé jusqu'à présent, où se trouve la liste des hooks implémentés dans le noyau ?

Si je comprends bien, les modules Drupal fonctionnent selon un système d'événements appelé crochets . Lorsque vous créez un nouveau module, vous créez des fonctions qui mettent en œuvre un hook. Par exemple, il y a un hook_delete crochet. Si vous implémentez une fonction dans votre module

function mymodule_delete($node)
{
}

cette fonction sera appelée à chaque fois qu'un nœud est supprimé.

Ce que je veux savoir, c'est s'il existe un moyen pour moi, en tant que développeur de module tiers, de créer le mien crochets. Disons, quelque chose comme hook_alanskickbutthook afin que d'autres développeurs de modules puissent s'abonner à ce crochet.

Si c'est possible, comment faites-vous ? J'ai fait le tour de la documentation officielle et je n'ai pas trouvé grand chose, et j'ai toujours un peu le vertige quand je commence à fouiller dans le code source de Drupal (je comprends la récursion, mais je ne passe pas assez de temps à réfléchir aux problèmes récursifs). Les solutions complètes sont les bienvenues, mais je suis heureux qu'on m'indique simplement la bonne direction.

37voto

jpstrikesback Points 2154

Module_invoke_all() est votre ticket pour créer vos propres hooks :

voir l'API :

http://api.drupal.org/api/drupal/includes--module.inc/function/module_invoke_all

et ensuite regarder ce super article :

http://web.archive.org/web/20101227170201/http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules

(edit : was at http://himerus.com/blog/himerus/creating-hooks-your-drupal-modules mais cela a maintenant disparu)

Une fois que vous avez créé votre hook, il peut être appelé dans un autre module en utilisant :

/**
 * Implementation of hook_myhookname()
 */

function THISMODULENAME_myhookname(args){
  //do stuff
}

0 votes

Dans le tutoriel que vous avez posté, qu'est-ce qui appelle la fonction "taxonomy_rockstar_generate_layouts" ? (Je m'excuse pour cette question de débutant. Je suis suffisamment novice en matière de Druapl pour ne pas savoir où se trouvent les choses dans le système).

4 votes

Quelques corrections/tipps : a) $args n'est pas par référence quand on utilise module_invoke_all(). b) Si vous voulez passer quelque chose par référence, utilisez soit drupal_alter() (force le suffixe '_alter' sur le nom du hook) ou module_implements + une boucle et ensuite appelez les implémentations directement. c) La manière recommandée de documenter les hooks est dans un fichier yourmodule.api.php, voir core pour des exemples. d) Un modèle commun dans D7 lors de la collecte d'informations est d'utiliser un suffixe info et d'appeler également drupal_alter sur cela. Exemple <?php $stuff = module_invoke_all('yourmodule_stuff_info') ; drupal_alter('yourmodule_stuff_info', $stuff) ; ?>.

0 votes

Bien vu pour la référence... Je pensais à drupal_alter() quand je l'ai ajouté.

6voto

Par exemple, disons que vous voulez créer hook_my_custom_goodness() pour que d'autres puissent l'utiliser. Il suffit alors de placer un code comme celui-ci dans votre module à l'endroit où vous voulez que le hook se produise :

$variables['msg'] = 'foo';

// Make sure at least one module implements our hook.
if (sizeof(module_implements('my_custom_goodness')) > 0) {
  // Call modules that implement the hook, and let them change $variables.
  $variables = module_invoke_all('my_custom_goodness', $variables);
}

drupal_set_message($variables['msg']); // Will display 'bar' instead.

Maintenant, si quelqu'un voulait utiliser votre crochet, il pourrait le faire dans son propre module comme ceci :

/**
 * Implements hook_my_custom_goodness().
 */
function SOME_OTHER_MODULE_my_custom_goodness($variables) {
  $variables['msg'] = 'bar';
  return $variables;
}

Vous trouverez une explication plus complète ici :

http://tylerfrankenstein.com/code/drupal-create-custom-hook-for-other-modules

1voto

Vindesh Points 11

Vous devez implémenter deux hooks 1. hook_token_info() & 2. hook_tokens() dans votre fichier module Ci-dessous, j'ai donné le code pour créer mon token personnalisé "query-param-all" et utilisé ce token dans les vues - Textarea field......

/**
* Implements hook_token_info().
*/
function mycustom_token_info() {
  $type = [
      'name' => ('Custom Token'),
      'description' => ('Tokens for custom things.'),
  ];
  $node['query-param-all'] = [
      'name' => ("Get all URL query string"),
      'description' => ('Get all URL query string'),
  ];
  return [
      'types' => ['customtoken' => $type],
      'tokens' => ['customtoken' => $node],
  ];
}

/**
* Implements hook_tokens().
*/
function mycustom_tokens($type, $tokens, array $data, array $options, \Drupal\Core\Render\BubbleableMetadata $bubbleable_metadata) {
  $replacements = [];
  //print '<pre>'; print_r($data);exit;
  $current_path = \Drupal::request()->query->all();
  $query_param = '';
  if( count($current_path) > 0) {
    $amper = '';
    $query_param = '?';
    foreach($current_path as $key => $value){
      $query_param .= $amper.$key.'='.$value;
      $amper = '&';
    }
  }

  if ($type == 'customtoken') {
      foreach ($tokens as $name => $original) {
          switch ($name) {
              case 'query-param-all':
                  $replacements[$original] = $query_param;
              break;
          }
      }
  }
  return $replacements;
}

0voto

Brian Points 4114

Si je me souviens bien... http://api.drupal.org/api/drupal/modules--node--node.api.php/function/hook_delete/7

Est-ce que ça peut aider ? Ça fait un moment que je n'ai pas joué avec Drupal.

Pour créer/offrir un hook Drupal personnalisé, vous devez l'implémenter de telle manière que l'appel du hook avec module_invoke ou module_invoke_all n'entre pas en conflit avec les hooks d'autres modules. Le nom du hook doit être unique et il doit offrir toutes les fonctionnalités spécifiques d'une manière si générale qu'il ne nécessite aucun type d'ajustement avec le code. Toute la configuration doit se faire sur les pages d'administration et doit stocker ces configurations dans une table séparée ou dans toute table existante créée par Drupal ou par les modules dont dépendent vos modules. Le hook doit être facile à implémenter par d'autres modules et ne doit pas être trop complexe à mettre en œuvre. Lorsque vous créez des hooks personnalisés, votre (vos) module(s) agit (agissent) comme un fournisseur d'API.

0voto

colan Points 284

Pour Drupal 6 et 7, drupal_alter() est probablement la meilleure option.

Comme indiqué dans la documentation sur le module_invoke_all() ,

Tous les arguments sont passés par valeur. Utilisez drupal_alter() si vous avez besoin de passer des arguments par référence.

Dans Drupal 8, utilisez ModuleHandler::alter .

Passe les variables modifiables à la fonction spécifique hook_TYPE_alter() spécifiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X