6

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()
    )
);
4

1 に答える 1

8

しばらくして問題に戻った後、私は理由を見つけました:動的translation_domainは次のようにsetDefaultOptions内で設定できます。

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

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

ただし、使用されている小枝テンプレートでは、このtranslation_domainはラベルとオプションに使用されますが、エラーメッセージはこのtranslation_domainでは提供されません。それらは常に、デフォルトの小枝テンプレートの同じ固定セットドメイン「バリデーター」で変換されます。

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

通常、これらのメッセージを1つのドメインにバンドルすることは理にかなっていますが、私の場合は、同じ制約(およびそのエラーメッセージ)をコンテキストに応じて異なる方法で変換する必要があり、各コンテキストは分離されたドメインに編成されているためです。

私の解決策は、Symfony2のドキュメントで説明されているようにフォームのレンダリングをカスタマイズし、form_errorsフラグメントを再定義し、エラーメッセージの出力にも動的translation_domaintwig変数を使用することでした。

于 2012-11-13T19:26:24.903 に答える