Example #1
0
 /**
  * {@inheritDoc}
  */
 public function attachInputFilterDefaults(InputFilterInterface $inputFilter, FieldsetInterface $fieldset)
 {
     $inputFactory = $this->getFormFactory()->getInputFilterFactory();
     if ($fieldset instanceof Collection && $fieldset->getTargetElement() instanceof FieldsetInterface) {
         $elements = $fieldset->getTargetElement()->getElements();
     } else {
         $elements = $fieldset->getElements();
     }
     if (!$fieldset instanceof Collection || !$fieldset->getTargetElement() instanceof FieldsetInterface || $inputFilter instanceof CollectionInputFilter) {
         foreach ($elements as $name => $element) {
             if ($element instanceof StaticElement) {
                 if ($inputFilter->has($name)) {
                     $inputFilter->remove($name);
                 }
                 continue;
             }
             if ($this->getPreferFormInputFilter() && !$this->mergeInputFilter() && $inputFilter->has($name)) {
                 continue;
             }
             if (!$element instanceof InputProviderInterface) {
                 if ($inputFilter->has($name)) {
                     continue;
                 }
                 // Create a new empty default input for this element
                 $input = $inputFactory->createInput(['name' => $name, 'required' => false]);
             } else {
                 // Create an input based on the specification returned from the element
                 $spec = $element->getInputSpecification();
                 $input = $inputFactory->createInput($spec);
                 if ($inputFilter->has($name) && $inputFilter instanceof ReplaceableInputInterface) {
                     $input->merge($inputFilter->get($name));
                     $inputFilter->replace($input, $name);
                     continue;
                 }
             }
             // Add element input filter to CollectionInputFilter
             if ($inputFilter instanceof CollectionInputFilter && !$inputFilter->getInputFilter()->has($name)) {
                 $inputFilter->getInputFilter()->add($input, $name);
             } else {
                 $inputFilter->add($input, $name);
             }
         }
         if ($fieldset === $this && $fieldset instanceof InputFilterProviderInterface) {
             foreach ($fieldset->getInputFilterSpecification() as $name => $spec) {
                 $input = $inputFactory->createInput($spec);
                 $inputFilter->add($input, $name);
             }
         }
     }
     foreach ($fieldset->getFieldsets() as $name => $childFieldset) {
         if (!$childFieldset instanceof InputFilterProviderInterface) {
             if (!$inputFilter->has($name)) {
                 // Add a new empty input filter if it does not exist
                 // (or the fieldset's object input filter),
                 // so that elements of nested fieldsets can be recursively added
                 if ($childFieldset->getObject() instanceof InputFilterAwareInterface) {
                     $inputFilter->add($childFieldset->getObject()->getInputFilter(), $name);
                     // Add input filter for collections via getInputFilterSpecification()
                 } elseif ($childFieldset instanceof Collection && $childFieldset->getTargetElement() instanceof InputFilterProviderInterface && ($spec = $childFieldset->getTargetElement()->getInputFilterSpecification())) {
                     $collectionContainerFilter = new CollectionInputFilter();
                     $filter = $inputFactory->createInputFilter($spec);
                     // Add child elements from target element
                     $childFieldset = $childFieldset->getTargetElement();
                     foreach ($childFieldset->getElements() as $element) {
                         if ($element instanceof StaticElement) {
                             $filter->remove($element->getName());
                         }
                     }
                     $collectionContainerFilter->setInputFilter($filter);
                     $inputFilter->add($collectionContainerFilter, $name);
                     // We need to copy the inputs to the collection input filter
                     if ($inputFilter instanceof CollectionInputFilter) {
                         $inputFilter = $this->addInputsToCollectionInputFilter($inputFilter);
                     }
                 } else {
                     $inputFilter->add($inputFactory->createInputFilter([]), $name);
                 }
             }
             $fieldsetFilter = $inputFilter->get($name);
             if (!$fieldsetFilter instanceof InputFilterInterface) {
                 // Input attached for fieldset, not input filter; nothing more to do.
                 continue;
             }
             if ($fieldsetFilter instanceof CollectionInputFilter) {
                 $fieldsetFilter = $fieldsetFilter->getInputFilter();
             }
             // Traverse the elements of the fieldset, and attach any
             // defaults to the fieldset's input filter
             $this->attachInputFilterDefaults($fieldsetFilter, $childFieldset);
             continue;
         }
         if (!$this->mergeInputFilter() && $inputFilter->has($name)) {
             // if we already have an input/filter by this name, use it
             continue;
         }
         // Create an input filter based on the specification returned from the fieldset
         $spec = $childFieldset->getInputFilterSpecification();
         $filter = $inputFactory->createInputFilter($spec);
         if ($inputFilter->has($name)) {
             $filter = $inputFilter->get($name)->merge($filter);
         } else {
             $inputFilter->add($filter, $name);
         }
         // Recursively attach sub filters
         $this->attachInputFilterDefaults($filter, $childFieldset);
         // We need to copy the inputs to the collection input filter
         // to ensure that all sub filters are added
         if ($inputFilter instanceof CollectionInputFilter) {
             $inputFilter = $this->addInputsToCollectionInputFilter($inputFilter);
         }
     }
 }