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
- Guida ufficiale (in inglese):