2014-04-28 2 views
0

사용자, 역할 및 사용자 역할 테이블이 3 개 있습니다. 사용자는 하나의 역할 만 가질 수 있지만 사용자 테이블에 역할에 대한 열을 추가하지 않으려는 경우 문제는 사용자 양식에서 ObjectSelect를 추가하려고하지만 여러 개의 선택으로 인쇄하는 것입니다. 내가 원하지 않는 removeAttribute ('multiple')를 추가하려고했지만 다음과 같은 오류가 발생합니다.Doctrine ObjectSelect에 여러 특성을 제거하는 방법이 있습니까?

"요소에 여러 특성이 설정되어 있지 않은 경우 FormSelect에서 여러 개의 선택된 값을 지정할 수 없습니다 부울 true "

여러 추가 : 거짓, 작동하지 않습니다, 그래서 그것을 알아 내려고 노력하고있어,이 코드입니다.

사용자 엔티티 :

/** 
* @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(); 

답변

0

하는 사용자는 하나 개의 역할, 많은에 왜 많은이 할 수있는 경우 관계?

선택을 렌더링하면 오류가 발생합니다. 함수 validateMultiValue을 통해 the ObjectSelect value is validated이 나오는 순간이 있습니다.

함수 코드는 다음과 같습니다

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가 multiple 일 것으로 예상됩니다.

관계를 변경하면 코드가 작동합니다. Many to One을 시도해 볼 수 있습니다. 이렇게하면 역할 엔티티에서 XXX 역할을 가진 모든 사용자를 확보 할 수 있습니다. 그리고 사용자 측에서 사용자가 가진 유일한 역할을 얻을 수 있습니다.


편집 :

죄송합니다, 당신이 많은 관계로 많은이 왜 지금은 참조하십시오. 조인 테이블과 일대 다 관계입니다. 조인 테이블에는 일대일 방식이없는 것 같습니다 ... 보통의 방법은 역할 열을 사용자 테이블에 넣어야한다고 생각하지만 그렇게 할 수는 없습니다. 역할 속성은 역할 엔터티가 아니고 역할 엔터티의 배열이되어야합니다.


관련 문제