2013-08-06 5 views
0

Zend Framework 2에서 필드 세트에 문제가 있습니다. 사용자가 양식을 통해 개인 데이터를 저장할 수 있습니다. 그가 이미 이것을 저장했다면 데이터베이스의 데이터로 미리 채워야합니다. 이는 형식 일 뿐이므로 문제가 없지만 필드 세트에 주소 데이터가 필요하므로 프로그램의 다른 부분에서 주소 데이터를 사용할 수 있습니다. 이제 입력 필드는 비어 있습니다.ZF2 : 필드 채우기 필드 집합 데이터

처음에는 개인 데이터를 세션에 채 웁니다. 내 데이터는 다음과 같습니다 : 당신이 볼 수 있듯이, 데이터가 이미 FIELDSET에 사용되는 지정의 주요 같은 개체, PersonalData 및 주소와 결합되어

object(Application\Model\Product\PersonalData)#247 (3) { 
    ["tel":protected]=> string(0) "" 
    ["birthday":protected]=> string(10) "2013-01-01" 
    ["address":protected]=> object(Application\Model\Account\Addresses)#248 (15) {  
     ["firstname":protected]=> string(5) "Ernie" 
     ["surname":protected]=> string(6) "Muppet"  
     ... 
    } 
} 

. 이것은 그 때 작동하는 것을 보인다. 는 그럼 난 내 양식에 넣어 모든 개체가 완벽하게 채워 지므로

$oForm->setData($oForm->getHydrator()->extract($_SESSION->getPersonalData())); 
return new ViewModel(array('form'=>$oForm)); 

addressFieldset이 작업을 수행하는 하이드 레이터와 바인딩을 가지고 있습니다.

$addressFieldset = new AddressFieldset($lang); 
$addressFieldset->setUseAsBaseFieldset(true); 
$addressFieldset->setName('address'); 
$this->add($addressFieldset); 
: 유일한 문제는 내가 페이지를 열 때, 입력 필드가 비어 만 생일 전화가 폼에 직접있는, 가득

내 양식이 같은 주소 필드 셋을 구현하는 것이있다

필드 세트의 올바른 주소 지정에 문제가있는 것 같지만 데이터를 게시 한 후 올바르게 채워지는 이유를 설명 할 수 없습니다. 원하는 것은 Fieldset의 setData를 채우는 것입니다.

내 질문을 이해하고 나를 도울 수 있기를 바랍니다.
고마워,
Svenja

편집 : 나는 조금 더 지금, 그것은 매우 이상하다 내가 무엇이 잘못 됐는지 모른다 분석했다. 디버깅 할 때 $ fieldset-> getValue()가 필요한 모든 데이터를 반환한다는 것을 알 수 있습니다. 그래서 바인딩이 잘못 될 수 있다는 생각 나는이는 단계적으로 디버깅 할 않았다

$values = $this->form->get('address')->getValue(); 
$addressFieldset = $this->form->get('address'); 
$aValues = $addressFieldset->getHydrator()->extract($values); 
$addressFieldset->bindValues($aValues); 

내가 Fieldset.php 및 bindValues에 갔다 (이해야한다 (어쨌든 단지 재현부 무엇인지 완벽합니까?)), hydrator를 호출하고 내 물건을 채우십시오. 그러나 요소에 표시하면 모든 값이 NULL입니다. 이미 내 요소를 두 번 확인했습니다. 모델과 요소 사이의 유일한 차이점은 다른 순서의 선언입니다. fieldset 및 양식에서도 setUseAsBaseField (true) 메서드를 호출합니다. 왜 데이터가 가치가 있지만 요소가 아닌지 이해할 수 없습니다.

답변

0

드디어 해결책을 찾았습니다! 처음에는이 링크가 도움이되었습니다 : Populating fieldsets 양식 입력 필터에 fieldset 입력 필터를 통합하지 않았습니다.
하지만 그건 내가해야 할 전부는 아니 었습니다. 내 양식 데이터 모델은 다음과 같습니다.

이것은 인터페이스 일뿐 주소는 개체입니다. 그리고 그것이 문제입니다. 양식이 필드 세트를 채우려 고 시도하면 배열 만 수락합니다. 그래서 getter-method의 객체를 배열로 추출해야합니다. 이 방법으로 개체를 얻고 싶기 때문에 이것이 매우 유용하다고 생각하지 않습니다. 그래서 방법을 쓰기 다음과 같습니다 "getAddressAsArray()"내 하이드의 추출물 방법은 다음과 같이 변경

public function getAddressAsArray() 
{ 
    $oAddressHydrator = new AddressHydrator(); 
    if(isset($this->address)) 
    { 
     return $oAddressHydrator->extract($this->address); 
    } 
    return array(); 
} 

:

public function extract($object) 
{ 
    if(!$object instanceof IPersonalData) 
    { 
     throw new \InvalidArgumentException('$object must be an instance of Application\Model\Product\IPersonalData'); 
    } 
    return array(
     'telephone' => $object->getTel(), 
     'address' => $object->getAddressAsArray(), 
     'birthday' => $object->getBirthday(), 
    ); 
} 
0

나는 뭔가 이상한 일을하기 때문에 매우 이상합니다. 원하는 결과를 반환하기 위해 $ _SESSION-> getPersonalData()라는 표현식을 사용하고 있다고 확신합니까? 아주 이상한 세션을 사용 중입니다. http://framework.zend.com/manual/2.1/en/modules/zend.session.container.html

(나는 내 ​​영어 죄송합니다) 편집하려면 다음

  1. 당신은 예를 ArraySerializable를 들어, 하이드 레이터의 다른 유형을 사용할 수 있습니다 (기본적으로 개체는 getArrayCopy() 및 exchangeArray (이 있어야합니다) 메소드), ArraySerializable은 기본적으로 하이드레이트 화 도구입니다.
  2. 먼저 양식을 $ form-> bind (new Entity()) 엔터티와 바인딩해야합니다. 엔티티는 기본 필드 집합에 바인딩합니다. 기본 필드 집합을 지정하지 않으면 양식이 필드 집합을 상속하기 때문에 엔터티가 양식과 바인딩됩니다.엔티티가 집합체 인 경우 (즉, 해당 속성에 다른 객체가 포함되어있는 경우) 이러한 각 객체는 해당 fildset이어야합니다. 생성자에서 사용해야하는 자식 필드 집합 $ this-> setObject (new MyChildrenEntity()); 결과적으로 엔터티 속성은 요소 형식으로 추출됩니다.
  3. 그 이후에는 양식으로 만 작업해야하지만 요소 나 필드 세트로 작업하면 안됩니다.
  4. 양식의 모든 데이터를 전달할 수 있으므로 양식 요소는 값을 갖습니다. $ form-> setData ($ this-> getRequest() -> getPost()); 이 메서드는 내부의 populateValues ​​() 메서드를 사용합니다. 양식에 적절한 이름의 요소가 있으면이 값에 할당됩니다. 양식에 필드 세트가 있으면이 값으로 전송됩니다.
  5. 양식의 유효성을 검사하지 않는 한이 값이 인 엔티티는 할당되지 않습니다. 이 값은 확인에 성공한 경우에만 엔티티에만 지정됩니다. 유효성 검사에 성공하면 IsValid() 메서드는 내부 메서드 인 bindValues ​​()를 사용합니다.
  6. 유효성 검사가 성공적으로 완료되면 getData() 메서드를 사용하여 엔티티를 가져올 수 있습니다. $ entity = $ form-> getData();

피씨 : 복잡한 "hakk"을하는 경우이 간단한 설명에 불쾌감을주지 마십시오.

+0

예, 확신, (내 편집 참조) . 데이터는 바인딩되지만 요소에는 바인드되지 않습니다. 글쎄, 젠드 세션 (내부 이유)을 사용하지 않고 너무 많은 변수 이름과 혼동을 피하기 위해 "컨테이너"에 의한 세션을 줄입니다. 그러나 $ _SESSION도 훌륭하게 작동합니다;) – lokilein

+0

이 6 점을 모두 확인했지만 여전히 작동하지 않습니다. 내가 "HydratorInterface"와 함께 내 자신의 수화기를 사용하고 이제 기본 ArraySerializable로 변경했지만 아무 것도 변경되지 않았습니다. 포인트 2 주셔서 감사합니다, 그것은이 기본 방법을 이해하는 데 많은 도움이되었지만 불행히도 제 문제를 해결하지 못했습니다. 나는 대학원생에게 이야기하고 이것은 문제 일 수 있습니다 : 이름에는 필드 세트 이름이 들어 있습니다. 아마 회사 이름을 찾고 있기 때문에 그는 이것을 채울 수 없을지도 모릅니다. – lokilein

+0

http://zf2.readthedocs.org/en/latest/modules/zend.form.collections.html –