We have an application where we might have a form structure such as:
Form
`- Collection
`- Fieldset
|- Checkbox
`- Textarea
The Collection
has a dynamic number of items at runtime.
What we’re trying to achieve: I want to validate that at least one of the checkboxes in the collection has been selected.
I have a validator (e.g. AtLeastOneOfTheCheckboxesIsSelectedValidator
) currently on the Collection
element which works fine, basically it validates that at least one of the Checkbox
elements in the collection have been checked. We’re building the forms dynamically from a form spec (don’t ask…) so the input filter spec looks like:
my-collection
|- my-fieldset
| |- my-textarea
| | `- filters
| | |- name = Zend\Filter\StringTrim
| | `- name = Zend\Filter\StripTags
| `- type = Zend\InputFilter\InputFilter
`- validators
`- name = App\Validator\AtLeastOneOfTheCheckboxesIsSelectedValidator
However, looking at how createInput
and createInputFilter
work, it seems that the filters added to my-textarea
are never added, because my-collection
is not an InputFilterInterface
(because I didn’t specify that as the type
, so it treats it as an Input
). It seems it can either behave as an InputFilterInterface
(and contain Input
s) or as an Input
(and have validators/filters), but not both. I only noticed this because we discovered the StringTrim
and StripTags
weren’t actually running.
The AtLeastOneOfTheCheckboxesIsSelectedValidator
gets passed the array of values inside the collection, which means we have access to all the values; the validator loops over the values, identifies which element is the checkbox and when it finds a checked one returns true
early. If it can’t find a checked one, we add a message and return false
(no checkboxes selected).
The problem, in short the AtLeastOneOfTheCheckboxesIsSelectedValidator
on the collection works fine, but the filters
for any elements below the collection are not added due to the way the Zend\InputFilter\Factory
works. I can modify the spec so that the filters
are added properly, but then the AtLeastOneOfTheCheckboxesIsSelectedValidator
does not get added.
Any advice, or ideas on how to make this work, would be appreciated.
We’re using Zend\Form 2.10.0 and Zend\InputFilter 2.7.3 currently (in an Expressive 2.0.2 application on PHP 5.6, but I think that’s largely irrelevant).