web-dev-qa-db-fra.com

Ajouter une erreur à l'élément de formulaire Symfony 2

Je vérifie une validation dans mon contrôleur. Et je veux ajouter l'erreur à un élément spécifique de mon formulaire en cas d'échec. Ma forme:

use Symfony\Component\Form\FormError;

// ...

$config = new Config();
$form = $this->createFormBuilder($config)
        ->add('googleMapKey', 'text', array('label' => 'Google Map key'))
        ->add('locationRadius', 'text', array('label' => 'Location radius (km)'))
        ->getForm();

// ...

$form->addError(new FormError('error message'));

la méthode addError () ajoute une erreur à la forme, pas à l'élément. Comment puis-je ajouter une erreur à l'élément locationRadius?

81
Alex Pliutau

Tu peux faire

$form->get('locationRadius')->addError(new FormError('error message'));

Comme les éléments de formulaire sont aussi de type FormInterface.

168
Mun Mun Das

OK les gars, j'ai un autre moyen. C'est plus complexe et seulement pour des cas spécifiques.

Mon cas:

J'ai un formulaire et après l'envoi, je poste des données sur le serveur de l'API. Et les erreurs que j'ai reçues du serveur API aussi.

Le format d'erreur du serveur d'API est:

array(
    'message' => 'Invalid postal code',
    'propertyPath' => 'businessAdress.postalCode',
)

Mon objectif est d'obtenir une solution flexible. Permet de définir l'erreur pour le champ correspondant.

$vm = new ViolationMapper();

// Format should be: children[businessAddress].children[postalCode]
$error['propertyPath'] = 'children['. str_replace('.', '].children[', $error['propertyPath']) .']';

// Convert error to violation.
$constraint = new ConstraintViolation(
    $error['message'], $error['message'], array(), '', $error['propertyPath'], null
);

$vm->mapViolation($constraint, $form);

C'est ça!

REMARQUE! addError() méthode contourne error_mapping option.


Mon formulaire (formulaire d'adresse intégré dans le formulaire de société):

Société

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Company extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('companyName', 'text',
                array(
                    'label' => 'Company name',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('businessAddress', new Address(),
                array(
                    'label' => 'Business address',
                )
            )
            ->add('update', 'submit', array(
                    'label' => 'Update',
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}

Adresse

<?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints;

class Address extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // ...
            ->add('postalCode', 'text',
                array(
                    'label' => 'Postal code',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('town', 'text',
                array(
                    'label' => 'Town',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
            ->add('country', 'choice',
                array(
                    'label' => 'Country',
                    'choices' => $this->getCountries(),
                    'empty_value' => 'Select...',
                    'constraints' => array(
                        new Constraints\NotBlank()
                    ),
                )
            )
        ;
    }

    public function getName()
    {
        return null;
    }
}
8
Jekis