web-dev-qa-db-fra.com

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

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

Si je comprends bien, les modules Drupal fonctionnent sur un événement tel que le système appelé hooks . Lorsque vous créez un nouveau module, vous créez des fonctions qui implémentent un hook. Par exemple, il y a un hook hook_delete. 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 ou moi, en tant que développeur de modules tiers, de créer my own hooks. Disons quelque chose comme hook_alanskickbutthook pour que d’autres développeurs de modules puissent s’abonner à ce hook.

Si c'est possible, comment le fais-tu? J'ai jeté un coup d'œil aux documents officiels et n'y ai pas trouvé grand-chose. Je suis encore un peu étourdi quand je commence à fouiller dans le code source de Drupal (je comprends la récursivité, mais ne perdez pas assez de temps à penser aux problèmes récursifs). Des solutions complètes sont les bienvenues, mais je suis heureux d’être simplement dirigé dans la bonne direction.

33
Alan Storm

Module_invoke_all () vous permet de créer vos propres hooks:

voir l'API:

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

et puis regardez ce grand article:

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

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

Une fois votre hook créé, vous pouvez l'appeler dans un autre module en utilisant: 

/**
 * Implementation of hook_myhookname()
 */

function THISMODULENAME_myhookname(args){
  //do stuff
}
37
jpstrikesback

Par exemple, supposons que vous souhaitiez créer hook_my_custom_goodness () à l'intention des autres. Ensuite, placez simplement le code comme celui-ci dans votre module au point où vous souhaitez que le raccordement 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 veut utiliser votre hook, il peut 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;
}

Il y a une explication plus complète ici:

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

6

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

Comme indiqué dans la documentation module_invoke_all () ,

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

Dans Drupal 8, utilisez ModuleHandler :: alter .

Transmet les variables modifiables à des implémentations spécifiques de hook_TYPE_alter () .

0
colan

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

cela aide-t-il? Cela fait un moment que je me suis planté avec Drupal.

Pour créer/proposer un hook Drupal personnalisé, vous devez implémenter de telle sorte que l'appel du hook avec module_invoke ou module_invoke_all ne crée aucun conflit avec les autres hooks de module. Le nom du crochet doit être unique et offrir une fonctionnalité générale/spécifique de manière générale, de sorte qu'il ne nécessite aucun type de réglage avec code. Toute la configuration doit aller sur les pages d'administration et doit stocker ces configurations dans un tableau séparé ou dans tout tableau existant créé par Drupal ou des modules dont dépendent vos modules. Le hook devrait être facile à implémenter par d'autres modules et ne devrait pas être trop complexe à implémenter. Lorsque vous créez des points d'ancrage personnalisés, vos modules agissent en tant que fournisseur d'API.

0
Brian