ユーザーとグループの2つのエンティティがあります。それらは多対多の関係を持ち、グループはユーザーの役割を格納するために使用されます。
コレクションを追加してユーザー編集フォームを作成しようとしています。ドロップダウンから選択して新しい役割を追加できるようにしたいです(DBに既に存在するものに限定されます)
UserType.php:
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username')
->add('email')
->add('forename')
->add('surname')
->add('isActive')
->add('joinDate', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy'))
->add('lastActive', 'date', array('input' => 'datetime', 'format' => 'dd-MM-yyyy'))
->add('groups', 'collection', array(
'type' => new GroupType(),
'allow_add' => true,
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Sfox\CoreBundle\Entity\User'
));
}
}
およびGroupType.php:
class GroupType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('role');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
"data_class" => 'Sfox\CoreBundle\Entity\Group'
));
}
}
これにより、フォームの役割が基本的なテキストボックスに表示されますが、フォームにエントリを追加すると、新しいエントリがグループにカスケード保存され、エントリを編集すると、基になるグループデータが変更されます。
GroupSelectType.phpを作成してみました:
class GroupSelectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('role', 'entity', array('class'=>'SfoxCoreBundle:Group', 'property'=>'name'));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
"data_class" => 'Sfox\CoreBundle\Entity\Group'
));
}
}
フィールドを「エンティティ」タイプとして追加すると、正しい選択ボックスが表示されます(ただし、デフォルト値では)。UserTypeフォームにバインドできないようです。
フォームに実行させたいのは、Userエンティティの基になる'groups'ArrayCollectionを変更することだけです。
誰かが私がこれを達成する方法を知っていますか?