【问题标题】:symfony2 form multiple select with arraycollectionsymfony2 使用 arraycollection 形成多选
【发布时间】:2013-05-09 12:49:19
【问题描述】:

我想创建一个表单来编辑我的用户。 与 ManyToMany 相关的用户和角色。 在 UserUsers 实体中,我有一个 $roles 变量,它是 ArrayCollection:

public function __construct()
{
    $this->roles = new ArrayCollection();
}

在我的表单上,我想通过多个选择表单元素为我的用户添加角色。 在我的用户表单中:

public function buildForm( FormBuilderInterface $builder, array $options ) {
    $builder->add( 'username' )
            ->add( 'password', 'repeated', array( 
                    'type' => 'password',
                    'mapped' => false,
                    'required' => false,
                    'first_options' => array( 
                            'label' => 'Password' ),
                    'second_options' => array( 
                            'label' => 'Repeat Password' ) ) )
            ->add( 'roles', 'choice', array( 
                    'mapped' => false,
                    'multiple' => true ) );
}

现在我的多选是空的。

如果我将映射设置为 true,则会收到一条错误消息:

UserRoles 无法在...中转换为 int

我尝试了很多方法,但我无法正确解决这个问题。

【问题讨论】:

  • 你的 $roles ArrayCollection 中有什么类型?
  • $roles ArrayCollection 中的所有元素都是一个实体(UserRoles)。
  • 对于实体的选择,您应该使用特殊的选择字段类型“实体”(symfony.com/doc/current/reference/forms/types/entity.html)。例如,请参阅我对类似问题的回答 - stackoverflow.com/questions/13519961/…
  • 好的,我改变了这样的角色:$builder->add( 'roles', 'entity', array( 'class' => 'AcmeUserBundle:UserRoles', 'multiple' => true, 'property' => 'name' ) ); 然后我收到一条错误消息:预期参数类型为 "Doctrine\Common\Collections\Collection", "array" given
  • 这很奇怪,因为 ArrayCollection 实现了 Doctrine\Common\Collections\Collection。是否有可能将角色()重新分配给其他地方的数组?或者说 ArrayCollection 没有解析到教义类?

标签: forms symfony entity arraycollection multipleselection


【解决方案1】:

对于实体的选择,你应该使用特殊的选择字段类型'entity'(参见entity field type的Symfony手册)。例如,请参阅我对similar question 的回答。 如果您遇到更多错误,您也可以在 Role Interface and Manage Roles 上找到此问题。

【讨论】:

    【解决方案2】:

    对于 fosuserbundle,我这样做:

            $builder->add('roles', 'choice', array(
            'multiple' => true,
            'choices' => array(
                'ROLE_USER' => 'User',
                'ROLE_AUTHOR' => 'Autor',
                'ROLE_MODERATOR' => 'Moderator',
                'ROLE_ADMIN' => 'Admin'
            ),
            'label' => 'Rollen',
            'required' => true
        ));
    

    【讨论】:

    • 这很好,但我将角色存储在数据库中,当我打开用户进行编辑时,我想选择分配给当前用户的那些角色。
    • 我已经理解并且强烈推荐使用 FOSUserBundle - 因为安全。在那里,您可以为一个用户存储多个角色。这就是你想要的结局。
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多