Drupal no invoca mis ganchos


9

Estoy desarrollando un módulo, pero los ganchos que estoy agregando no se invocan desde Drupal. Sucede con más de un gancho.

Leí la documentación de los ganchos, y no puedo encontrar nada que explique por qué sucede esto. Verifiqué que estoy usando los parámetros correctos y devolviendo el valor correcto.

¿Qué estoy haciendo mal? ¿Hay algo que me falta?


Esta pregunta se considera una pregunta canónica para aquellas preguntas sobre los ganchos que Drupal no invoca.
kiamlaluno

Respuestas:


13

Al desarrollar un módulo, debe tener en cuenta las siguientes notas.

  • La implementación de un enlace realizado desde un módulo es una función cuyo nombre tiene el prefijo del nombre corto del módulo (también llamado el nombre de la máquina ); del nombre del gancho, retire la parte del gancho y reemplácela con el nombre de la máquina del módulo. Por ejemplo, la implementación de hook_menu()done from example.module es example_menu(). Si el módulo es example_menu.module, y la función es example_menu(), eso no se considera la hook_menu()implementación para example_menu.module.
    Esto también significa, por ejemplo, que la hook_form_alter()implementación en example_form.module no es example_form_alter(), pero example_form_form_alter(). Como otro ejemplo, la implementación de hook_form_FORM_ID_alter()done para alterar el formulario devuelto user_register_form()por example.module no lo es example_form_user_register_alter(), peroexample_form_user_register_form_alter(). (El ID del formulario es user_register_form ).

  • En términos generales, el uso de caracteres en mayúscula en el nombre de la máquina del módulo no crea problemas: PHP no hace diferencias entre myModule_get_value(), y mymodule_get_value(), $value = myModule_get_value()llamaría myModule_get_value(), o mymodule_get_value().
    Sin embargo, hay un caso en el que el uso de caracteres en mayúscula en el nombre de la máquina de un módulo podría causar problemas: al definir los enlaces de actualización para un módulo. drupal_get_schema_versions(), la función que devuelve una lista de actualizaciones disponibles, contiene el siguiente 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'];
      }
    }

    La última línea ejecutada desde drupal_get_schema_versions()es la siguiente.

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

    Si el nombre del módulo es myModule.module, drupal_get_schema_versions('myModule')devolverá solo las funciones con un nombre que comienza con myModule_update y termina con un número; funciones como mymodule_update_7120()no se incluirán porque la expresión regular utilizada drupal_get_schema_versions()es sensible a mayúsculas y minúsculas. Esto todavía se aplica a Drupal 8, ya que la expresión regular sigue siendo la misma que se usa en Drupal 7.

  • Algunos ganchos se llaman en momentos específicos. Por ejemplo, hook_menu()y hook_menu_alter()se llaman desde Drupal 7 después de que un módulo se ha habilitado / deshabilitado, o cuando se borra la memoria caché para la información del enrutador; hook_init()no se invoca para páginas en caché.
    Una vez que se invocan los ganchos porque ocurrió un evento específico, no se volverán a llamar hasta que no ocurra un evento similar. No se llaman en dos solicitudes de página sucesivas.

  • Drupal almacena en caché la lista de ganchos implementados desde un módulo. Si está editando el código de un módulo habilitado para agregar nuevos enlaces, primero debe deshabilitar y volver a habilitar el módulo, o Drupal no notará que hay nuevos enlaces.

  • Asegúrese de que una returndeclaración no se filtró en una de sus funciones de enlace durante una refactorización. Tiene el potencial de romper no solo el gancho en el que aparece, sino también causar una reacción en cadena que también rompe otros ganchos, haciendo que el problema sea difícil de localizar.


También quizás valga la pena mencionar mi error por el bien de los demás en el futuro: NO defina un espacio de nombres en su archivo .module (o cualquier otro archivo PHP "plano" que no sea de clase). De lo contrario, Drupal no reconocerá su archivo, por lo tanto, no descubrirá los ganchos definidos en ellos.
Balu Ertl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.