Zend Framework: Working with Form elements in array notation

前端 未结 4 1323
不知归路
不知归路 2020-12-10 11:59

I would like to be able to add a hidden form field using array notation to my form. I can do this with HTML like this:



        
相关标签:
4条回答
  • 2020-12-10 12:05

    You have to use subforms to get the result you seek. The documentation was quite a ride but you can find it here

    Using what I found there I constructed the following formL

     <?php
    
    class Form_Test extends Zend_Form {
    
        public function init() {
            $this->setMethod('post');
            $this->setIsArray(true);
    
            $this->setSubFormDecorators(array(
                'FormElements',
                'Fieldset'
            ));
    
            $subForm = new Zend_Form(array('disableLoadDefaultDecorators' => true));
    
            $subForm->setDecorators(array(
                'FormElements',
            ));
    
            $subForm->addElement('hidden', 'contacts', array(
                'isArray' => true,
                'value' => '237',
                'decorators' => Array(
                    'ViewHelper',
                ),
            ));
    
            $subForm2 = new Zend_Form(array('disableLoadDefaultDecorators' => true));
    
            $subForm2->setDecorators(array(
                'FormElements',
            ));
    
            $subForm2->addElement('hidden', 'contacts', array(
                'isArray' => true,
                'value' => '456', 'decorators' => Array(
                    'ViewHelper',
                ),
            ));
    
            $this->addSubForm($subForm, 'subform');
            $this->addSubForm($subForm2, 'subform2');
    
    
            $submit = new Zend_Form_Element_Submit('submit');
            $submit->setValue('Submit');
    
            $this->addElement('submit', 'submit');
        }
    
    }
    

    Wich outputs this html:

    <form enctype="application/x-www-form-urlencoded" method="post" action=""><dl class="zend_form">
    <input type="hidden" name="contacts[]" value="237" id="contacts">
    
    <input type="hidden" name="contacts[]" value="456" id="contacts">
    
    <dt id="submit-label">&nbsp;</dt><dd id="submit-element">
    
    <input type="submit" name="submit" id="submit" value="submit"></dd></dl></form>
    

    And when submited the post looks like:

    array(2) {
      ["contacts"] => array(2) {
        [0] => string(3) "237"
        [1] => string(3) "456"
      }
      ["submit"] => string(6) "submit"
    }
    

    So thats how you can create the kind of forms you seek. Hope this helps! if you have a question post a comment!

    Its quite hackish if you ask me. You basically create subforms but disable there form decorators so just the element gets output. Since the identical contacts[] elements are in different form object zend does'nt overwrite them and it works. But yeah..

    Edit: changed it a bit to remove labels and garbage arount the hidden inputs.

    0 讨论(0)
  • 2020-12-10 12:07

    To use array notation, you need to specify that the element "belongs to" a parent array:

    $form->addElement('hidden', 'contact123', array('belongsTo' => 'contacts', 'value' => '123'));
    $form->addElement('hidden', 'contact456', array('belongsTo' => 'contacts', 'value' => '456'));
    
    0 讨论(0)
  • 2020-12-10 12:12

    For the newer versions of ZF you should use https://framework.zend.com/manual/2.1/en/modules/zend.form.elements.html#multicheckbox

    0 讨论(0)
  • 2020-12-10 12:14

    This indeed seems to be a bug in Zend Framework - the value attribute for an element is properly set to array, but it's ignored when the element renders - it just uses$this->view->escape($value) to output element's html. I've solved this by implementing a custom helper for such elements:

    class My_View_Helper_HiddenArray extends Zend_View_Helper_FormHidden 
    {
        public function hiddenArray($name, $value = null, array $attribs = null)
        {
            if (is_array($value)) {
                $elementXHTML = '';
                // do not give element an id due to the possibility of multiple values
                if (isset($attribs) && is_array($attribs) && array_key_exists('id', $attribs)) {
                    unset($attribs['id']);
                }
    
                foreach ($value as $item) {
                    $elementXHTML .= $this->_hidden($name, $item, $attribs);
                }
                return $elementXHTML;
    
            } else {
                return $this->formHidden($name, $value, $attribs);
            }
        }
    }
    

    Which, when used the next way:

    $contacts = $form->createElement('hidden', 'contacts')
    ->setIsArray(true)
    ->setDecorators(array(
        array('ViewHelper', array('helper' => 'HiddenArray')),
    ));
    $form->addElement($contacts);
    

    generates the needed output.

    The reason to extend Zend_View_Helper_FormHidden here is just to be able to call the default behaviour if no array value is set ( return parent::formHidden($name, $value, $attribs) ).

    Hope this helps someone :)

    0 讨论(0)
提交回复
热议问题