我正在使用symfony 2.3。我想创建一个表单,用户可以选择他说的所有语言(带有语言的选择框应该用javascript重复,但这不是问题)。如果选择框显示正确的选择,我很高兴。
我有实体“个人资料”和“语言”,其中包含从个人资料:foreign_languages到Languages的单向ManyToMany关系。生成的表profile_has_languages看起来像o.k.我直接在其中输入了一些testdata。
我创建了一个ProfileType,并使用$ builder-> add('foreign_languages')它向我显示了一个选择了正确语言的选择框。到目前为止一直很好......
现在每个选定的语言都应该在自己的选择框中。我知道我需要一个集合:
$builder->add('foreign_languages', 'collection', array('type'=>new LanguageType()));
这是我的语言类型:
class LanguageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name','entity',array(
'class'=>'Test\TestBundle\Entity\Languages',
'property' => "name",
'multiple' => false,
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('s')->orderBy('s.name', 'asc');
},
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Test\TestBundle\Entity\Languages'));
}
public function getName()
{
return 'language';
}
}
这为我提供了3个具有所有可用语言的选择框(用户选择的每种语言都有一个框)。那是o.k.,但语言都是未被选中 - 我现在如何预先选择正确的语言?
我必须在某个地方使用循环吗?或者应该有从语言回到个人资料的关系(这看起来怎么样?)
我真的很感谢你的帮助 - 我坚持了2天...... :(
更新:我知道如何使用此示例中的可编辑文本字段: http://symfony.com/doc/2.3/cookbook/form/form_collections.html。 为了简化我的问题:如果我想在我的收藏中显示一个实体作为选择(可选择但不可编辑),有什么区别?
我在这里找到了一个带有数据转换器的工作解决方案:Symfony 2 Embedded Form Collection Many to Many
这是推荐的方式吗?
答案 0 :(得分:0)
要坚持这些选择,您需要在Profile和Language之间建立多对多的关系。类似的东西:
在Profil中
/**
* @var foreign_languages
* @ORM\ManyToMany(targetEntity="Language", mappedBy="profils")
*/
private $foreign_languages;
语言
/**
* @var profils
* @ORM\ManyToMany(targetEntity="Profil", inversedBy="foreign_languages")
*/
private $profils;
但要预先选择选项,如果用户尚未选择,您必须将语言实体添加到您用于在控制器方法中创建表单的实体,或者在您使用时直接添加它们创建一个新的Profil。