簡體   English   中英

如何在zf2中使用表單工廠創建字段集集合

[英]How to create fieldset collection using form factory in zf2

我試圖創建一個僅包含數組規范和Zend\\Form\\Factory的表單,其中包含字段集的集合。

這是我使用工廠創建表單的方式:

$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:

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)

調用$form->getData()返回的數組顯示一個空集合:

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

我想念什么?

預期的結果是一個集合,在此示例中稱為“連接”,其中包含兩個數組,這些數組表示POST數據指定的兩個字段集。 我感覺這與缺少InputFilter(或至少是它的規格)有關,因為當我實現擴展Zend\\Form\\Fieldset並實現Zend\\InputFilter\\InputFilterProviderInterface的字段集類時,我設法獲得了預期的結果。

剛剛發現了此類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,
            ),
        ),
    ),
));

現在它可以正常工作。 希望這對某人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM