Question

I have a Registration form.

namespace User\Form;

use Zend\Form\Form;

class Register extends Form {

    public function __construct() {
        parent::__construct('register');
        $this->setAttribute('action', 'new-account');
        $this->setAttribute('method', 'post');

        //$this->setInputFilter(new \User\Form\RegisterFilter); - used this prior to learning Fieldset
        $this->add(new \User\Form\RegisterFieldsetUser);

        // Submit
        $this->add(array(
            'name' => 'submit',
                'attributes' => array(
                'type' => 'submit',
                'value' => 'Register',
                'class' => 'btn btn-primary',
            ),
        ));
    }
}

and the User fieldset: (to make this short I've only left on field)

namespace User\Form;

use Zend\Form\Fieldset;

class RegisterFieldsetUser extends Fieldset {

    public function __construct() {
        parent::__construct('user');

        // User Identifier
        $identifier = new \Zend\Form\Element\Email();
        $identifier->setName('identifier');
        $identifier->setAttributes(array(
            'id' => 'user-email',
            'placeholder' => 'Email'
        ));
        $identifier->setLabel('Your email:');

        $this->add($identifier);
    }

    public function getInputFilterSpecification() {
        return array(
            'identifier' => array(
                'filters' => array(
                    array('name' => 'StringTrim'),
                ),
                'validators' => array(
                    array(
                        'name' => 'NotEmpty',
                        'break_chain_on_failure' => true,
                        'options' => array(
                            'messages' => array(
                                \Zend\Validator\NotEmpty::IS_EMPTY => 'You really have to enter something!',
                            ),
                        ),
                    ),
                    array(
                        'name' => 'EmailAddress',
                        'options' => array(
                            'messages' => array(
                                \Zend\Validator\EmailAddress::INVALID_FORMAT => 'Hmm... this does not look valid!',
                            ),
                        ),
                    ),
                ),
            ),
        );
    }
}

this is my action:

public function registerAction() {
    $registerForm = new \User\Form\Register;

    if ($this->getRequest()->isPost()) {
        // Form processing
        $formData = $this->getRequest()->getPost();
            if ($registerForm->isValid()) {
                // Yeeeeei
            } else {
                $registerForm->setData($formData);
                return new ViewModel(array(
                    'form' => $registerForm,
                ));
            }
    } else {
        return new ViewModel(array(
            'form' => $registerForm,
        ));
    }
}

Now, if I submit the form without entering anything, I get the message : "Value is required and can't be empty" (which is NOT the message I have set). But it's not an issue with the messages I set, because if I submit the form with an invalid email address ("asd/") then it doesn't say anything, no validation error. So, I assume no validation happens here.

Any clue why? Before learning to use filedset, I had an InputFilter which worked perfectly fine, but following the book's learning curve, I got to using Fieldset.

I'm just a zf newb, learning from this book I've bought from leanpub (Michael Romer's "Web development with zf2"). I don't know the version used in the book (it was last updated in august 2013), but I use the latest (2.2.5).

Was it helpful?

Solution

If you want to add filter specification by getInputFilterSpecification method your form class (or fieldset class) MUST implement InputFilterProviderInterface. So:

<?php

use Zend\InputFilter\InputFilterProviderInterface;

class RegisterFieldsetUser extends Fieldset
    implements InputFilterProviderInterface
{
    ...
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top