5
votes

I'm in a process of creating a registration form:

here is my action:

public function registrationAction() {
    $form = new RegistrationForm();

    $request = $this->getRequest();
    if ($request->isPost()) {
        $users = new Users();
        $form->setInputFilter($users->getInputFilter());
        $form->setData($request->getPost());

        var_dump($form->isValid());
        exit;

        if ($form->isValid()) {
            $users->exchangeArray($form->getData());
            $this->getUsersTable()->addUser($users);
            $message = 'Регистрирахте се успешно! Можете да влезете в профила си чрез формата за вход на началната страница.';
        }
    }

    return new ViewModel(array(
                'form' => $form,
                'message' => $message,
            ));
}

And here is my form:

namespace Main\Form;

use Zend\Form\Form;

class RegistrationForm extends Form {

public function __construct($name = null) {
    parent::__construct('User');

    $this->add(array(
        'name' => 'username',
        'attributes' => array(
            'type' => 'Zend\Form\Element\Text',
        ),
        'options' => array(
            'label' => 'Потребителско име',
        ),
    ));

    $this->add(array(
        'name' => 'email',
        'attributes' => array(
            'type' => 'Zend\Form\Element\Text',
        ),
        'options' => array(
            'label' => 'Email адрес',
        ),
    ));

    $this->add(array(
        'name' => 'password',
        'attributes' => array(
            'type' => 'Zend\Form\Element\Text',
        ),
        'options' => array(
            'label' => 'Парола',
        ),
    ));

    $this->add(array(
        'name' => 'submit',
        'attributes' => array(
            'type' => 'Zend\Form\Element\Submit',
        ),
        'options' => array(
            'label' => 'Регистрация',
        )
    ));
}

}

Here is the inputFilter in the Users model in Object\Model\Users.php:

namespace Object\Model;

use Zend\Validator\StringLength;
use Zend\Validator\NotEmpty;
use Zend\Validator\EmailAddress;
use Zend\Validator\Date;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

class Users {

public $user_id;
public $username;
public $name;
public $email;
public $password;
public $sex;
public $birthday;
public $avatar;
public $user_level;
public $date_registered;
public $is_active;
public $is_banned;

public function exchangeArray($data) {
    $this->user_id = (isset($data['user_id'])) ? $data['user_id'] : null;
    $this->username = (isset($data['username'])) ? $data['username'] : null;
    $this->name = (isset($data['name'])) ? $data['name'] : null;
    $this->email = (isset($data['email'])) ? $data['email'] : null;
    $this->password = (isset($data['password'])) ? $data['password'] : null;
    $this->sex = (isset($data['sex'])) ? $data['sex'] : null;
    $this->birthday = (isset($data['birthday'])) ? $data['birthday'] : null;
    $this->avatar = (isset($data['avatar'])) ? $data['avatar'] : null;
    $this->user_level = (isset($data['user_level'])) ? $data['user_level'] : null;
    $this->date_registered = (isset($data['date_registered'])) ? $data['date_registered'] : null;
    $this->is_active = (isset($data['is_active'])) ? $data['is_active'] : null;
    $this->is_banned = (isset($data['is_banned'])) ? $data['is_banned'] : null;
}

public function setInputFilter(InputFilterInterface $inputFilter) {
    throw new \Exception('Not used');
}

public function getInputFilter() {
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();

        $factory = new InputFactory();

        $inputFilter->add($factory->createInput(array(
                    'name' => 'user_id',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'username',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'NotEmpty',
                            'options' => array(
                                'messages' => array(
                                    NotEmpty::IS_EMPTY => 'Моля въведете потребителско име!',
                                ),
                            ),
                        ),
                        array(
                            'name' => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min' => 1,
                                'max' => 50,
                                'messages' => array(
                                    StringLength::TOO_SHORT => 'Потребителското име трябва да бъде минимум 1 символ',
                                    StringLength::TOO_LONG => 'Потребителското име не може да надвишава 50 символа',
                                ),
                            ),
                        ),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'name',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'max' => 255,
                                'messages' => array(
                                    StringLength::TOO_LONG => 'Вашите име и фамилия не може да надвишават 255 символа',
                                ),
                            ),
                        ),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'email',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'NotEmpty',
                            'options' => array(
                                'messages' => array(
                                    NotEmpty::IS_EMPTY => 'Моля въведете email адрес!',
                                ),
                            ),
                        ),
                        array(
                            'name' => 'EmailAddress',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min' => 1,
                                'max' => 50,
                                'messages' => array(
                                    EmailAddress::INVALID => 'Email адресът е невалиден.',
                                ),
                            ),
                        ),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'password',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'NotEmpty',
                            'options' => array(
                                'messages' => array(
                                    NotEmpty::IS_EMPTY => 'Моля въведете парола!',
                                ),
                            ),
                        ),
                        array(
                            'name' => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min' => 4,
                                'max' => 90,
                                'messages' => array(
                                    StringLength::TOO_SHORT => 'Паролата трябва да бъде минимум 4 символ',
                                    StringLength::TOO_LONG => 'Паролата не може да надвишава 90 символа',
                                ),
                            ),
                        ),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'sex',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'birthday',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                    'validators' => array(
                        array(
                            'name' => 'Date',
                            'options' => array(
                                Date::INVALID_DATE => 'Въведената дата е грешна.',
                            ),
                        ),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'avatar',
                    'filters' => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'user_level',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'date_registered',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'is_active',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $inputFilter->add($factory->createInput(array(
                    'name' => 'is_banned',
                    'filters' => array(
                        array('name' => 'Int'),
                    ),
                )));

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

}

When I try to access isValid() or getMessages() methods of the $form object, they're empty. When calling them in var_dump, they're always boolean false... May someone help me? Thanks in advance. This happens only in this module. In my other module, everything's okay with the forms. This ZF2 is so complicated at times... :|

5
Please provide the InputFilter - Sam
I edited the main post. - Георги Банков
Where are you trying to getMessages() ? after isValid right? - Andrew

5 Answers

9
votes

I had the same problem as you, isValid() would return false, and getMessages() would be an empty array.

My issue was that I have defined an input validator for a field (for example email), but that field did not exist on the form I was validating. It seems there is a bug in Zend Framework 2 that doesn't print error messages in this case: bug report on github

So the solution is to add the missing field to the form object.

6
votes

Check your spellings of the Field names matches the name in the Input filter - I did the same thing.

2
votes

I had the same problem and it was because the form and the filter did not have the same number of attributes.

Your registration form has less properties then your filter.

0
votes

It's normal you wrote that (in controller) ?

var_dump($form->isValid());
exit;

Maybe it's about "messages" are just displayed if an error occurs, isn't ?

0
votes

I couldn't find the error, but here are some tips:

You don't need to use InputFactory to set elements to the InputFilter, ZF2 will do it automatically (ZF2 Docs)

Finally, the default InputFilter implementation is backed by a Factory. This means that when calling add(), you can provide a specification that the Factory would understand, and it will create the appropriate object. You may create either Input or InputFilter objects in this fashion.

So instead of

$inputFilter->add($factory->createInput(array(
                'name' => 'user_id',
                'filters' => array(
                    array('name' => 'Int'),
                ),
            )));

You can do

$inputFilter->add(array(
    'name' => 'user_id',
         'filters' => array(
             array('name' => 'Int'),
          ),
     ));

Another thing, if you call $form->isValid() two times for the same instance, the second one will cause some invisible error and the rest of the code won't be executed. I don't know what error happens but you can call isValid once for each $form instance.