Come modificare i form in drupal 6

Dopo alcune lotte tra form_id e hook_form_alter cercherò di illustrare come riuscire a modificare qualsiasi form all'interno di Drupal (questo how-to si riferisce alla versione 6 di Drupal)

Due moduli essenziali

Prima di cominciare ad applicare qualsiasi modifica è essenziale installare i moduli Devel e Devel Themer, i quali forniscono una serie di tool e funzioni che rendono la vita dello sviluppatore mooooolto più semplice.

Identifichiamo il target

Per poter modificare un form all'interno di Drupal, la prima cosa da fare è identificare il suo id. Per fare ciò bisogna ispezionare il sorgente della pagina alla ricerca di uno speciale elemento nascosto che ha come attributo name = "form_id". Una volta trovato, la stringa che ci interessa si trova all'interno dell'attributo value (nell'esempio che seguirà ci riferiremo al form di inserimento di un nuovo termine di tassonomia, in questo caso il form_id di cui abbiamo bisogno è taxonomy_form_term.

NB: il browser Chrome ha già integrati i Developer Tools che è possibile attivare cliccando con il tasto destro sulla pagina e selezionando Ispeziona elemento. Si aprirà una nuova finestra dalla quale sarà possibile cercare il form_id che ci interessa.

Se invece utilizziamo firefox abbiamo a disposizione il fantastico Firebug. Il concetto è identico: cerchiamo la stringa form_id nella casella di ricerca e tra i risultati identifichiamo quello che ci interessa.

Modifichiamo con l'hook_form_alter()

Adesso che abbiamo il form_id dobbiamo semplicemente implementare l'hook_form_alter per (1) visualizzare l'array $form per sapere dove agire per attuare la modifica che ci serve, e (2) andare a modificare  effettivamente l'array nel punto che ci interessa.

(1) Visualizzare l'array $form

All'interno del nostro modulo (nel file .module ovviamente) implementiamo l'hook_form_alter in questo modo:

function MIOMODULO_form_alter(&$form, $form_state, $form_id) {
  switch ($form_id) {
    case 'taxonomy_form_term':
      dpm($form);
      break;
  }
}

Adesso caricando la pagina di inserimento di un nuovo termine di tassonomia (miosito/admin/content/taxonomy/id_vocabolario/add/term) dovrebbe apparire, nella sezione di pagina dedicata alla visualizzazione dei messaggi di sistema, l'array $form. Questo grazie alla funzione dpm() messa a disposizione dal modulo Devel, la quale presenta un output molto più leggibile rispetto, ad esempio, a un print_r.

(2) Modificare l'array $form

Ora che possiamo vedere com'è strutturato l'array che compone il form che vogliamo modificare, non ci resta che individuare l'elemento che ci interessa e provvedere alla modifica.

Se per esempio avessimo la necessità di cambiare la destination a cui deve puntare il sistema dopo aver effettuato il submit del form, potremmo agire sull'elemento destination dell'array.

Di conseguenza aggiorniamo la nostra implementazione dell'hook_form_alter in questo modo:

function MIOMODULO_form_alter(&$form, $form_state, $form_id) {
  switch ($form_id) {
    case 'taxonomy_form_term':
      $form['destination']['#value'] = 'node/add/page';
      break;
  }
}

Con questa modifica ogni volta che verrà salvato un nuovo termine verremo ridirezionati alla pagina di creazione del contenuto di tipo page.

Riassunto

Quindi ricapitolando abbiamo:

  • Identificato l'id del form che vogliamo modificare
  • Visualizzato, tramite l'hook_form_alter, l'array $form per sapere esattamente quale elemento modificare
  • Applicata la modifica all'elemento sempre tramite l'hook_form_alter.

Commenti