2016-10-20 6 views
0

配列仕様とZend\Form\Factoryを使用してフィールドセットのコレクションを含むフォームを作成しようとしています。ここでzf2でフォームファクトリを使用してフィールドセットコレクションを作成する方法

は私が工場を使用してフォームを作成する方法である:

$factory = new Zend\Form\Factory(); 
$fieldset = $factory->createFieldset(array(
    'elements' => array(
     array(
      'spec' => array(
       'name' => 'name', 
       'type' => 'Text', 
       'attributes' => array(
        'class' => 'form-control input-sm', 
       ), 
       'options' => array(
        'label' => 'Name', 
       ), 
      ), 
     ), 
     array(
      'spec' => array(
       'name' => 'driverClass', 
       'type' => 'Text', 
       'attributes' => array(
        'class' => 'form-control input-sm', 
       ), 
       'options' => array(
        'label' => 'Driver', 
       ), 
      ), 
     ), 
    ), 
    'input_filter' => array(
     'name' => array(
      'required' => true, 
     ), 
    ), 
)); 
$form = $factory->createForm(array(
    'name' => 'application-form', 
    'attributes' => array(
     'role' => 'form', 
    ), 
    'elements' => array(
     array(
      'spec' => array(
       'type' => 'Collection', 
       'name' => 'connection', 
       'options' => array(
        'label' => 'Connections', 
        'allow_add' => true, 
        'allow_remove' => true, 
        'should_create_template' => true, 
        'count' => 2, 
        'target_element' => $fieldset, 
       ), 
      ), 
     ), 
     array(
      'spec' => array(
       'name' => 'security', 
       'type' => 'Csrf', 
       'attributes' => array(
        'required' => 'required', 
       ), 
      ), 
     ), 
     array(
      'spec' => array(
       'name' => 'submit', 
       'type' => 'Submit', 
       'attributes' => array(
        'class' => 'btn btn-sm btn-primary', 
       ), 
       'options' => array(
        'label' => 'Apply', 
       ), 
      ), 
     ), 
    ), 
)); 

私はデータを設定し、フォーム要素をレンダリングしようとすると、結果のフォームが正常に動作します。しかし、私はそう(コントローラ内)のように、それを検証し、データを取得する場合:

$form->setData($this->getRequest()->getPost()); 

if ($form->isValid() === true) { 
    $data = $form->getData(); 

    var_dump($this->getRequest()->getPost()); 
    var_dump($data); 
} 

データのこのセットでPOSTとして:$form->getData()への呼び出しによって返さ

object(Zend\Stdlib\Parameters)[141] 
    private 'storage' (ArrayObject) => 
    array (size=3) 
     'connection' => 
     array (size=2) 
      0 => 
      array (size=2) 
       'name' => string 'orm_default' (length=11) 
       'driverClass' => string 'Doctrine\DBAL\Driver\PDOMySql\Driver' (length=36) 
      1 => 
      array (size=2) 
       'name' => string 'blog' (length=4) 
       'driverClass' => string 'Doctrine\DBAL\Driver\PDOMySql\Driver' (length=36) 
     'submit' => string '' (length=0) 
     'security' => string '20d5c146d8874dc804948e962d5de91b-87c9e4097f9140d259efb5c589a05d6b' (length=65) 

配列が空を示していますコレクション:

array (size=3) 
    'security' => string '20d5c146d8874dc804948e962d5de91b-87c9e4097f9140d259efb5c589a05d6b' (length=65) 
    'submit' => string '' (length=0) 
    'connection' => 
    array (size=0) 
     empty 

私は何が欠けていますか?

この例では、「接続」という名前のコレクションで、POSTデータで指定された2つのフィールドセットを表す2つの配列が含まれています。 Zend\Form\Fieldsetを拡張し、Zend\InputFilter\InputFilterProviderInterfaceを実装するフィールドセットクラスを実装すると、期待される結果を得ることができたので、InputFilterが欠落している(または少なくともその仕様)と関係があると感じています。

答えて

0

ちょうど私が逃したことを正確に行うこのクラスZend\Form\InputFilterProviderFieldsetを発見しました。

私はフィールドセットの仕様でタイプを追加し、入力フィルタの仕様を変更(必須である)ようなので:

$fieldset = $factory->createFieldset(array(
    'type' => 'Zend\Form\InputFilterProviderFieldset', 
    'elements' => array(
     array(
      'spec' => array(
       'name' => 'name', 
       'type' => 'Text', 
       'attributes' => array(
        'class' => 'form-control input-sm', 
       ), 
       'options' => array(
        'label' => 'Name', 
       ), 
      ), 
     ), 
     array(
      'spec' => array(
       'name' => 'driverClass', 
       'type' => 'Text', 
       'attributes' => array(
        'class' => 'form-control input-sm', 
       ), 
       'options' => array(
        'label' => 'Driver', 
       ), 
      ), 
     ), 
    ), 
    'options' => array(
     'input_filter_spec' => array(
      'name' => array(
       'required' => true, 
      ), 
     ), 
    ), 
)); 

そして、それは今、正常に動作します。これが誰かを助けたと思っています。

関連する問題