Drupal 7: come modificare un form

Per eseguire delle modifiche a un form prima che questo venga stampato a video bisogna usare l’hook di Drupal 7: form_alter.

E’ utile e spesso usato per aggiungere dei campi, rimuoverli, o modificarli. Si possono eseguire delle alterazioni ai campi esistenti modificandone gli attributi, ad esempio per aggiungere uno stile o un evento, eseguire dei calcoli o inserire del codice HTML.

Insomma con l’hook form_alter è possibile gestire e modificare a piacimento qualsiasi form generato da Drupal.

form_alter

Dopo aver creato un modulo, chiamato ad esempio “mioModulo”, per eseguire modifiche a un form sarà sufficiente inserire la relativa funzione, o meglio l’hook, per modificare i forms, che è form_alter.

La funzione deve avere come prefisso il nome del modulo, ad esempio: mioModulo_form_alter().
Quindi la funzione completa, da inserire nel modulo sarà qualcosa come:

function mioModulo_form_alter (&$form, &$form_state, $form_id) {
 // il mio codice php
}

Questa funzione viene chiamata da Drupal ogni volta che viene generato un form, e riceve 3 variabili:

$form è un array contenente tutti i dati relativi agli elementi che compongono il form
$form_state contiene informazioni sullo stato attuale del form
$form_id l’ID del form

Per farsi un’idea del funzionamento dell’hook form_alter e delle veriabili che riceve potreste provare la seguente funzione, che stampa a video la struttura dell'array $form:

function mioModulo_form_alter (&$form, &$form_state, $form_id) {
  //stampa l’ID del form:
  print 'Form ID: ' . $form_id;
  //stampa la struttura dell’array $form:
  print 'Form:<pre>';
  print_r($form);
  print '</pre>';
  //Interrompo qui l’esecuzione del codice per leggere meglio quello che ho appena stampato
  die();
}

Esempio: modificare un form

Ora che abbiamo visto com’è fatto l’array $form, posiamo iniziare a modificarlo.
Per fare una modifica al form o a un campo del form è sufficiente modificare l’elemento dell’array $form corrispondente.

Ad esempio l’elemento #attributes della variabile $form contiene un array di attributi associati al form. Quindi se vogliamo aggiungere uno stile css e inserire l’evento onSubmit al form, basta assegnare:

$form['#attributes'] = array ('class' => 'myClassName', 'onsubmit' => 'myJavascriptFunction').

Il codice finale da inserire nel modulo mioModulo sarà qualcosa come:

function mioModulo_form_alter (&$form, &$form_state, $form_id) {
  $form['#attributes'] = array (
    'class' => 'myClassName',
    'onsubmit' => 'return myJavascriptFunction()'
  );
}

Questo modulo aggiunge a tutti i form di drupal la classe “myClassName” e l’evento "onsubmit", il quale richiama la funzione “myJavascriptFunction()”.

Vedi anche l'articolo specifico su come inserire l'evento onSubmit a un form

Modificare un form specifico

Come già detto, form_alter va a modificare tutti i form che Drupal va a generare. Se invece vogliamo modificare un solo form, o fare modifiche diverse a forms diversi, abbiamo due strade.
Una possibilità è inserire una riga di codice PHP che filtra i forms in base all’ID, ad esempio:

function mioModulo_form_alter (&$form, &$form_state, $form_id) {
  if ($form_id == 'contact') {
    // il mio codice
  }
}

Questa funzione andrà a modificare solo il form con id = “contact”.

form_FORM_ID_alter

Un’altro modo per modificare un singolo form è specificare l’ID direttamente nel nome della funzione. Ad esempio:

function mioModulo_form_contact_alter (&$form, &$form_state, $form_id) {
  // il mio codice
}

Anche questa funzione andrà a modificare solo il form con id = “contact”.

Links esterni

Articoli correlati