2012-11-08 5 views
6

ich ein Formular mit der Form Komponente von Symfony 2. Da die Validierungsfehler erzeugen in verschiedenen Übersetzungsbereiche übersetzt werden, möchte ich diese Informationen als Option injizieren (translation_domain) während der Erstellung des Formulars, aber finde nicht den richtigen (erfolgreichen) Ort, an dem du dich festlegen musst ... Hinweise?Symfony2: Wo translation_domain in Formularkomponente injizieren

Ich verwende einen benutzerdefinierten Typ zum Bündeln meiner Formularinformationen.

Meine benutzerdefinierte Typenklasse:

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

use Symfony\Component\Validator\Constraints\Collection; 
use Symfony\Component\Validator\Constraints\NotBlank; 

class LoginType extends AbstractType 
{ 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $collectionConstraint = $collectionConstraint = new Collection(array(
      'password' => array(new NotBlank(array('message' => 'custom.error.blank'))), 
      'username' => array(new NotBlank(array('message' => 'custom.error.blank'))) 
     )); 

     $resolver->setDefaults(array(
      'constraints' => $collectionConstraint 
     )); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('username', 'text', array(
      'max_length'  => 250, 
      'trim'    => true 
     )); 
     $builder->add('password', 'password', array(
      'max_length'  => 250, 
      'trim'    => true 
     )); 
    } 

    public function getName() 
    { 
     return 'login'; 
    } 
} 

ein entsprechender Code-Schnipsel auf Formularerstellung in der Steuerung: kann die dynamische translation_domain:

$loginForm = $this->createForm(new LoginType(), $loginDefaultData); 

$loginForm->bind($request); 

[...] 

return $this->render(
    'MyBundle:SubFolder:login.html.twig', 
    array(
     'loginForm' => $loginForm->createView() 
    ) 
); 

Antwort

8

eine Weile später auf das Problem Nach der Rückkehr habe ich den Grund gefunden in setDefaultOptions wie folgt festgelegt werden.

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    // ... 

    $resolver->setDefaults(array(
     'constraints'  => $collectionConstraint, 
     'translation_domain' => 'customTranslationDomain' 
    )); 
} 

jedoch in der verwendeten Zweig Vorlage wird diese translation_domain für Etiketten und Optionen verwendet, aber die Fehlermeldungen nicht mit diesem translation_domain serviert. sie sind immer mit der gleichen festen Set-Domäne ‚Validierer‘ in der Standard-Zweig-Vorlage auf

/Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig

Es übersetzt Normalerweise ist es sinnvoll, diese Nachrichten in einer Domäne zu bündeln, aber nicht in meinem Fall, da die gleiche Einschränkung (und ihre Fehlermeldung) je nach Kontext unterschiedlich übersetzt werden muss und jeder Kontext in einer isolierten Domäne organisiert ist.

Meine Lösung war customize the form rendering as described in the Symfony2 documentation, definieren Sie das form_errors-Fragment und verwenden Sie die dynamische translation_domain Zweigvariable auch für die Fehlermeldung Ausgabe.