2012-12-24 1 views
3

저는 AnnotationForms을 사용하고 있으며 튜토리얼의 표준 편집 작업을 표준 양식이 아닌 주석을 사용하도록 변경했습니다.젠드 프레임 워크 2 - 주석 양식 - 바인딩이 작동하지 않습니다.

$form->bind()을 제외한 모든 값은 값을 채우지 않습니다. 양식 필드는 비어 있습니다.

바인드되어야하는 변수를 확인했는데 설정되어있어 모양이 좋아 보입니다.

가 여기 내 행동입니다 :

$id = (int)$this->getEvent()->getRouteMatch()->getParam('id'); 
    if (!$id) { 
     return $this->redirect()->toRoute('album', array('action'=>'add')); 
    } 
    $album = $this->getEntityManager()->find('Album\Entity\Album', $id); 

    $builder = new AnnotationBuilder(); 
    $form = $builder->createForm(new \Album\Entity\Album()); 
    $form->add(new \MyVendor\Form\MyFieldset()); 
    $form->setBindOnValidate(false); 
    $form->bind($album); 

답변

2

좋아, 이것은 쉬운 일이었다!

트릭은 개체를 배열로 변환하고 bind 대신 setData()을 사용하는 것입니다.

솔루션 힌트를 찾았습니다. here.

변경 사항을 저장하려면 여전히 bind()이 필요합니다. 제외하면 오류가 발생하지 않지만 저장하지는 않습니다.

$album = $this->getEntityManager()->find('Album\Entity\Album', $id); 
... 
$form->bind($album); 
$form->setData($album->getArrayCopy()); 
2

ClassMethods 하이드 실제로 바인드 작업 않지만, 폼 요소 이름은 소문자 밑줄 형식 (예 일치해야합니다. $moduleDisplayName, ClassMethodsObjectProperty 하이드는 폼 요소는 module_display_name 이름을 기대 객체 속성을

기본적으로 Zend\Form\AnnotationmoduleDisplayName라는 폼 요소를 생산 따라서 작동하지 않는 형태의 객체를 추출

해결 방법 1 :.. @Name 추가하기 ClassMethods에 대한 속성에 주석 달기.

예 :

/** 
* @Form\Name("module_display_name") 
protected $moduleDisplayName 

해결 방법 2 : false에 선택적 매개 변수 underScoreSeperatedKeys 세트로 ClassMethods 하이드 레이터를 인스턴스화 (기본값은 true입니다) 또는 ClassMethods::setUnderScoreSeperatedKeys(false)를 사용합니다. 그러면 ClassMethods은 다른 수화기처럼 작동합니다.

ObjectProperty hydrator는 public으로 선언 된 속성에서만 작동합니다. 하지만 명명은 ArraySerializable (즉, 속성 $moduleDisplayName, 양식 요소 이름 moduleDisplayName)과 동일합니다.

Reflection hydrator는 모든 속성에서 작동합니다. 이름 지정은 ArraySerializable과 동일합니다.

결론 : ClassMethods은 다른 폼 요소 명명 체계를 예상하는 4 개의 수화기 중 하나입니다. 너무 차가워 요.