Hi,

since the modification made to Zend_Validate_NotEmpty in ZF 1.9.0 (checking
the value for valid types) radio buttons set with the required flags don't
return the proper error message if submitted without any of its options
checked.

here's a simple example to recreate the problem:

// in a TestController
public function testAction()
{
    $request = $this->getRequest();

    $form = new Zend_Form();
    $form->setAction('/test/test')
         ->setName('formTest')
    ;

    $options = array(
        'no'    => 'no',
        'yes'  => 'yes',
    );

    $form->addElement('Radio', 'testRadio', array(
        'label'        => "test ?",
        'required'     => true,
        'multiOptions' => $options,
    ));

    $form->addElement('Submit', 'suivant', array(
        'required' => false,
        'ignore'   => true,
        'label'    => 'submit test',
    ));

    if ($this->getRequest()->isPost()) {
        if ($form->isValid($request->getPost())) {
            Zend_Debug::dump($form);
        }
    }

    $this->view->form = $form;
}

Now, when submitting the form without selecting any option, we get the
invalid message: "Invalid type given, value should be float, string, or
integer"
Before 1.9.0 we would get the correct and expected message: "Value is
required and can't be empty"

The problem is caused by the addition of those lines in
Zend_Validate_NotEmpty:

if (!is_string($value) && !is_int($value) && !is_float($value) &&
!is_bool($value)) {
    $this->_error(self::INVALID);
    return false;
}

With that check in place, a null $value would get flagged as being of an
INVALID type
A fix would be to check also that the value is not null like this:

if (null !== $value && !is_string($value) && !is_int($value) &&
!is_float($value) && !is_bool($value)) {
    $this->_error(self::INVALID);
    return false;
}

Let me know if I should submit a bug report... or if I shouldn't be
expecting that behavior anymore.

Martin Carpentier

Reply via email to