有没有办法删除教条ObjectSelect的多个属性?

时间:2014-04-28 19:04:01

标签: php annotations doctrine zend-framework2

我有3个表,User,Roles和UserRoles。用户只能有一个角色,但我不想在User表中为角色添加一个列,问题是我想在用户表单中添加一个ObjectSelect,但是它将它打印为多个Select ,我不想要,我尝试添加removeAttribute('multiple'),但我得到一个错误说:

“当元素没有将多个属性设置为布尔值true时,FormSelect不允许指定多个选定值”

添加多个:false,也不起作用,所以我想弄明白,这就是代码。

用户实体:

/**
 * @ORM\ManyToMany(targetEntity="Auth\Entity\User\Roles")
 * @ORM\JoinTable(name="userRole",
 *      joinColumns={@ORM\JoinColumn(name="idUser", referencedColumnName="id", unique=true)},
 *      inverseJoinColumns={@ORM\JoinColumn(name="idRole", referencedColumnName="id")}
 *      )
 * @Annotation\Type("Zend\Form\Element\ObjectSelect")
 * @Annotation\Required({"required":"true"})     
 * @Annotation\Options({"label":"Rol","target_class":"Auth\Entity\User\Roles","property":"name"})     
 * @Annotation\Attributes({"class":"form-control"})
 **/
private $roles;

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

public function getRoles()
{
    return $this->roles->getValues();
}

AdminController添加操作:

public function addUserAction () {
    $view = new ViewModel();
    $userEntity = new User();
    $em = $this->entityManager();
    $builder = new DoctrineAnnotationBuilder($em);

    $form = $builder->createForm($userEntity);
    $form->setHydrator(new DoctrineHydrator($em, 'Users\Entity\User'));
    $form->bind($userEntity);
    $request = $this->getRequest();
    if ($request->isPost()) {
        $form->setData($request->getPost());
        if ($form->isValid()) {
            $em->persist($userEntity);
            $em->flush();
        }
    }
    $view->form = $form;
    return $view;
}

我的观点:

$form = $this->form;
$form->setAttribute('action', $this->url('admin', array('action' => 'addUser')));

$form->prepare();
echo $this->form()->openTag($form);
echo $this->formRow($form->get('username'));
echo $this->formRow($form->get('email'));
echo $this->formRow($form->get('roles'));

echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();

1 个答案:

答案 0 :(得分:0)

如果用户只能拥有一个角色,为什么会有多对多关系?

Select正在渲染时出现错误。 the ObjectSelect value is validated通过函数 validateMultiValue 的时刻。

功能代码是:

protected function validateMultiValue($value, array $attributes)
{
    if (null === $value) {
        return array();
    }

    if (!is_array($value)) {
        return (array) $value;
    }

    if (!isset($attributes['multiple']) || !$attributes['multiple']) {
        throw new Exception\DomainException(sprintf(
            '%s does not allow specifying multiple selected values when the element does not have a multiple attribute set to a boolean true',
            __CLASS__
        ));
    }

    return $value;
}

您定义用户实体的方式,您将始终拥有一个数组:

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

所以它始终到达最后一个,如果它检查多个属性。因为您不希望它是多个,所以将此属性设置为false,这是错误引发的时间。如果它验证了一个数组,那么select应该是多个。

如果更改关系,则代码应该有效。你可以尝试多对一。这样,您可以从角色实体获得具有XXX角色的所有用户。从用户方面来说,您可以获得用户所拥有的唯一角色。


修改

抱歉,现在我明白为什么你有多对多的关系。它是与连接表的一对多关系。似乎没有一对一的连接表......通常的方法我认为应该将角色列放在用户表中,但你不能。您需要角色属性为角色实体,而不是角色实体的数组。