2016-11-08 90 views
1

問題:使用$ form-> bind($ object)時,表單中的多個字段集不會被填充/水合。你如何填充2個不同的字段集以形成2個不同的實體對象? 我有2個字段集:FieldsetA,FieldsetBzf2/zf3使用對象保存多個字段集

表單RegisterFrom在其init調用這些()方法

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,但我從數據庫檢索數據確定。 注意:如果我將此標誌設置爲'use_as_base_fieldset'=> true,則將填充1個對象(ServiceProvider),反之亦然,如果我將位置字段設置爲'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

示例包含一個帶有驗證碼的註冊表單。我可以創建一個函數,直接添加到表單中,然後我必須爲每個表單重複此操作[或者擴展一個抽象表單]。 –

+0

你解決了你的問題嗎?我也有同樣的建議。當你從工廠檢索一個字段集時,使用表單的'init()'。如果你只有簡單的輸入,你可以將它們包含到fieldset的'__construct()'方法或表單中。 –

回答

0

在您的網頁上,檢查與您的字段集相關的表單元素名稱。他們應該是這樣的:yourFieldsetName[yourElementName]。如果您只看到yourElementName,那很可能意味着在視圖腳本中忘記了prepare()您的表單。

這正是我發生的事情,在我編寫了這個表格之後,所有的對象都沒有問題了。

UPDATE =對評論問題的回答:未如此解決。這是不好的設計?注意:我在視圖中使用了prepare()。

如果一切正常,你的2個物體應該保溼。 use_as_base_fieldset標誌主要用於說,'嘿,那就是我(字段集)你只應該用數據保存對象/從對象中提取數據'。所以你得到的是一個物體被水合而另一個沒有水合物,反之亦然。如果不查看完整的代碼,很難說出了什麼問題。我擔心發帖太多也需要時間讓回答者掌握,而我的經驗是,這些問題通常沒有答案。我通常在像你這樣的情況下做的是,我一步一步地在Zend FormFieldset的水合/提取方法中使用。我使用\Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();。這不是我所設想的最好的方法,但它有效。

如果我是你,我也會做以下事情。

  1. 從你的文章中,不清楚爲什麼你使用表格的init()方法。當需要時使用init()方法,例如,表單中的某些元素從DB填充(如<select>)。 Form運行init()方法時,有些東西還沒有在__construct()方法中可用,但只在表單實例創建後(不是100%確定這一點,請仔細檢查此方法)。

  2. 不要擔心好的/壞的設計。設計是一件非常好的事情,但是如果您有一箇中小型系統,設計上的考慮不會影響系統的性能/複雜性。但是相反,你會花很多時間做正確的事情,而不是僅僅這樣做,如果它可以正常工作,就會忘記它。

  3. 如果你不想與\Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();(這可能是非常乏味,我知道),創建一個fieldset並附加到你想要的2 fieldsets。然後在該表單中包含此字段集,並在此字段集上使用use_as_base_fieldset = true(當然,您還需要創建與此字段集相對應的對象,其中包含附加到當前字段集的兩個嵌套對象,並將該對象附加到字段集)。

希望這有助於至少一點。

相關問題