3

ここで必要なものと同様の動的フォームを作成しています

さて、私はそれを機能させることができました。しかし、動的ドロップダウンの後にタイプのネイティブフィールドが表示されるようにしたいと思います。ご覧のとおり、ドロップボックスは PRE_SET_DATA イベント (フォームがビルドされ、名前フィールドが追加された後) でフォームに追加されるため、これはすぐに使用できるものではありません。

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('country', 'entity', array(
        'class'=>'TestBundle:Country', 
        'property'=>'name', 
        'property_path'=>false //Country is not directly related to City
    ));
    $builder->add('name');

    $factory = $builder->getFormFactory();

     (...)

     $builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates, $setCountry)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if($data == null)
            return;

        if($data instanceof City){
            $country = ($data->getId()) ? $data->getState()->getCountry() : null ;
            $refreshStates($form, $country);
            $setCountry($form, $country);
        }
    });

これをbuildForm関数の先頭に追加して、nameフィールドに対して同じことを試みました:

$addBaseFields = function ($form) use ($factory)
    {
        $form->add($factory->createNamed('text', 'name'));
    };

そして、イベントに追加しました:

 $builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) use ($refreshStates, $setCountry)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if($data == null)
            return;

        if($data instanceof City){
            $country = ($data->getId()) ? $data->getState()->getCountry() : null ;
            $refreshStates($form, $country);
            $setCountry($form, $country);
            $addBaseFields($form);
        }
    });

この種の作品。しかし、html5 フィールドの検証が機能しなくなりました。たとえば、名前を「テキスト」ではなく「数値」タイプとして定義する$form->add($factory->createNamed('number', 'name')); と、すべてのテキストが受け入れられます。

これを行うためのより良い方法はありますか?

4

1 に答える 1

2

これは、バージョン 2.0 および 2.1 の Symfony バグであり、フォーム イベントとは関係ありません。

'9fgda' のような文字列が 'number' フィールドに入力された場合、検証エラーは発生せず、文字列値 '9fgda' は数値 '9' に変換され、エラーは発生しません。

これは NumberFormatter が原因であり、バージョン 2.2 で修正する必要があります。

このバグの詳細はこちら

于 2012-10-24T14:56:08.827 に答える