Zend provee mucho tipos validaciones comunes para los campos de un formulario, pero siempre existe la posibilidad de validar algo fuera de lo común, como por ejemplo; donde un elemento se compare con otro elemento, o con la base de datos, o realice una operación matemática e incluso espere una confirmación externa. Son muchas las posibilidades, lo importante es su flexible expansión a nuestros requerimientos.
A continuación explicamos e ilustramos paso a paso como lograrlo, antes, una prevé descripción de la situación que vamos a tratar: Se requiere validar que una fecha de viaje sea siempre menor o igual para su regreso, por lo que es imposible (o que yo sepa) que una persona viaje al futuro y regrese al presente.
Paso 1: Creamos una clase que hereda de “Zend_Validate_Abstract” y la guardamos en la siguiente ruta “library/Validator” con el nombre “LessThanElement.php”. Esta debe contener el siguiente código:
<?php

class Validator_LessThanElement extends Zend_Validate_Abstract {
  const MSG_LESSTHEN = 'msgLessThen';

  /**
   * Definimos el mensaje de error con sus respectivas variables.
   * 
   * @var array
   */
  protected $_messageTemplates = array(
    self::MSG_LESSTHEN => "'%value%' no puede ser menor que '%token%'."
  );
    
  /**
   * Definimos las variables que se van a usar para construir el mensaje de
   * error. El índice corresponde al nombre que se usara en el mensaje, y el
   * valor a la variable que se utiliza en el código.
   * 
   * @var array
   */
  protected $_messageVariables = array(
    'token' => 'token'
  );
    
  /**
   * Variable tipo arreglo utilizado para contener todos los elementos que
   * requieran ser analizados durante la validación, estas son las opciones
   * que se pasan como tercer parámetros al método addValidator.
   *
   * @var array
   */
  protected $_options = array();
    
  /**
   * Constructor sobre-escrito que recibe como parámetros las opciones
   * adicionales cuando se pasan al método addValidator.
   * 
   * @param array $options
   */
  public function __construct($options = null) {
    $this->_options = $options;
  }

  /**
   * Método sobre-escrito que determina si un elemento es valido. Este método
   * compara si un elemento es mayor que otro elemento.
   * 
   * @param string $value
   * @param array $context
   * @return boolean 
   */
  public function isValid($value, $context = null) {
    $this->_setValue($value);

    foreach($this->_options as $option) {
      if(isset($context[$option])) {
        $this->token = $context[$option];
                
        if($value < $this->token) {
          $this->_error(self::MSG_LESSTHEN);
          return false;
        }
      }
    }

    return true;
  }
}
?>
Paso 2: Creamos el formulario con dos campos para introducir la fecha, su respectivo botón de enviar, y la configuración de la validación de la siguiente forma:
<?php

class Forms_Calendario extends Zend_Form {
  public function init() {
    $date_out = new Zend_Form_Element_Text('txtDateOut');
    $date_out->setLabel('Fecha de salida:')
             ->addFilters(array('StringTrim'))
             ->addValidator('Date')
             ->addValidator('StringLength', true, array(10, 10))
             ->setRequired(true)
             ->setAttrib('autocomplete', 'off')
             ->setAttrib('size', 10);
        
    $date_in = new Zend_Form_Element_Text('txtDateIn');
    $date_in->setLabel('Fecha de entrada:')
            ->addFilters(array('StringTrim'))
            ->addValidator('Date')
            ->addValidator('StringLength', true, array(10, 10))
            ->addPrefixPath('Validator', 'Validator/', Zend_Form_Element::VALIDATE)
            ->addValidator('LessThanElement', false, array('token' => 'txtDateOut'))
            ->setRequired(true)
            ->setAttrib('autocomplete', 'off')
            ->setAttrib('size', 10);
        
    $submit = new Zend_Form_Element_Submit('btnSubmit');
    $submit->setIgnore(true)
           ->setLabel('Enviar');
        
    $this->addElements(array($date_out, $date_in, $submit));
  }
}
En el código anterior podemos observar las dos líneas que están coloreadas con rojo; la primera le indicamos que va agregar un nuevo PlugIn de validación que está ubicado en una determinada ruta, y en la segunda línea, le indicamos que va a realizar una validación en especifico, por lo que requiere de hacer un token a otro elemento para poder compararlo.En la siguiente imagen mostramos el resultado, como podemos ver, se muestra un mensaje personalizado de la validación:

Todo esto se logro gracias a los siguientes links, para mayor información visítelos: