ashish
ashish

Reputation: 326

Can I make array input fields like name[] in Zend Form 1.11

How can I make input name like this in Zend Framework 1.11 with Zend Form

<input name="name[]" class="name">
<input name="name[]" class="name">
<input name="name[]" class="name">

I do not want index/key in the array. I want it dynamic.

Upvotes: 1

Views: 79

Answers (1)

doydoy44
doydoy44

Reputation: 5772

You can try do make your own View_Helper.

I can propose this:

In a My library, create Helper directory.
In this directory, create a FormArray.php file like this: (it's an adaptation of Zend_View_Helper_FormText class)

class Zend_View_Helper_FormArray extends Zend_View_Helper_FormElement
{
    public function formArray($name, $value = null, $attribs = null)
    {
        $info = $this->_getInfo($name, $value, $attribs);
        extract($info); // name, value, attribs, options, listsep, disable

        // build the element
        $disabled = '';
        if ($disable) {
            // disabled
            $disabled = ' disabled="disabled"';
        }
        $sep = '';
        $end = 1;
        if (isset($attribs['nb_repeat']) && is_int($attribs['nb_repeat']) && $attribs['nb_repeat'] >1)
            $end = $attribs['nb_repeat'];

        if (isset($attribs['sep_repeat']))
            $sep = $attribs['sep_repeat'];

        $xhtml = '';
        unset($attribs['nb_repeat']);
        unset($attribs['sep_repeat']);
        for ($i = 1; $i <= $end; $i++){
            if ($i != 1)
                $xhtml .= $sep;
            $xhtml .= '<input name="' . $this->view->escape($name) . '[]"'
                    . ' value="' . $this->view->escape($value) . '"'
                    . $disabled
                    . $this->_htmlAttribs($attribs)
                    . $this->getClosingBracket();
        }
        return $xhtml;
    }
}

As you can see, I add 2 attributes nb_repeat and sep_repeat to define the number of input that you want and the separator betwwen each.
I also remove the id attribute.

In your Controller, add the path of this view Helper like this:

$this->view->addHelperPath('My/Helper/', 'My_Helper'); 

And now, in your form, you can create your element like this:

$test = new Zend_Form_Element_Text('name');
$test->setAttrib('class', 'name')
      ->setAttrib('nb_repeat', 3)    // to have 3 input
      ->setAttrib('sep_repeat', "\n") // to have a new line betwwen each input in your code source
      ->addDecorators(array(
                          array('ViewHelper',
                                    array('helper' => 'formArray')
                               ),                                                                                       
                          )                           
                     );

I hope it will help you. :)

Upvotes: 1

Related Questions