Custom Zend Validator error messages

The Zend Validator error messages are not the most helpful. Considor the below code for creating a file input:

$this->addElement('file', 'signature', array(
    'validators' => array(
        array('Size', false, 20480), //20k
        array('Extension', false, 'png'),
    ),
    'required' => false,
    'label' => 'Signature',
    'destination' => SIG_PATH,
));

For instance, on the above file input, if you attempt to upload something that is not a PNG file (i.e. photo.JPG, the message will be:

File 'photo.JPG' has a false extension

That’s not very user friendly as it doesn’t give the user any indication of what is an “allowed” file type.

So, to combat this, create separate Zend Validators and attach them to the Form Elements separately:

$this->addElement('file', 'signature', array(
    'required' => false,
    'label' => 'Signature',
    'destination' => SIG_PATH,
    'maxfilesize' => 20480,
));

$fileSize = new Zend_Validate_File_Size(20480);
$fileSize->setMessage('Please only upload a picture with a maximum 20kb file size');

$fileType = new Zend_Validate_File_Extension('png');
$fileType->setMessage('Only .png files are acceptable for signatures.');

$sig = $this->getElement('signature');
$sig->addValidators(array($fileSize, $fileType));

This way you have total control over the messages sent to the user. And after all, user experience is key these days.

3 comments on “Custom Zend Validator error messages

  1. Cooler April 18, 2012 2:27 pm

    Also you can extend built-in validators (I would really recommend that) for your own error messages like this (I needed this because of translations into another locales):

    class Validate_NotEmpty extends Zend_Validate_NotEmpty {

    public function __construct() {
    $this->_messageTemplates = array(
    self::IS_EMPTY => __(“hodnota je vyžadována a nesmí být prázdná”), //values is required and must not be empty
    self::INVALID => __(“chybný typ hodnoty (float, string, nebo integer)”)
    ); //invalid value type (float, string or integer)
    }
    }

    Always check $this->_messageTemplates in the class you are extending so that you cover all possible states (there might be more of them).

  2. Cooler April 18, 2012 2:28 pm

    PS: function __($someString) is just a shortcut to tranlatable locales

  3. admin April 18, 2012 2:33 pm

    Thanks, I will read into this

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>