具有组

时间:2017-12-05 19:19:54

标签: php forms symfony fosuserbundle symfony-forms

我使用Symfony3.3并希望为管理员制作表单。用户应该有一个组,组可以具有后端访问的角色。 我完成的组(名称和角色)的表单和管理员的表单(名称,密码......)也完成了。 管理员将找到并拥有该组。如果我加载管理员,则它包含带有组的arraycollection。

这是我的课程 管理员:

class Admin extends BaseUser
{
    /**
     * @ORM\Id()
     * @ORM\Column(name="idAdmin", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(type="string", length=255, options={"default":NULL})
     */
    protected $style;

    /**
     * @ORM\ManyToMany(targetEntity="AdminBundle\Entity\AdminGroup")
     * @ORM\JoinTable(
     *     name="admin_has_group",
     *     joinColumns={
     *         @ORM\JoinColumn(name="idAdmin", referencedColumnName="idAdmin")
     *     },
     *     inverseJoinColumns={
     *         @ORM\JoinColumn(name="idGroup", referencedColumnName="idGroup")
     *     }
     * )
     */
    protected $groups;

    /**
     * @return string
     */
    public function getStyle()
    {
        return $this->style;
    }

    /**
     * @param string $style
     */
    public function setStyle($style)
    {
        $this->style = $style;

        return $this;
    }

    public function setGroups($groups)
    {

        $this->groups = $groups;

        return $this;
    }

    public function getGroups()
    {
        return $this->groups;
    }
}

class AdminGroup extends BaseGroup
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(name="idGroup", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * Group constructor.
     *
     * @param string $name
     * @param array  $roles
     */
    public function __construct($name = '', $roles = array())
    {
        parent::__construct($name, $roles);
    }
}

表单生成

$admin = $this->getDoctrine()->getRepository(Admin::class)->find(1);
$admingroupList = $this->getDoctrine()->getRepository(AdminGroup::class)->findAll();
$form  = $this->createFormBuilder($admin)
    ->add("username", TextType::class)
    ->add('plainPassword', PasswordType::class, $passwordSettings)
    ->add(
        'groups', ChoiceType::class, [
        'required' => false,
        'multiple' => true,
        'choices'  => $admingroupList,
    ])
    ->add('save', SubmitType::class, ['label' => 'Save'])->getForm()->createView();

保存表单

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {

    $user = $form->getData();

    $em->persist($user);
    $em->flush();

    ....
}

第一个问题是我在概述中只显示了选择中的id。 第二个问题是我提交表格(包括选定的组)symfony与以下消息一起崩溃

  

调用数组

上的成员函数contains()

我尝试将组列表转换为普通数组,它们将在保存数据时崩溃

  

类型" FOS \ UserBundle \ Model \ GroupInterface","整数"的预期参数给定

我不知道我可以用管理数据和组选择制作一个简单的symfony表单...我找不到任何带有fosuserbundle的表单的例子......

如果不操纵fosuserbundle entites或symfonycode,请有人知道我能做些什么吗?

如果您需要更多来源,请告诉我部分:)

编辑10.12.17 我尝试将ChoosenArray转换为这种格式

$list = [
'user' => 0,
'admin' => 1
];

但是它会被打破

$form->handleRequest($request);

错误:

  

类型" FOS \ UserBundle \ Model \ GroupInterface","整数"的预期参数给定

1 个答案:

答案 0 :(得分:0)

我不认为从

返回的数据
 $admingroupList = $this->getDoctrine()->getRepository(AdminGroup::class)->findAll();

也可以按你的意愿工作。 choices想要这样的东西

'choices' => [
    'Admin' => 'admin',
    'User' => 'user'
]

数组的键是用户看到的名称,数组的值是<option>中使用的值。

您可能需要操纵$admingroupList数组来模仿上面的演示数组。或者在AdminGroup Repo中编写您自己的查询,以返回预先格式化的数组,以便与Symfony表单一起使用。