(D6 tutorial) Aggiungere un nuovo controllo ad uno o più campi di un webform

2 contenuti / 0 new
Ultimo contenuto
(D6 tutorial) Aggiungere un nuovo controllo ad uno o più campi di un webform

Salve a tutti, è un po' che non ci si sente.... gli impegni mi tengono lontano. Torno per scrivere 2 righe al volo.
Potrebbe capitarvi di dover condizionare la composizione di un webform, a certe condizioni particolari. Nel mio caso ho dovuto aggiungere un controllo che permettesse la verifica del codice fiscale di chi compila, in modo da controllare l'età e la residenza dello stesso nel comune. Tralascio la parte tecnica riguardante la verifica da smart card e via dicendo e concentriamoci solo sulla verifica di un dato immesso (stiamo parlando di drupal 6 ma immagino si possa applicare a druopal 7 con delle modifiche).

Per prima cosa si crea un nuovo modulo (nel mio caso denominato codicefiscale.module). Al suo interno si mette l'hook codicefiscale_webform_validation_validators() che provvede a fornire una nuova voce alle possibili verifiche sui dati immessi. Questa funzione è molto semplice e la vedete sotto (è composta dal tipo di controllo e una descrizione che apparirà nella lista dei possibili controlli)

Fatto ciò non resta che creare un hook codicefiscale_webform_validation_validate($validator_name, $items, $components, $rule) in cui andremo a verificare i dati e restituire un eventuale risultato. Nel mio caso, come si vede sotto, controllo il campo "codicefiscale", vado a verificare in un database esterno e restituisco un messaggio (benvenuto o errore)

Adesso non resta che creare il webform, andare validation /node/xxxxxxxx/webform/validation, scegliere "codicefiscale" "Verifica che il codice fiscale sia presente nell'anagrafica del Comune. (textfield)" e assegnarlo al textfield che conterrà il codice fiscale.

.....più difficile da spiegare che da fare.

Tutto ciò porta ad innumerevoli soluzioni tipo:
1) condizionare la stesura di un form ad un controllo specifico di un campo, usando anche il page break (non si va avanti fin quando la condizione della pagina 1 non è soddisfatta)
2) aggiunta di nuovi controlli
3) controllare dati esterni ed eventualmente dare o non dare accesso al resto del form

Vi lascio al codice sotto.... per ovvi motivi ho sostituito alcuni dati con xxxxxxxxxxx

<?php
/**
* Questo modulo aggiunge una validazione sul codice fiscale dei residenti
*/
/**
* Implementation of hook_webform_validation_validators().
*
*/
function codicefiscale_webform_validation_validators(){
   
$validationMethods = array();
   
$validationMethods['codicefiscale'] = array(
   
'name' => "codicefiscale",
   
'component_types' => array(
       
'textfield',
    ),
   
'description' => t('Verifica che il codice fiscale sia presente nell\'anagrafica del Comune.'),
    );
    return
$validationMethods;
}
/**
* Implementation of hook_webform_validation_validate().
*/
function codicefiscale_webform_validation_validate($validator_name, $items, $components, $rule) {
    if (
$items) {
    switch (
$validator_name) {
        case
'codicefiscale':
        foreach (
$items as $key => $val) {
           
//load user
            //if uid 0 or status 0 throw error
           
if ($val) {
       
$connessione=mysql_connect("xxxxxxxxxx", "xxxxxxxxxx", "xxxxxxxxxx");
       
$database=mysql_select_db("xxxxxxxxxx",$connessione);
       
$val = strtoupper($val);
       
$sql="SELECT * FROM xxxxxxxxxx WHERE CODICEFISC = '$val' AND xxxxxxxxxx = 'xxxxxxxxxx' ";
       
$tutto=mysql_query($sql,$connessione);
       
$valori=mysql_fetch_object($tutto);
       
$DataNasc = explode ('-', $valori->xxxxxxxxx);
       
$DataNasc[0] = $DataNasc[0] + 16;
       
$DataTempoNascita = mktime (0, 0, 0, $DataNasc[1], $DataNasc[2], $DataNasc[0]);
        if (
$DataTempoNascita > mktime(0,0,0)) $errors[$key] = t('ATTENZIONE!! Per votare devi aver compiuto 16 anni.');
        if (!
$valori->CODICEFISC) $errors[$key] = t('%item non è un codice fiscale valido o non è un codice fiscale di un residente.', array('%item' => $components[$key]['name']));
       
//     else
       
if (!$errors[$key]) drupal_set_message('Benvenuto '.$valori->xxxxxxxxxxx.' '.$valori->xxxxxxxxxxx, 'status', TRUE) ;
            }
        }
        return
$errors;
        break;
    }
    }
}
?>

Drupal Version:

Ciao e "bentornato" :)

Grazie per la guida, effettivamente è un esigenza che torna spesso utile.

Ti faccio presente che è possibile avere definito in settings delle connessioni differenti rispetto alla default al DB di drupal e cambiare connessione da usare usando la db_set_active() così da evitare di fare le operazioni di connessione DB, .. nel codice del modulo, nel tuo caso diventerebbe TIPO:

<?php
db_set_active
('codicefiscale');
$res = db_fetch_object(db_query("SELECT * FROM xxxxxx WHERE yyyyy = '%s'", $parametro));
db_set_active('default');
?>

PS: se chiudi i tag PHP si evidenzia la sintassi del codice e diventa più leggibile :)

Ciao
Marco
--
My blog
Working at @agavee