zend-framework zend-form email-validation zend-form-element

zend framework - zend formulario de validación de correo electrónico



zend-framework zend-form (5)

Tengo el siguiente código para generar un campo de entrada para la dirección de correo electrónico del usuario

$email = new Zend_Form_Element_Text(''email''); $email->setLabel(''Email:'') ->addFilters(array(''StringTrim'', ''StripTags'')) ->addValidator(''EmailAddress'') ->addValidator(new Zend_Validate_Db_NoRecordExists( array( ''adapter''=>Zend_Registry::get(''user_db''), ''field''=>''email'', ''table''=>''tbl_user'' ))) ->setRequired(true) ->setDecorators(array( array(''Label'', array(''escape''=>false, ''placement''=>''append'')), array(''ViewHelper''), array(''Errors''), array(''Description'',array(''escape''=>false,''tag''=>''div'')), array(''HtmlTag'', array(''tag'' => ''div'')), )); $this->addElement($email);

ahora el problema es si el usuario introduce un nombre de host no válido para el correo electrónico, genera 3 errores. digamos que el usuario ingrese ''admin @ l'' como dirección de correo electrónico, y los errores serán
* ''l'' no es un nombre de host válido para la dirección de correo electrónico ''admin @ l''
* ''l'' no coincide con la estructura esperada para un nombre de host DNS
* ''l'' parece ser un nombre de red local, pero los nombres de red local no están permitidos

Solo quiero que den solo un error personalizado en lugar de todos estos. Si configuro el mensaje de error "Dirección de correo electrónico no válida" por el método addErrorMessage, volverá a generar el mismo mensaje en db_validation.


Usar un validador personalizado es la única forma que encontré para evitar este problema.

Si lo que quieres es:

  • Tener solo un mensaje de error si la dirección de correo electrónico está en un formato incorrecto
  • Si el formato es bueno, valide si la dirección de correo electrónico ya está en la base de datos

Entonces te sugiero que hagas algo como esto:

$where = array(''users'', ''email'', array(''field'' => ''user_id'', ''value'' => $this->getAttrib(''user_id''))); $email = new Zend_Form_Element_Text(''email''); $email->setLabel(''E-mail:'') ->setRequired(true) ->setAttrib(''required name'', ''email'') // html5 ->setAttrib(''maxlength'', ''50'') ->addFilter(''StripTags'') ->addFilter(''StringTrim'') ->addFilter(''StringToLower'') ->addValidator(''email'', true) ->addValidator(''stringLength'', true, array(1, 50)) ->addValidator(''db_NoRecordExists'', true, $where) ->addDecorators($this->_elementDecorators); $this->addElement($email);

$this->getAttrib(''user_id'') representa la identificación del usuario actual .

Aquí hay tres validadores, todos tienen su segundo parámetro $breakOnFailure establecido en false , por lo que si falla un validador, no se $breakOnFailure los otros.

El primer validador es el correo electrónico , que es mi propio validador personalizado:

class My_Validate_Email extends Zend_Validate_EmailAddress { public function getMessages() { return array(''invalidEmail'' => ''Your email address is not valid.''); } }

Puede agregar este validador en su biblioteca, en / application / library / My / Validate por ejemplo, y luego agregar $this->addElementPrefixPath(''My_Validate'', ''My/Validate'', ''validator''); en tu forma. Por supuesto, debe reemplazar "Mi" por el nombre de su biblioteca.

Ahora, si un correo electrónico está en el formato incorrecto, siempre mostrará ''Su dirección de correo electrónico no es válida''. Si su correo electrónico es demasiado largo y no cabe en su campo de base de datos (VARCHAR (100) por ejemplo), mostrará los errores del validador de longitud de cadena, y en el último caso, si ya existe una entrada en la base de datos, solo esto error será mostrado.

Por supuesto, puede agregar más métodos a su validador personalizado y sobrecargar setMessages, para que pueda mostrar sus propios mensajes sea cual sea el formulario en el que esté trabajando.

Espero que pueda ayudar a alguien!


Tienes que crear una instancia de la clase Zend_Validate_EmailAddress y llamar al método setMessages y luego anular los mensajes que te gusten, para eliminar los que mencionas sería algo como esto:

$emailValidator->setMessages(array( Zend_Validate_EmailAddress::INVALID_FORMAT => "Your error message", Zend_Validate_Hostname::INVALID_HOSTNAME => "Your error message", Zend_Validate_Hostname::LOCAL_NAME_NOT_ALLOWED => "Your error message" ));

Espero que esto ayude a alguien :-)


$email->addErrorMessage("Please Enter Valid Email Address");

puedes usar un validador personalizado crear un archivo Email.php dentro de la carpeta Validar en la carpeta de tu biblioteca en la raíz del proyecto

class Validate_Email extends Zend_Validate_Abstract { const INVALID = ''Email is required''; protected $_messageTemplates = array( self::INVALID => "Invalid Email Address", self::ALREADYUSED => "Email is already registered" ); public function isValid($value) { if(preg_match($email_regex, trim($value))){ $dataModel = new Application_Model_Data(); //check if the email exists if(!$dataModel->email_exists($value)){ return true; } else{ $this->_error(self::ALREADYUSED); return false; } } else { $this->_error(self::INVALID); return false; } } }

y en tu archivo form.php

$mailValidator = new Validate_Email(); $email->addValidator($mailValidator, true);

No sé si funciona o no, pero para mí funcionó en caso de teléfono. Cortesía de http://softwareobjects.net/technology/other/zend-framework-1-10-7-telephone-validator/



Bueno, es una respuesta tardía, pero creo que siempre es útil.

Simplemente agregue verdadero como el segundo parámetro de addValidator ()

De Zend docs ( http://framework.zend.com/apidoc/1.8/ ):

addValidator (línea 67)

Agrega un validador al final de la cadena

Si $ breakChainOnFailure es verdadero, si el validador falla, el siguiente validador de la cadena, si existe, no se ejecutará.

return: proporciona una interfaz fluida

acceso: público

Aquí la firma:

Zend_Validate addValidator (Zend_Validate_Interface $validator, [boolean $breakChainOnFailure = false]) Zend_Validate_Interface $validator boolean $breakChainOnFailure

Entonces el código es:

$email = new Zend_Form_Element_Text(''email''); $email->setLabel(''Email:'') ->addFilters(array(''StringTrim'', ''StripTags'')) ->addValidator(''EmailAddress'', TRUE ) // added true here ->addValidator(new Zend_Validate_Db_NoRecordExists( array( ''adapter''=>Zend_Registry::get(''user_db''), ''field''=>''email'', ''table''=>''tbl_user'' ), TRUE ) );