ここで必要なものと同様の動的フォームを作成しています。
さて、私はそれを機能させることができました。しかし、動的ドロップダウンの後にタイプのネイティブフィールドが表示されるようにしたいと思います。ご覧のとおり、ドロップボックスは 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'));
と、すべてのテキストが受け入れられます。
これを行うためのより良い方法はありますか?