Meus ganchos não são invocados pelo Drupal

9

Estou desenvolvendo um módulo, mas os ganchos que estou adicionando não são invocados no Drupal. Isso acontece com mais de um gancho.

Eu li a documentação dos ganchos e não consigo encontrar nada que explique por que isso acontece. Eu verifiquei que estou usando os parâmetros corretos e retornando o valor correto.

O que estou fazendo errado? Falta alguma coisa?

kiamlaluno
fonte
Esta pergunta é considerada uma pergunta canônica para as perguntas sobre ganchos que não são invocados pelo Drupal.
kiamlaluno

Respostas:

13

Ao desenvolver um módulo, lembre-se das seguintes notas.

  • A implementação de um gancho feito a partir de um módulo é uma função cujo nome é prefixado com o nome abreviado do módulo (também chamado de nome da máquina ); do nome do gancho, retire a peça do gancho e substitua-a pelo nome da máquina do módulo. Por exemplo, a implementação de hook_menu()done from example.module é example_menu(). Se o módulo for exemplo_menu.module e a função for example_menu(), isso não será considerado a hook_menu()implementação para exemplo_menu.module.
    Isso também significa, por exemplo, que a hook_form_alter()implementação em example_form.module não é example_form_alter(), mas example_form_form_alter(). Como outro exemplo, a implementação de hook_form_FORM_ID_alter()done para alterar o formulário retornado user_register_form()de example.module não é example_form_user_register_alter(), masexample_form_user_register_form_alter(). (O ID do formulário é user_register_form .)

  • De um modo geral, o uso de caracteres maiúsculos no nome da máquina do módulo não cria problemas: o PHP não faz diferenças entre myModule_get_value(), e mymodule_get_value(), e $value = myModule_get_value()chamaria myModule_get_value()ou mymodule_get_value().
    Embora exista um caso em que o uso de caracteres maiúsculos no nome de uma máquina de módulo causaria problemas: ao definir os ganchos de atualização para um módulo. drupal_get_schema_versions(), a função que retorna uma lista de atualizações disponíveis, contém o seguinte código.

    // Prepare regular expression to match all possible defined hook_update_N().
    $regexp = '/^(?P<module>.+)_update_(?P<version>\d+)$/';
    $functions = get_defined_functions();
    // Narrow this down to functions ending with an integer, since all
    // hook_update_N() functions end this way, and there are other
    // possible functions which match '_update_'. We use preg_grep() here
    // instead of foreaching through all defined functions, since the loop
    // through all PHP functions can take significant page execution time
    // and this function is called on every administrative page via
    // system_requirements().
    foreach (preg_grep('/_\d+$/', $functions['user']) as $function) {
      // If this function is a module update function, add it to the list of
      // module updates.
      if (preg_match($regexp, $function, $matches)) {
        $updates[$matches['module']][] = $matches['version'];
      }
    }

    A última linha executada drupal_get_schema_versions()é a seguinte.

    return empty($updates[$module]) ? FALSE : $updates[$module];

    Se o nome do módulo for myModule.module, drupal_get_schema_versions('myModule')retornará apenas as funções com um nome que comece com myModule_update e termine com um número; funções como mymodule_update_7120()não serão incluídas porque a expressão regular usada de drupal_get_schema_versions()diferencia maiúsculas de minúsculas. Isso ainda se aplica ao Drupal 8, pois a expressão regular ainda é a mesma usada no Drupal 7.

  • Alguns ganchos são chamados em momentos específicos. Por exemplo ,, hook_menu()e hook_menu_alter()são chamados do Drupal 7 após a ativação / desativação de um módulo ou quando o cache das informações do roteador é limpo; hook_init()não é chamado para páginas em cache.
    Depois que os ganchos são chamados porque um evento específico aconteceu, eles não serão chamados novamente até que um evento semelhante não ocorra. Eles não são chamados em duas solicitações de página sucessivas.

  • O Drupal armazena em cache a lista de ganchos implementados em um módulo. Se você estiver editando o código de um módulo ativado para adicionar novos ganchos, primeiro será necessário desativar e reativar o módulo, ou o Drupal não notará que há novos ganchos.

  • Assegure-se de que uma returndeclaração não tenha penetrado em uma de suas funções de gancho durante uma refatoração. Ele tem o potencial de quebrar não apenas o gancho em que aparece, mas também causar uma reação em cadeia que quebra outros ganchos, dificultando a localização do problema.

kiamlaluno
fonte
Também talvez valha a pena mencionar o meu erro em nome de outras pessoas no futuro: NÃO defina um espaço para nome no seu arquivo .module (ou qualquer outro arquivo PHP "plano" e sem classe). Caso contrário, o Drupal não reconhecerá seu arquivo e, portanto, não descobrirá os ganchos definidos neles.
Balu Ertl