2012-06-08 27 views
3

我目前正在使用ZF2 beta 4,當我嘗試在表單內使用字段集並在提交表單時將數據返回到表單中時,我似乎被卡住了。我不知道如果我沒有爲fieldset設置輸入過濾器,或者我缺少一些東西。例如,我有以下(簡化,以清楚):在使用Fieldsets時在ZF2中填充表單數據

控制器

public function indexAction(){ 
    $form = new MyForm(); 
    $request = $this->getRequest(); 
      if ($request->isPost()) { 
       $form->setData($request->post()); 
       if ($form->isValid()) { 
         //Do something 
         print_r($form->getData()); //for debug 
       } 
      } 
    return array('form' => $form); 
} 

MyForm.php

class MyForm extends Form 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     $this->setName('myForm'); 
     $this->setAttribute('method', 'post'); 

     $this->add(array(
        'name' => 'title', 
        'attributes' => array(
        'type' => 'text', 
        'label' => 'Title', 
        ), 
       )); 

     $this->add(new MyFieldset('myfieldset')); 

     //setting InputFilters here 
     $inputFilter = new InputFilter(); 
     $factory = new InputFactory(); 

     $inputFilter->add($factory->createInput(array(
      'name'  => 'title', 
      'required' => true, 
      'filters' => array(
       array('name' => 'StripTags'), 
       array('name' => 'StringTrim'), 
      ), 
     ))); 

     //Now add fieldset Input filter 
     foreach($this->getFieldsets() as $fieldset){ 
       $fieldsetInputFilter = $factory->createInputFilter($fieldset->getInputFilterSpecification()); 
       $inputFilter->add($fieldsetInputFilter,$fieldset->getName()); 
     } 

     //Set InputFilter 
     $this->setInputFilter($inputFilter); 
    } 
} 

MyFieldset.php

class MyFieldset extends Fieldset implements InputFilterProviderInterface{ 
    public function __construct($name) 
    { 
     parent::__construct($name); 
     $factory = new Factory(); 

     $this->add($factory->createElement(array(
      'name' => $name . 'foo', 
      'attributes' => array(
       'type' => 'text', 
       'label' => 'Foo', 
      ), 
     ))); 
    } 

    public function getInputFilterSpecification(){ 
     return array(
      'foo' => array(
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
      ), 
     ); 
    } 
} 

我能夠按預期輸出窗體,並且最終輸入兩個名爲'title'和'myfieldsetfoo'的輸入元素(使用ViewHelper輸出時給出的名稱)。所以當然,當我提交原始帖子時,會顯示'title'和'myfieldsetfoo'的值。但是,當我使用SetData()字段集的值沒有被填充(雖然我可以看到原始後對象中的值)。相反,檢查'$ form-> getData()'的輸出我收到:

Array(
    [title] => Test, 
    [myfieldset] => Array(
         [foo] => 
         ) 
) 

我錯過了什麼?我需要做什麼以便ZF2瞭解如何填充字段集?

感謝您的幫助,這讓我瘋狂。

回答

8

爲什麼我要做的就是連擊輸入過濾器,所以我可以處理貼出整個HTML表單數組。

<form method="POST"> 
<input type="text" name="main[name]" /> 
<input type="text" name="main[location]" /> 
<input type="text" name="contact[telephone]" /> 

<input type="submit" value="Send" /> 
</form> 

這將創建一個數組張貼像

post["main"]["name"] 
post["main"]["location"] 
post["contact"]["telephone"] 

過濾,並驗證:

use Zend\InputFilter\InputFilter; 
use Zend\InputFilter\Factory as InputFactory; 

$post = $this->request->getPost(); 
$inputFilter = new InputFilter(); 
$factory = new InputFactory(); 

// $post["main"] 
$mainFilter = new InputFilter(); 
$mainFilter->add($factory->createInput(array(
    'name'  => 'name', 
    'required' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min'  => 1, 
       'max'  => 100, 
      ), 
     ), 
    ), 
    ))); 

$mainFilter->add($factory->createInput(array(
    'name'  => 'location', 
    'required' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min'  => 1, 
       'max'  => 100, 
      ), 
     ), 
    ), 
    ))); 
$inputFilter->add($mainFilter, "main"); 

// $post["contact"] 
$contactFilter = new InputFilter(); 
$contactFilter->add($factory->createInput(array(
    'name'  => 'name', 
    'required' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min'  => 1, 
       'max'  => 100, 
      ), 
     ), 
    ), 
    ))); 
$contactFilter->add($mainFilter, "contact"); 

//Set posted data to InputFilter 
$inputFilter->setData($post->toArray()); 

http://www.unexpectedit.com/zf2/inputfilter-validate-and-filter-a-form-data-with-fieldsets

+3

+1這行'$ contactFilter-> add($ mainFilter,「contact」);'。現在我知道如何爲fieldsets應用過濾器。謝謝! – vinigarcia87

-1

我認爲問題在於你在控制器中聲明瞭一個新窗體。這清楚了以前的形式。

$form = new MyForm(); 

我使用服務管理申報表格和過濾器。 然後在控制我做的:

$form = $this->getServiceLocator()->get('my_form'); 

這樣,我總是得到對象我想

更新

我不再使用服務管理器來打電話的形式。我只是調用一個新的表單,併發出$ form-> setData($ data);

的數據源也可以是實體雖然話,我會發出:$形式 - >綁定($實體)

+0

這種聲明表單的方式與這裏所做的相似[http://akrabat.com/zend-framework-2-tutorial/](http://akrabat.com/zend-framework-2-tutorial /)。我在使用字段集時只會看到一個問題。如果我有一個簡單的表單(甚至是不在字段集中的元素),那麼我就沒有問題了。 –

+0

實例化表單的方法與此問題完全無關。 –

0

我想你忘了在控制器準備形式:

return array('form' => $form->prepare()); 

這會將您的字段集的「名稱」字段重命名爲「myfieldset [foo]」,因此您不必自行添加字段集名稱。

在你的字段集類只需使用

'name' => 'foo' 

,而不是

'name' => $name . 'foo' 

相關問題