Yesterday I ran into a problem with zend form and zend validate which was quite confusing. I wanted to check if a multiCheckbox has less or equal 2 selections. I really thought there would be some "shipped" validator but there isn't. Then I've tried to write my own validator for that purpose, but Zend Validate didn't pass the MultiCheckbox values as an array but as strings and I wasnt in the mood to hack the Zend "core" itself. Then I tried to use addError(), markAsError() or set _errorsExists explicit but that didn't work either, as described here. Maybe I am blind and there is an much easier way ... but the following works quite fine for me.

  1. Create an Validator which always fails.
  2. Check right after the isPost() condition if "your condition" matches.
  3. Assign the "will-always-fail" validator to your element and you're done.
// save as 'Zend/Validate/CustomError.php
require_once 'Zend/Validate/Abstract.php';

class Zend_Validate_CustomError extends Zend_Validate_Abstract {

const SOME_ERROR = 'someError';

// configure to whatever you like, or override it with setMessage()
protected $_messageTemplates = array(
    self::SOME_ERROR => "is not valid"
);

// sets the element as invalid
public function isValid($value)
{
    $valueString = (string) $value;
    $this->_setValue($valueString);
	$this->_error();
    return false;
}

}


And in your form controller add right after the isPost() condition:

if(sizeof($_POST['yourelement'])>2) {
	$customError = new Zend_Validate_CustomError();
	$customError->setMessage('You must select less than 2');
	self::getElement('yourelement')->addValidator($customError);
}