Symfony2フォーム要素にエラーを追加


83

コントローラーで検証を確認します。そして、失敗したときにフォームの特定の要素にエラーを追加したいと思います。私のフォーム:

use Symfony\Component\Form\FormError;

// ...

$config = new Config();
$form = $this->createFormBuilder($config)
        ->add('googleMapKey', 'text', array('label' => 'Google Map key'))
        ->add('locationRadius', 'text', array('label' => 'Location radius (km)'))
        ->getForm();

// ...

$form->addError(new FormError('error message'));

addError()メソッドは、要素ではなくフォームにエラーを追加します。locationRadius要素にエラーを追加するにはどうすればよいですか?

回答:


178

できるよ

$form->get('locationRadius')->addError(new FormError('error message'));

フォーム要素もFormInterfaceタイプです。


@ m2mdas、素晴らしい答えです!これをどのように翻訳しますか?FormErrorインスタンスを作成すると、それは変換されないので、私は正しいですか?試してみましたが、翻訳されていません。理にかなっていると思います。FormErrorインスタンスをどのように変換しますか?
ミック

2
こんにちは@Patt、返信が遅くなってすみません。バリデータコンポーネントは、エラーメッセージがフォームに追加される前に、フォーム制約違反メッセージの変換を処理します。カスタムエラーを追加するために、他の文字列の場合と同じ方法でメッセージを翻訳しました。例:$this->get('translator')->trans('error message')
Mun Mun Das

1
@ m2mdasしかし、このエラーをビューにどのように出力しますか?これを試してみましたform_errors(form)が、小枝には入りません。
Nat Naydenova 2015

1
@NatNaydenova久しぶりですが、試してみてくださいform_erros(form.my_field_name)
TMichel 2015

3
注意:form_errors(form)を使用して印刷するエラーを取得するには、フォーム自体にエラーを追加します。例:$ form-> addError(new FormError( 'error msg');
beterthanlife 2017年

8

OKみんな、私には別の方法があります。それはより複雑で、特定の場合にのみです。

私の場合:

フォームがあり、送信後、APIサーバーにデータを投稿します。また、APIサーバーからもエラーが発生しました。

APIサーバーのエラー形式は次のとおりです。

array(
    'message' => 'Invalid postal code',
    'propertyPath' => 'businessAdress.postalCode',
)

私の目標は、柔軟なソリューションを取得することです。対応するフィールドのエラーを設定しましょう。

$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);

それでおしまい!

注意! addError()メソッドはerror_mappingオプションをバイパスします。


私のフォーム(会社のフォームに埋め込まれた住所フォーム):

会社

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

住所

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

これらのコードはどこに配置しますか?$ vm = new ViolationMapper();
vidy videni 2015年

@vidyvideni、フォーム送信が処理されるコントローラーアクション。また、このコードを調整して別のメソッドに移動することもできます
Jekis 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.