OK Leute, ich habe einen anderen Weg. Es ist komplexer und nur für bestimmte Fälle.
Mein Fall:
Ich habe ein Formular und nach einreichen poste ich Daten an den API-Server. Und Fehler habe ich auch vom API-Server bekommen.
API-Server-Fehler-Format ist:
array(
'message' => 'Invalid postal code',
'propertyPath' => 'businessAdress.postalCode',
)
Mein Ziel ist es flexible Lösung zu erhalten. Lässt den Fehler für das entsprechende Feld setzen.
$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);
Das war's!
HINWEIS!addError()
Methode umgeht error_mapping Option.
Meine Form (Adresse Form in Form Gesellschaft eingebettet):
Firma
<?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;
}
}
Dank. Es hat mein Problem gelöst. – pltvs
@ m2mdas, gute Antwort! Wie würden wir das übersetzen? Denn sobald wir eine FormError-Instanz erstellt haben, wird sie nicht übersetzt. Habe ich Recht? Ich habe es versucht und es übersetzt es nicht, und ich denke, es macht Sinn. Wie würden Sie eine FormError-Instanz übersetzen? – Mick
Hallo @ Patt, Entschuldigung für die späte Antwort. Die Validator-Komponente kümmert sich um die Übersetzung von Formbedingungsverletzungsnachrichten, bevor die Fehlermeldungen dem Formular hinzugefügt werden. Zum Hinzufügen eines benutzerdefinierten Fehlers haben Sie die Nachricht genauso übersetzt wie für andere Strings. Beispiel: $ this-> get ('translator') -> trans ('error message') ' –