I miei ganci non sono invocati da Drupal


9

Sto sviluppando un modulo, ma i hook che sto aggiungendo non sono invocati da Drupal. Succede con più di un gancio.

Ho letto la documentazione per gli hook e non riesco a trovare nulla che spieghi perché ciò accada. Ho verificato che sto utilizzando i parametri corretti e restituendo il valore corretto.

Che cosa sto facendo di sbagliato? C'è qualcosa che mi manca?


Questa domanda è pensata come una domanda canonica per quelle domande sugli hook non invocati da Drupal.
kiamlaluno

Risposte:


13

Quando si sviluppa un modulo, è necessario tenere presente le seguenti note.

  • L'implementazione di un hook fatto da un modulo è una funzione il cui nome è preceduto dal nome abbreviato del modulo (chiamato anche nome della macchina ); dal nome del gancio, rimuovere la parte del gancio e sostituirla con il nome della macchina del modulo. Ad esempio, l'implementazione di hook_menu()done from example.module è example_menu(). Se il modulo è example_menu.module e la funzione è example_menu(), questa non è considerata l' hook_menu()implementazione per example_menu.module.
    Ciò significa, ad esempio, che l' hook_form_alter()implementazione in example_form.module non lo è example_form_alter(), ma example_form_form_alter(). Come altro esempio, l'implementazione di hook_form_FORM_ID_alter()done per modificare il modulo restituito user_register_form()da example.module non lo è example_form_user_register_alter(), maexample_form_user_register_form_alter(). (L'ID modulo è user_register_form .)

  • In generale, l'uso di caratteri maiuscoli nel nome della macchina del modulo non crea problemi: PHP non fa differenze tra myModule_get_value(), e mymodule_get_value(), e $value = myModule_get_value()chiamerebbe o myModule_get_value(), o mymodule_get_value().
    Tuttavia, esiste un caso in cui l'utilizzo di caratteri maiuscoli in un nome di macchina del modulo potrebbe causare problemi: quando si definiscono gli hook di aggiornamento per un modulo. drupal_get_schema_versions(), la funzione che restituisce un elenco di aggiornamenti disponibili, contiene il seguente codice.

    // 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'];
      }
    }

    L'ultima riga eseguita da drupal_get_schema_versions()è la seguente.

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

    Se il nome del modulo è myModule.module, drupal_get_schema_versions('myModule')restituirà solo le funzioni con un nome che inizia con myModule_update e termina con un numero; funzioni come mymodule_update_7120()non verranno incluse perché l'espressione regolare utilizzata drupal_get_schema_versions()fa distinzione tra maiuscole e minuscole. Questo vale ancora per Drupal 8, poiché l'espressione regolare è sempre la stessa usata in Drupal 7.

  • Alcuni hook vengono chiamati in momenti specifici. Ad esempio, hook_menu()e hook_menu_alter()vengono chiamati da Drupal 7 dopo che un modulo è stato abilitato / disabilitato o quando viene cancellata la cache per le informazioni del router; hook_init()non viene invocato per le pagine memorizzate nella cache.
    Una volta richiamati gli hook perché si è verificato un evento specifico, non verranno richiamati fino a quando non si verifica un evento simile. Non vengono chiamati in due richieste di pagine successive.

  • Drupal memorizza nella cache l'elenco degli hook implementati da un modulo. Se stai modificando il codice di un modulo abilitato per aggiungere nuovi hook, devi prima disabilitare e riattivare il modulo, altrimenti Drupal non noterà che ci sono nuovi hook.

  • Assicurati che returnun'istruzione non si sia infiltrata in una delle tue funzioni hook durante un refactoring. Ha il potenziale di rompere non solo il gancio in cui appare, ma anche di provocare una reazione a catena che rompe anche altri ganci, rendendo difficile individuare il problema.


Forse vale la pena menzionare anche il mio errore per il bene degli altri in futuro: NON definire uno spazio dei nomi nel tuo file .module (o in qualsiasi altro file "flat", non di classe PHP). Altrimenti Drupal non riconoscerà il tuo file, quindi non scoprirà gli hook definiti in essi.
Balu Ertl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.