Hola, quisiera poner en las rules de un model que un campo acepta una dirección de email o más, separadas por coma, y que se compruebe que son válidas al ser introducidas desde el formulario.
Gracias y un saludo
Hola, quisiera poner en las rules de un model que un campo acepta una dirección de email o más, separadas por coma, y que se compruebe que son válidas al ser introducidas desde el formulario.
Gracias y un saludo
Tendras que crear un ‘custom’ validator
// en rules
array('emails', 'validateEmails'),
//....
function validateEmails($attribute, $params){
if($this->hasErrors($this->{$attribute} || empty($this->{$attribute})
return; // you do whatever
// aqui tu funcion para validar los emails
// mira CEmailValidator para ideas de como validar
// si no pasa la validacion: $this->addError('attributename','error');
}
Cheers
Muchas gracias Billy el rápido
He hecho así el validate, según he entendido tu explicación y parece que funciona, si lo puedo mejorar agradezco cualquier sugerencia:
function validateEmails($attribute, $params){
if($this->hasErrors($this->{$attribute}) || empty($this->{$attribute}))
return $this->addError($attribute,'lista de emails incorrecta'); // you do whatever
$pattern=’/^[a-zA-Z0-9!#$%&\’+\\/=?^_{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\\/=?^_
{|}~-]+)@(?:a-zA-Z0-9?\.)+a-zA-Z0-9?$/’;
$emails= explode (’,’,$this->{$attribute});
for ($i=0;$i<count($emails);$i++)
{
$valid=is_string(trim($emails[$i])) && strlen(trim($emails[$i]))<=254 && (preg_match($pattern,trim($emails[$i])));
if (!$valid)
break;
}
if(!$valid)
return $this->addError($attribute,'lista de emails incorrecta'); // you do whatever
return TRUE;
}
Yo modificaría la función ligeramente - solo por fastidiar
function validateEmails($attribute, $params){
if($this->hasErrors($this->{$attribute}))
return;
if (empty($this->{$attribute})) // no permitido si esta vacio
return $this->addError($attribute,'lista de emails no puede estar vacia');
$pattern='/^[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$/';
$emails= explode (',',$this->{$attribute}); // solo comas? y puntos y comas no? <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/smile.gif' class='bbc_emoticon' alt=':)' />
foreach($emails as $email)
{
if(!(is_string(trim($emails[$i])) && strlen(trim($emails[$i]))<=254 && (preg_match($pattern,trim($emails[$i]))))
return $this->addError($attribute,'lista de emails incorrecta');
}
}
Totalmente no ‘testada’
Un saludo…
PS: Billi el rápido?