2016-10-20 2 views
0

Я пытаюсь создать форму, содержащую набор полей, используя только спецификации массива и Zend\Form\Factory.Как создать коллекцию fieldset с помощью фабрики форм в 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:

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 

Что мне не хватает?

Ожидаемый результат - это набор, названный 'connection' в этом примере, содержащий два массива, представляющих два набора полей, как указано в данных POST. Я чувствую, что это связано с отсутствием InputFilter (или, по крайней мере, его спецификаций), потому что мне удалось получить ожидаемый результат, когда я реализую класс fieldset, который расширяет Zend\Form\Fieldset и реализует Zend\InputFilter\InputFilterProviderInterface.

ответ

0

Только что открыл этот класс Zend\Form\InputFilterProviderFieldset, который делает именно то, что я пропустил.

Я добавил типа в Fieldset спецификации и изменил входной фильтр спецификацию (который является обязательным) следующим образом:

$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, 
      ), 
     ), 
    ), 
)); 

И теперь он работает отлично. Надеюсь, это помогло кому-то.