Dinuka Thilanga
Dinuka Thilanga

Reputation: 4330

ZF2 remove isEmpty validation for form element

I need use form element with out isEmpty validation. This is my code.

$this->add(array(
    'name' => 'test',
    'type' => 'Zend\Form\Element\Number',
    'attributes' => array(
        'class' => 'form-control',           
    )        
));

But following validation message is given.

[test] => Array
        (
            [isEmpty] => Value is required and can't be empty
        )

How can i remove it?

Upvotes: 1

Views: 1751

Answers (3)

blackbishop
blackbishop

Reputation: 32640

You could do that by creating new ValidatorChain, and then loop through the validators attached to your element and dettach the Zend\Validator\NotEmpty validator. Just like this :

$newValidatorChain = new \Zend\Validator\ValidatorChain;

foreach ($form->getInputFilter()->get('test')->getValidatorChain()->getValidators() 
          as $validator) 
{
//Attach all validators except the \Zend\Validator\NotEmpty one

if (!($validator['instance'] instanceof \Zend\Validator\NotEmpty)) {
    $newValidatorChain->addValidator($validator['instance'],
                                     $validator['breakChainOnFailure']);
}
}
$form->getInputFilter()->get('test')->setValidatorChain($newValidatorChain);
      

Upvotes: 1

Rob Allen
Rob Allen

Reputation: 12778

If you have a specific form class, add a getInputFilterSpecification method with your validation rules:

class MyForm extends \Zend\Form\Form
{
    public function init() // or __construct() if not using element manager
    {
        $this->add(array(
            'name' => 'test',
            'type' => 'Zend\Form\Element\Number',
            'attributes' => array(
                'class' => 'form-control',
            )
        ));
    }

    public function getInputFilterSpecification()
    {
        return [
            'test' => [
                'required' => false,
            ]
        ];
    }
}

Upvotes: 1

Marcin Twardowski
Marcin Twardowski

Reputation: 574

Look here: https://github.com/zendframework/zf2/blob/master/library/Zend/Form/Element/Number.php#L95

You can extend this class and overload getInputSpecification function and return array without 'required' => true

Like this:

namespace Your\Form\Elements;
use Zend\Form\Element\Number;
class NumberWithoutRequired extends Number{
    public function getInputSpecification()
    {
        return array(
            'name' => $this->getName(),
            'required' => false,
            'filters' => array(
                array('name' => 'Zend\Filter\StringTrim')
            ),
            'validators' => $this->getValidators(),
        );
    }
}

And then use this class for input in Your form instead of original Zend\Form\Element\Number class

Upvotes: 1

Related Questions