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;
}
}
}
?>
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:
PS: se chiudi i tag PHP si evidenzia la sintassi del codice e diventa più leggibile :)
Ciao
Marco
--
My blog
Working at @agavee