与实体的Symfony表单集合

时间:2014-07-09 17:23:29

标签: symfony doctrine entity symfony-forms

我正在使用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

这是推荐的方式吗?

1 个答案:

答案 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。