[Risolto] Validatore Personalizzato Con Allowempty Non Funzionante

Come da descrizione, ho creato un validatore che (teoricamente) dovrebbe accettare anche valori nulli o vuoti

purtroppo così non accade e inoltre non è un campo ‘required’.

Questa è la regola:


array('ssn', 'validateSSN', 'allowEmpty'=>true)

mentre questo è il validatore:


public function validateSSN($attribute) {

    if(!preg_match('/\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/', $attribute))

        $this->addError($attribute, 'Your SSN is not correct.');

}

dove sbaglio? :rolleyes:

Da quanto ho capito, allowEmpty non è un parametro generale che dice "Se è vuoto non validare", bensì è un parametro che passi alla funzione che valida.

Pertanto, visto che poi non gestisci il parametro passato all’interno della tua funzione la tua funzione controllerà sempre, che sia o meno vuoto il tuo campo.

Quindi, o metti un




public function validateSSN($attribute) {

if($attribute && !preg_match('/\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/', $attribute))

        $this->addError($attribute, 'Your SSN is not correct.');

}

o gestisci il parametro che passi




public function validateSSN($attribute,$params) {

$allowEmpty=isset($params['allowEmpty'])?$params['allowEmpty']:false;

....

}

Ribadisco: per quanto ho capito ;)

Grazie emafer per la tua risposta :)

ho provato il tuo codice senza successo,

allora ho fatto [font="Lucida Console"]var_dump($attribute)[/font]

e mi son reso conto che [font=“Lucida Console”]$attribute[/font] ritorna ‘ssn’ e non il valore inserito (scusate l’ignoranza :P)

perciò la soluzione è andare a pescare dal [font="Lucida Console"]$_POST[/font] il relativo valore:


public function validateSSN($attribute) {

    $value = $_POST['Seller'][$attribute];

    if($value && !preg_match('/\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/', $value))

        $this->addError($attribute, 'Your SSN is not correct.');

}

Non usare MAI $_POST nei model, e’ completamente fuori standard.

Usa invece $model->$attribute, che dovrebbe contenere la stessa cosa (se nel controller hai fatto $model->attributes= $_POST[‘Seller’]).

Per ricevere i paramtri li devi prendere come secondo parametro:


function validatorName($attribute,$params)

Dai un occhio alla doc, c’e’ spiegato tutto.

Infine, per la validazione che stai cercando di fare c’e’ il RegularExpressionValidator (match).

Dai un occhio ai blultinvalidators, cosi’ eviti di reinventare sempre la ruota.

grazie per le ottime dritte, zaccaria

questo è la soluzione finale, da aggiungere alle rules:


array('ssn', 'match', 'pattern'=>'/\b[0-9]{3}-[0-9]{2}-[0-9]{4}\b/', 'allowEmpty'=>true, 'message'=>'Your SSN is not correct.'),