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?
Tu peux faire
$form->get('locationRadius')->addError(new FormError('error message'));
Comme les éléments de formulaire sont aussi de type FormInterface
.
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;
}
}