2016-11-08 1 views
1

문제 : $ form-> bind ($ object)를 사용할 때 양식의 여러 필드 세트가 채워지거나 수화되지 않았습니다. 서로 다른 두 개의 엔티티 객체를 사용하여 양식에 두 개의 다른 필드 세트를 채우는 방법은 무엇입니까? FieldsetA, FieldsetBzf2/zf3 객체가있는 다중 필드 세트 수화

양식 RegisterFrom가 초기화 이러한 호출

() 메소드

class RegisterForm extends Form 
{ 
    public function init(){ 
     $this->add(array(
       'name' => 'service_provider_fieldset', 
       'type' => ServiceProviderFieldset::class, // this is one model/entity 
     )); 

     $this->add(array(
       'name' => 'location_fieldset', 
       'type' => LocationFieldset::class, // this is a separate model/entity 
     )); 
} 
} 

이 필드 셋을 만들기 : (수화에 유의 주석 시도)

class ServiceProviderFieldset extends Fieldset 
{ 
    public function init(){ 
     //parent::__construct($name); 
     /* 
     $this 
     ->setHydrator(new ClassMethodsHydrator(false)) 
     ->setObject(new ServiceProvider()) 
     ; 
     */ 

     /* 
     $this 
     ->setHydrator(new ReflectionHydrator(false)) 
     ->setObject(new ServiceProvider()) 
     ; 
     */ 

     $this->add(array(
       'type'=>'Hidden', 
       'name'=>'id', 
       'options'=>array(
         'label' => 'Service Provider Id' 
       ), 
       'attributes'=>array(
         'id'=>'providerId' 
       ) 
     )); 
} 
} 

나는이 개 필드 셋이 제어기 :

$provider = $this->findServiceProviderById($providerId); // this is set from DB call and correctly creates a Provider() object with populated values. 
    $location = $this->findServiceProviderLocationById($locId); 
    $form = $formManager->get(RegisterForm::class); 
    $form->bind($provider); 
    $form->bin($location); 
// $form->get('service_provider_fieldset')->bindValues(...); 

보기 :

$formElement = $form->get('service_provider_fieldset')->get('email'); 
etc... 

양식이 채워진 데이터없이보기에서 올바르게 렌더링됩니다.

참고 : Doctrine을 사용하지 않고 DB에서 데이터를 검색하면됩니다. 참고 :이 플래그를 'use_as_base_fieldset'=> true로 설정하면 개체 (ServiceProvider) 중 1 개가 채워집니다. 위치 필드를 'true'로 설정하면 해당 개체가 채워집니다. 저는 몇 시간 동안 시행 착오를 거쳤습니다. 성공하기 위해서는 간단한 설정/구성 단계를 놓친 것이 내 피로가되기를 바라고 있습니다.

요약 : 양식 내에 2 개 이상의 엔터티가있는 2 개 이상의 필드 집합을 채우려면 어떻게합니까? 바인딩(), fieldset-> bindValues ​​()? 시도

는 :

$form->get('service_provider_fieldset')->allowObjectBinding(true); 
     $form->get('service_provider_fieldset')->allowedObjectBindingClass(\Provider\Form\ServiceProviderFieldset::class); 

이들은 가까운 몇 가지 링크하지만 여전히 별도의 기관을 통해 두 필드 세트를 채울 수 없습니다. ZF2 Form Hydration with multiple objects and fieldsets https://framework.zend.com/manual/2.4/en/modules/zend.form.collections.html hydrating multiple objects from fieldsets ZF2

소장품 (제품/브랜드/카테고리) = 예> 진실 바인딩하기 위해 사용되는 'use_as_base_fieldset'를 이용하여 "단일"컬렉션을 의미한다() ...?

+0

업데이트 : 위 링크에서 컬렉션 문서 예제를 사용하여 프로세스를 작동시킬 수있었습니다. 1 : 1, 1 : 많은 관계가있는 모델을 모방 한 단일 필드 세트를 사용하십시오. 질문은 여전히 ​​유효합니다 - 서로 관련이없는 객체로 두 개 이상의 필드 세트를 채우는 방법 –

+0

예제에는 captcha가있는 등록 양식이 포함되어 있습니다. addRecaptcha를 직접 작동하는 양식에 추가하는 기능을 만들 수 있습니다 (그러나 각 양식에 대해이 작업을 반복하거나 [추상 양식을 확장해야합니다]) –

+0

문제를 해결 했습니까? 나는 같은 ... 하나의 제안을 가지고있다. 공장에서 필드 세트를 가져올 때 양식의'init()'이 사용됩니다. 일반 입력 만 있으면 필드 집합 또는 양식의'__construct()'메소드에 포함시킬 수 있습니다. –

답변

0

웹 페이지에서 필드 세트와 관련된 양식의 요소 이름을 확인하십시오. 그들은 다음과 같이되어야합니다 : yourFieldsetName[yourElementName]. yourElementName이 표시되면보기 스크립트에서 양식을 prepare() (으)로 깜박했기 때문일 수 있습니다.

이것은 정확히 나에게 일어난 일이며, 내가 prepare() 양식을 편집 한 후에 모든 개체가 아무런 문제없이 수분이 유지되었습니다.

UPDATE = 의견의 질문에 대한 답변 : 해결되지 않았습니다. 이 나쁜 디자인입니까? 참고 :보기에서 prepare()를 사용하고 있습니다.

모든 것이 잘 작동하면 2 개의 물체가 수분을 공급 받아야합니다. use_as_base_fieldset 플래그는 기본적으로 '저 인데요 (필드 집합)입니다. 데이터로 오브젝트를 수화하고 오브젝트에서 데이터를 추출해야합니다'라고 말합니다. 따라서 하나의 물체가 수화되고 다른 물체는 그렇지 않은 물체로 얻는 것과 그 반대의 경우는 예측 가능합니다. 완전한 코드를 보지 않고 무엇이 잘못 될지 말하기는 매우 어렵습니다.나는 너무 많이 게시하는 것은 답변자가 파악하는 데 시간이 걸릴 것이고, 나의 경험은 그러한 질문에 대개 답이 없다는 것입니다. 내가 보통 당신과 같은 상황에서하는 일은 내가 수화/추출에 사용 된 Zend FormFieldset의 방법을 단계적으로 진행한다는 것입니다. 나는 \Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();을 사용합니다. 그것은 내가 생각하는 최선의 방법은 아니지만 작동합니다.

내가 너라면, 다음과 같이해도됩니다. 당신이 폼의 init() 방법을 사용하는 이유 게시물에서

  1. , 그것은 분명하지 않다. init() 메서드는 예를 들어 폼의 일부 요소가 (예 : <select>) DB에서 채워지 길 원할 때 사용됩니다. Form__construct() 메서드에서 사용할 수 없지만 양식의 인스턴스가 만들어지기 전에는 사용할 수없는 것들이있을 때 init() 메서드를 실행합니다 (100 % 확신 할 수 없으면이 값을 다시 확인하십시오).

  2. 좋고 나쁜 디자인에 대해 걱정할 필요가 없습니다. 설계는 매우 좋은 일이지만 작은 또는 중간 시스템을 사용하는 경우 설계 고려 사항은 시스템의 성능/복잡성에 영향을 미치지 않습니다. 그러나 오히려 당신은 정말로 그저 모든 일을하는 것보다 오히려 많은 시간을 할애하고, 제대로 작동한다면 잊어 버릴 것입니다.

  3. \Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die(); (상당히 지루할 수 있습니다. 알고 싶습니다.) 한 필드 세트를 만들고 원하는 2 개의 필드 세트를 첨부하십시오. 그런 다음이 필드 세트를 양식에 포함하고이 필드 세트에 use_as_base_fieldset = true을 사용하십시오 (물론 현재 필드 세트에 연결된 2 개의 중첩 된 오브젝트로이 필드 세트에 해당하는 오브젝트를 작성하고 필드 세트에 오브젝트를 첨부해야합니다).

희망 사항. 최소한 도움이 되었기를 바랍니다.