Skip to content

Instantly share code, notes, and snippets.

@skineur
Forked from Graceas/FormErrorsSerializer.php
Last active December 10, 2015 15:01
Show Gist options
  • Select an option

  • Save skineur/e478669e96538ab4fa36 to your computer and use it in GitHub Desktop.

Select an option

Save skineur/e478669e96538ab4fa36 to your computer and use it in GitHub Desktop.
Symfony 2 Form Error Serializer. Form with class and Form without class
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();
if(!empty($form->getConfig()->getDataClass()))
{
foreach ($form->getErrors() as $error) {
$errors['global'][] = $error->getMessage();
}
}else
{
foreach ($this->container->get('validator')->validate($form) 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;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment