Gilberto Albino
Gilberto Albino

Reputation: 2745

How to create elements in Zend Form with array names

I am trying to create a very complex form with ZF2, and I can't find a solution to implement array based names in input elements.

This is a chunck of code from my actual form:

<input type=text name=table[name] value="Table Name"> 
<input type=text name=table[title] value="Table Title">
<input type=text name=table[columns][names][] value="Column Name 1"> 
<input type=text name=table[columns][names][] value="Column Name 2"> 
<input type=text name=table[columns][names][] value="Column Name 3"> 
<input type=text name=table[columns][labels][] value="Column Label 1"> 
<input type=text name=table[columns][labels][] value="Column Label 2"> 
<input type=text name=table[columns][labels][] value="Column Label 3">

I know how to work with Zend/Form, but this is an advanced usaged I can`t master.

Upvotes: 0

Views: 695

Answers (2)

Achim
Achim

Reputation: 322

Your code looks like a dynamic form rendered into table format. One possibility besides Zend Fieldsets is to generate your basic form structure dynamically wihtin OOP-Constructor, like @Sam said.

In your case, you should have a concept of which the form is structured. E.g. you have an array with data from a database, which gives you for example the number and names of your "columns" and so the structure how to build your dynamic form.

Following example uses Zend Form constructor to generate a dynamic form. Number of columns are dynamic and specified by given array $tableColumns

<?php

class DynamicForm extends Form {

    /**
     * This constructor builds a Zend Form dynamically  
     *
     * @param array $tableColumns Dynamic data e.g. 'Column Name 1'
     */
    public function __construct($tableColumns) {

        // Add table name input
        $this->add(array(
            'type' => 'text',
            'name' => 'name'
        ));


        // Add table title input
        $this->add(array(
            'type' => 'text',
            'name' => 'title'
        ));


        // iterate each dynamic data
        foreach($tableColumns as $column) {

            $this->add(array(
                 'type' => 'text',
                 'name' => $column['name']
            ));
        }
    }
}

This is how you generate the Zend form structure. Rendering works similar, but within yout view code.

<?php 

echo "<table>";
echo "<tr>";

echo "<td>". $this->formElement($form->get('name')) . "</td>";
echo "<td>". $this->formElement($form->get('title')) . "</td>";

foreach($tableColumns as $column) {

    echo "<td>". $this->formElement($column) ."</td>";

}

echo "</tr>";
echo "</table>";

?>

In my opinion it is much more comfortable to render a form dynamically into a table format, than it's possible a Fieldset.

But nevertheless Zend Form Collection (e.g. Fieldsets) is a good choice, if you have to add or remove Form-elements dynamically with Javascript and handle your form data also highly dynamically.

More information about Zend From Collections are described at the ZF2 Reference Manual

Upvotes: 1

Sam
Sam

Reputation: 16455

You make use of Zend\Form\Element\Fieldset for this kind of scenario. It helps a great deal with proper OOP-Construction of Forms.

Upvotes: 1

Related Questions