2014-09-05 125 views
1

此問題之前詢問。但是與使用fieldset相關的問題/解決方案或者它們比較老,並且使用來自ZF2早期版本的技術。現在我知道http://framework.zend.com/manual/2.3/en/modules/zend.form.advanced-use-of-forms.html。但是解決方案與使用FormElementManager綁定字段集來形成相關。對於最近的大多數問題重新編寫創建動態表單下拉菜單也是如此。如何填充表單從模型中選擇Zend框架2

但是我有3下拉領域,從數據庫獲取數據的形式。到現在爲止,我可以選擇通過控制器將DB Adapter傳遞給Form的構造函數。但現在我想用更好的方式來填充下拉列表,最好是FormElementManager,但不使用Fieldsets。

如果真的能夠建立這樣的系統?

回答

2

您可以通過一個工廠注入DB適配器扶養。以下配置將在您的Module.php或配置文件中。您可以注入數據庫適配器或objectManager,並從任何服務管理器感知類中的應用程序的其他位置從服務管理器中檢索表單對象。

public function getFormElementConfig() 
    { 
     return array(

      'factories' => array(
       'MyForm' => function (ServiceManager $sm) 
       { 
        $form = new \MyNamespace\MyForm($sm->get('my_db_adapter')); 
        return $form; 
       }, 
        ) 
    } 

這種形式現在通過任何服務識別類的服務定位:

$serviceLocator->get('FormElementManager')->get('MyForm'); 

隨着數據庫適配器通過扶養工廠已經注入。

要訪問控制器的對象,你可能想考慮創建一個控制器插件保持的ServiceManager對象移出控制器類。

//MyController.php 
public function myAction(){ 
//retrieve form via plugin with the DB adapter already set 
$myForm=$this->myForm(); 
} 
+0

這不起作用,因爲所有的表單元素初始化都是在第一個被調用的構造函數中完成的。所以DB適配器沒有在那個時間設置。所以代碼會拋出錯誤。 – 2014-09-05 07:23:59

+0

您可以輕鬆地將您的DB適配器的形式構造以同樣的方式,見上編輯答案: $形式=新\ myNameSpace對象\ MyForm的($ SM-> GET( 'my_db_adapter')); – matwr 2014-09-05 07:47:14

+0

這種方法可行,但這裏需要注意的一點是,我需要通過模型而不是DB適配器作爲代碼質量要求。然後,由於表單需要更多的動態下拉列表,因爲構造函數有更多的參數(如'__construct(ModelA,ModelB,ModelC,ModelD)'),它看起來很醜。通過他們陣列也有相同的醜陋水平。 – 2014-09-05 09:37:42