0

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.

2 Answers 2

1

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

Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.