1

I have a Form\Element with an InputFilter whose 'required' value is set to "false". Under certain circumstances that Element will need the 'required' value set to "true" from within the Controller.

When I set Zend\InputFilter setRequired(true) in my Controller, it doesn't seem to be respected when the $form->isValid() method is called. However, if the filter is set where 'required' is "true" in the Zend\InputFilter (and not dynamically set inside the Controller) then it works as expected - but that's not my desired solution as I use this form and filter in several locations and sometimes the field is required and other times it is not.

In my Controller, I have the following:

$form = new UserDataForm();
$request = $this->getRequest();

if ($request->isPost()) {
    $update = new UserFilter();
    // The following doesn't seem to be respected
    $update->getInputFilter()->get('userName')->setRequired(true);

    $form->setInputFilter($update->getInputFilter());
    $form->setData($request->getPost());

    if($form->isValid()) {
        //The result is true even when the 'userName' var is not set in the POST data.
        echo("Is Valid");
    } else {
        echo($form->getMessages());
    }

I have set my UserDataForm() class like so:

class UserDataForm extends Form
{
public function __construct($name = null, array $userTypes) {
    parent::__construct('user');
    $this->setAttribute('method','post');

    $this->add(array(
        'name' => 'userName',
        'attributes' => array(
            'type' => 'text',
            'class'=> 'small'
        ),
        'options' => array(
            'label' => 'Username:'
        )
    ));

    //... and so on...

I have set my UserFilter class like so:

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

        $inputFilter->add($factory->createInput(array(
            'name'      => 'userName',
            'required'  => false,
            'filters'   => array(
                array('name' => 'StripTags'),
                array('name' => 'StringTrim'),
            ),
            'validators' => array(
                array(
                    'name'  => 'StringLength',
                    'options'  => array(
                        'encoding'  => 'UTF-8',
                    )
                ),
            )
        )));

    // ...

Can someone explain why the $update->getInputFilter()->get('userName')->setRequired(true) as called from my Controller doesn't seem to be respected when the form is validated?

1 Answer 1

8

I found the problem after resting on it for a while. Apparently, ->setRequired(true) is mutually exclusive when assigned dynamically. If you are looking for the same behavior as setting 'required' => true from the \FilterInput, then you also need to add ->setAllowEmpty(false) in addition.

So my revised code now looks like this:

$update->getInputFilter()->get('userName')->setRequired(true);
$update->getInputFilter()->get('userName')->setAllowEmpty(false);

Derrick

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.