Você pode criar seu próprio gancho no Drupal?

É possível criar seu próprio gancho em um módulo Drupal para outros módulos Drupal para consumir? Caso contrário, existe um mecanismo no Drupal para que os desenvolvedores de terceiros ofereçam ganchos? Se tudo foi um não até agora, onde no núcleo estão a lista de ganchos implementados?

Como eu entendo, os módulos Drupal funcionam em um evento como o sistema chamado ganchos . Quando você cria um novo módulo, você cria funções que implementam um gancho. Por exemplo, existe um hook_delete hook. Se você implementar uma function em seu módulo

 function mymodule_delete($node) { } 

Essa function será chamada sempre que um nó for excluído.

O que eu quero saber é, existe uma maneira ou eu, como um desenvolvedor de módulos de terceiros, criar meus próprios ganchos. Diga, algo como hook_alanskickbutthook para que outros desenvolvedores de módulos possam se inscrever neste gancho.

Se isso for possível, como você faz isso? Eu olhei em torno dos documentos oficiais e não encontrei muito lá, e ainda fico tonto quando começo a cutucar o código-fonte do Drupal (eu entendo a recursion, mas não gasto tempo suficiente pensando em problemas recursivos). Soluções completas são bem-vindas, mas estou feliz em ser apontado na direção certa.

Module_invoke_all () é o seu ticket para criar seus próprios ganchos:

veja a API:

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

e então olhe para este ótimo writeup:

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

(editar: foi em http://himerus.com/blog/himerus/creating-hooks-seus-drupal-modules, mas agora está desaparecido)

Uma vez que você criou o seu gancho, ele pode ser chamado em outro módulo usando:

 /** * Implementation of hook_myhookname() */ function THISMODULENAME_myhookname(args){ //do stuff } 

Por exemplo, digamos que você queria criar hook_my_custom_goodness () para que outros possam usar. Em seguida, basta colocar um código como este em seu módulo no ponto em que deseja que o gancho aconteça:

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

Agora, se alguém quisesse usar seu gancho, então eles poderiam fazê-lo em seu próprio módulo, como este:

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

Há uma explicação mais completa aqui:

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

Se eu me lembro … http://api.drupal.org/api/drupal/modules–node–node.api.php/function/hook_delete/7

Isso ajuda? Fui um tempo desde que eu mexei com o Drupal.

Para criar / oferecer gancho Drupal personalizado, você deve implementar de forma a que chamar o gancho com module_invoke ou module_invoke_all não faça conflitos com outros ganchos do módulo. O nome do gancho deve ser exclusivo e deve oferecer todas as características específicas de uma maneira tão geral que não requer qualquer tipo de ajustes com o código. Toda a configuração deve ir em páginas de administração e deve armazenar essas configurações em uma tabela separada ou em tabelas existentes criadas pelo Drupal ou módulos nos quais seus módulos dependem. O gancho deve ser fácil de implementar por outros módulos e não deve ser muito complexo de implementar. Quando você cria ganchos personalizados, seu (s) módulo (s) atua (s) como provedor de API.

Para o Drupal 6 e 7, drupal_alter () é provavelmente a melhor opção.

Conforme indicado na documentação do module_invoke_all ()

Todos os argumentos são passados ​​por valor. Use drupal_alter () se você precisar passar argumentos por referência.

No Drupal 8, use ModuleHandler :: alter .

Passa variables ​​alteráveis ​​para implementações específicas de hook_TYPE_alter ().