2013-04-08 51 views
3

創建自定義元素喜歡這裏:ZF2Docs: Advanced use of Forms當我在Zend Framework 2中創建自定義表單元素時,爲什麼不使用短名稱?

1.創建CustomElement類應用程序/表格/元/ CustomElement.php

2.添加到我的Module.php功能

public function getFormElementConfig() 
{ 
    return array(
     'invokables' => array(
      'custom' => 'Application\Form\Element\CustomElement', 
     ), 
    ); 
} 

如果我用FQCN正常工作:

$form->add(array(
    'type' => 'Application\Form\Element\CustomElement', 
    'name' => 'myCustomElement' 
)); 

但是,如果我用簡短的名字:

$form->add(array(
    'type' => 'Custom', 
    'name' => 'myCustomElement' 
)); 

拋出異常:

Zend\ServiceManager\ServiceManager::get was unable to fetch or create 
an instance for Custom 
+0

@AydinHassan究竟如何,這是否涉及如..呢? :D @Ildar,爲了確保元素類被稱爲'CustomElement'而不是'Custom'? – Sam 2013-04-09 06:07:41

+0

@Sam,是的,元素類被稱爲CustomElement – Ildar 2013-04-09 06:29:22

+0

我已經改變了invokeables中的customElement自定義,它的工作原理。 – Ildar 2013-04-09 07:01:52

回答

4

問題

該錯誤可能是由於你如何實例化$form對象。如果您只是使用new Zend\Form\Form表達式或類似的東西,表單將不會使用正確的服務定位器進行設置。

$form = new \Zend\Form\Form; 
$form->add(array(
    'type' => 'custom', 
    'name' => 'foobar', 
)); 

解決方案

這裏的技巧是使用FormElementManager服務定位器實例的形式。

// inside a controller action 
$form = $this->getServiceLocator()->get('FormElementManager')->get('Form'); 
$form->add(array(
    'type' => 'custom', 
    'name' => 'foobar', 
)); 

更重要的是,在你的控制器定義form()方法的快捷方式,爲你做到這一點:

class MyController extends AbstractActionController 
{ 
    public function form($name, $options = array()) 
    { 
     $forms = $this->getServiceLocator()->get('FormElementManager'); 
     return $forms->get($name, $options); 
    } 

    public function createAction() 
    { 
     $form = $this->form('SomeForm'); 
     // ... 
    } 
} 

說明

每個表單對象被附加到表單的工廠是在轉到附加服務定位器。這個服務定位器負責獲取所有用於實例化新的form/element/fieldset對象的類。

如果你實例化一個新的表單對象(全部由自己),一個空白的服務定位器被實例化並用於該表單中獲取更高等級。但是每個後續對象都會附加到同一個服務定位器上。

的這裏的問題是,getFormElementConfig配置此服務定位器的一個非常具體的實例。這是FormElementManager服務定位器。一旦它的配置,各種形式的從這項服務定位器拉將被連接到這個服務定位器,將用於獲取其他元素/字段集等

希望這能解決您的問題。

+0

謝謝!首先問題是可調用部分是「custom」而不是「customElement」。第二個問題是你如何說:沒有設置正確的服務定位器。我使用表單工廠創建窗體。所以,我調用$ factory-> setFormElementManager($ sm-> get('FormElementManager'));在視圖中 – Ildar 2013-04-09 07:14:18

相關問題