/** * Helper method. Retrieves all elements from fieldset the $element belongs to. * * @param ElementInterface $element * @param FieldsetInterface $fieldset * @return array|\Traversable */ protected function getFieldsetElements(ElementInterface $element, FieldsetInterface $fieldset) { $elementName = $this->normalizeElementName($element->getName()); if ($fieldset->has($elementName) && $fieldset->get($elementName) === $element) { return array_merge($fieldset->getElements(), $fieldset->getFieldsets()); } if ($fieldset instanceof Element\Collection && (($elements = $this->getFieldsetElements($element, $fieldset->getTargetElement())) || ($template = $fieldset->getTemplateElement()) && ($elements = $this->getFieldsetElements($element, $template)))) { return $elements; } foreach ($fieldset->getFieldsets() as $fieldsetElement) { if ($elements = $this->getFieldsetElements($element, $fieldsetElement)) { return $elements; } } return []; }
/** * Prepare the validation group in case Collection elements were used (this function also handle the case where elements * could have been dynamically added or removed from a collection using JavaScript) * * @param FieldsetInterface $formOrFieldset * @param array $data * @param array $validationGroup */ protected function prepareValidationGroup(FieldsetInterface $formOrFieldset, array $data, array &$validationGroup) { foreach ($validationGroup as $key => &$value) { if (!$formOrFieldset->has($key)) { continue; } $fieldset = $formOrFieldset->byName[$key]; if ($fieldset instanceof Collection) { if (!isset($data[$key]) && $fieldset->getCount() == 0) { unset($validationGroup[$key]); continue; } $values = array(); if (isset($data[$key])) { foreach (array_keys($data[$key]) as $cKey) { $values[$cKey] = $value; } } $value = $values; } else { if (!isset($data[$key])) { $data[$key] = array(); } $this->prepareValidationGroup($fieldset, $data[$key], $validationGroup[$key]); } } }
/** * Prepare the validation group in case Collection elements were used (this function also handle the case where elements * could have been dynamically added or removed from a collection using JavaScript) * * @param FieldsetInterface $formOrFieldset * @param array $data * @param array $validationGroup */ protected function prepareValidationGroup(FieldsetInterface $formOrFieldset, array $data, array &$validationGroup) { foreach ($validationGroup as $key => &$value) { if (!$formOrFieldset->has($key)) { continue; } $fieldset = $formOrFieldset->byName[$key]; if ($fieldset instanceof Collection) { if (!isset($data[$key])) { unset($validationGroup[$key]); continue; } $values = array(); $count = count($data[$key]); for ($i = 0; $i != $count; ++$i) { $values[] = $value; } $value = $values; } else { if (isset($data[$key])) { $this->prepareValidationGroup($fieldset, $data[$key], $validationGroup[$key]); } } } }