簡體   English   中英

Symfony2:在Form Component中注入translation_domain的位置

[英]Symfony2: Where to inject translation_domain in Form Component

我使用Symfony 2的表單組件創建表單。由於驗證錯誤是在不同的翻譯域中翻譯的,我想在創建表單期間將此信息作為選項(translation_domain)注入,但是找不到合適的(成功的)點在哪里設置...任何提示?

我使用自定義類型來捆綁我的表單信息。

我的自定義類型:

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

控制器中表單創建的相關代碼片段:

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

$loginForm->bind($request);

[...]

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

稍后回到問題后,我找到了原因:動態translation_domain可以在setDefaultOptions中設置如下。

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

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

但是,在使用的twig模板中,此translation_domain用於標簽和選項,但錯誤消息不會與此translation_domain一起提供。 它們總是在默認的樹枝模板中使用相同的固定集域“驗證器”進行翻譯

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

將這些消息捆綁在一個域中通常是有意義的,但不是在我的情況下,因為相同的約束(及其錯誤消息)必須根據上下文以不同的方式進行轉換,並且每個上下文都在一個隔離的域中組織。

我的解決方案是按照Symfony2文檔中的描述自定義表單呈現 ,重新定義form_errors片段並使用動態translation_domain twig變量也用於錯誤消息輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM