2012-11-08 13 views
6

creo un modulo utilizzando il componente modulo di Symfony 2. Come gli errori di validazione sono tradotti in diversi domini di traduzione, voglio di iniettare queste informazioni come opzione (translation_domain) durante la creazione del modulo, ma non trovi il posto giusto (riuscito) dove impostare ... Qualche suggerimento?Symfony2: Dove iniettare translation_domain in forma di componente

Uso un tipo personalizzato per raggruppare le informazioni del modulo.

mio tipo personalizzato classe:

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'; 
    } 
} 

frammenti di codice rilevanti sulla creazione di moduli nel controllore:

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

$loginForm->bind($request); 

[...] 

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

risposta

8

Dopo il ritorno al problema un po 'più tardi, ho trovato il motivo: il translation_domain dinamico può essere impostato all'interno di setDefaultOptions come seguito.

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

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

Tuttavia, nel modello ramoscello utilizzato, questo translation_domain viene utilizzato per le etichette e le opzioni, ma i messaggi di errore non sono serviti con questo translation_domain. sono sempre tradotti con lo stesso dominio impostato fisso 'validatori' nel modello predefinito ramoscello a

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

E ' normalmente ha senso raggruppare questi messaggi in un dominio, ma non nel mio caso, poiché lo stesso vincolo (e il suo messaggio di errore) deve essere tradotto in modi diversi a seconda del contesto e ogni contesto è organizzato in un dominio isolato.

La mia soluzione era customize the form rendering as described in the Symfony2 documentation, ridefinire il frammento form_errors e utilizzare la variabile dinamica ramoscello translation_domain anche per l'output del messaggio di errore.

Problemi correlati