Skip to content

Instantly share code, notes, and snippets.

@neonxp
Forked from Graceas/FormErrorsSerializer.php
Last active September 28, 2017 10:12
Show Gist options
  • Save neonxp/d4fc482b084c0ed6e077e22b8b589309 to your computer and use it in GitHub Desktop.
Save neonxp/d4fc482b084c0ed6e077e22b8b589309 to your computer and use it in GitHub Desktop.
Symfony 2 Form Error Serializer. May be used for AJAX form validation. Allows tree and flat array styles for errors.
class FormErrorsSerializer {
public function serializeFormErrors(\Symfony\Component\Form\Form $form, $flat_array = false, $add_form_name = false, $glue_keys = '_')
{
$errors = array();
$errors['global'] = array();
$errors['fields'] = array();
foreach ($form->getErrors() as $error) {
$errors['global'][] = $error->getMessage();
}
$errors['fields'] = $this->serialize($form);
if ($flat_array) {
$errors['fields'] = $this->arrayFlatten($errors['fields'],
$glue_keys, (($add_form_name) ? $form->getName() : ''));
}
return $errors;
}
private function serialize(\Symfony\Component\Form\Form $form)
{
$local_errors = array();
foreach ($form->getIterator() as $key => $child) {
foreach ($child->getErrors() as $error){
$local_errors[$key] = $error->getMessage();
}
if (count($child->getIterator()) > 0) {
$local_errors[$key] = $this->serialize($child);
}
}
return $local_errors;
}
private function arrayFlatten($array, $separator = "_", $flattened_key = '') {
$flattenedArray = array();
foreach ($array as $key => $value) {
if(is_array($value)) {
$flattenedArray = array_merge($flattenedArray,
$this->arrayFlatten($value, $separator,
(strlen($flattened_key) > 0 ? $flattened_key . $separator : "") . $key)
);
} else {
$flattenedArray[(strlen($flattened_key) > 0 ? $flattened_key . $separator : "") . $key] = $value;
}
}
return $flattenedArray;
}
}
$fields = ['fields' => []];
foreach ($form->all() as $field) {
$name = $field->getName();
$type = $field->getConfig()->getType()->getBlockPrefix();
$fields['fields'][$name] = ['type' => $type];
}
echo json_encode($fields, JSON_PRETTY_PRINT);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment