2013-10-09 2 views
2

을 사용하여 ObjectSelect 요소를 포함하는 Doctine 2 엔티티를 저장했습니다. Doctrine Hydrator tutorial과 함께 따라했지만 필드 세트에 ObjectSelect가 포함되어 있으면 저장하는 데 문제가 있습니다. 내 엔티티에서 ORM 매핑을 사용하고 있습니다. 기본적으로 idnameRole 엔티티가 있습니다. id, namerole (ManyToOne) 인 User 엔티티도 있습니다. 나는 또한 나의 getters 및 setters 있습니다. 내 setRole() 메서드는 Role 엔티티를 매개 변수로 전달합니다.Zend Form

/** @param Role $role */ 
public function setRole(\Application\Entity\Role $role) { 
    $this->role = $role; 
} 

Doctrine Hydrator로 UserField 세트를 설정했습니다.

$this->setHydrator(new DoctrineHydrator($objectManager, 'Application\Entity\User')) 
    ->setObject(new User()); 

목적은 역할

$this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectSelect', 
    'name' => 'role', 
    'options' => array(
     'label' => 'Role', 
     'object_manager' => $objectManager, 
     'target_class' => 'Application\Entity\Role', 
     'property' => 'name' 
    ) 
)); 

난 다음 설치 DoctrineHydrator을 설정하고 UserFieldset을 추가하는 사용자 정의 폼에 대한 선택합니다.

내 컨트롤러 액션 일어나고있는 것 같다 무엇

public function addUserAction() { 
    $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
    $form = new UserForm($objectManager); 
    $user = new User(); 
    $form->bind($user); 
    if ($this->request->isPost()) { 
     $form->setData($this->request->getPost()); 
     if ($form->isValid()) { 
      $objectManager->persist($user); 
      $objectManager->flush(); 
     } 
    } 
    return array('form' => $form); 
} 

는 역할의 ID가 setRole보다는 객체에 전달되는 것입니다. 해결 방법으로 나는 내 행동을 수정 한 :

if ($form->isValid()) { 
    $objectManager->persist($user); 
    $data = $this->request->getPost(); 
    $role = $objectManager->find('Application\Entity\Role', $data->user['role']); 
    $user->setRole($role); 
    $objectManager->flush(); 
} 

이 추가 단계가 필요하지 않아야 것처럼 보인다, 그러나 나는 또한 바인딩해야하는 경우 내가 내 setRole을 수정해야하는지 확실하지 않다거나 양식에 대한 역할 엔터티. 이것은 분명히 단순화 된 예제이지만, 실제 형식에는 이와 같은 컨트롤러에서 코딩해야하는 지루한 연관이 많이 있습니다.

업데이트 : 게시글 및 양식에 대한 디버그 정보입니다.

var_dump($form->getData()); 
var_dump($this->request->getPost()); 

출력

object(Application\Entity\User)[395] 
    protected 'id' => int 6 
    protected 'name' => string 'Jane Doe' (length=8) 
    protected 'role' => null 

object(Zend\Stdlib\Parameters)[146] 
    public 'user' => 
     array (size=3) 
     'id' => string '' (length=0) 
     'name' => string 'Jane Doe' (length=8) 
     'role' => string '3' (length=1) 
    public 'submit' => string 'Add User' (length=8) 
+0

는 확인할 수 없습니다 내 행동에서 사용자를 저장하려면? 또는 ID 일뿐입니다. ID 만이'setRole()'메쏘드에서 실제로 오류를 반환해야합니다 (객체와 ID가 필요하지 않으므로) – Sam

+0

디버그 정보를 추가했습니다. 게시물 데이터에는 역할에 대한 ID가 포함되어 있지만 역할이 Role 객체가 아니기 때문에 양식에 설정된 경우 역할이 설정되지 않은 것입니다. – livearoha

답변

3

에서 마침내 나는 작업을 얻었다. 문제는 내가 내 양식에 FIELDSET

public function getInputFilterSpecification() { 
    return array(
     'name' => array('required' => true), 
     'role' => array('required' => true) 
    ) 
} 

... 그리고 내 검증 그룹 내 입력 필터에 역할을 추가하는 데 필요한 것이 었습니다. 이제

$this->setValidationGroup(array(
    'User' => array(
     'name', 
     'role' 
    ) 
)); 

은 단순히`$ 형상 -> GetData의()`올바른 개체를 반환하는 경우

if ($form->isValid()) { 
    $objectManager->persist($user); 
    $objectManager->flush(); 
}