Search code examples
zend-frameworkzend-formzend-form-elementzend-form-sub-form

How to populate multi array in zend form


I am trying to populate all the result from DB to zend form but cannot work.

This is my form

    $configsForm= new Zend_Dojo_Form_SubForm();

    $configsForm->setAttribs(array(
        'name'          => 'mandatory',
        'legend'        => 'mandatory',
        'dijitParams'   => array(
            'title'     => $this-> view -> __ ( 'Configs' ),
        )
    ));
    $configsForm->addElement(
        'FilteringSelect',
        'group_id',
        array(
            'label' => $this-> view -> __ ( 'Configs_Group Key' ),
            'required'  => true,
            'value'     => '',
            'multiOptions' => $this->_getConfigOptions(),
            'id'        => 'group_id',
        )
    );
    $configsForm->addElement(
        'ValidationTextBox',
        'option_type',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Type If Exist' ),
            'trim'      => true,
            'required'  => false,
            'name'      => 'option_type',
            'id'        => 'option_type',
            'class'     => 'lablvalue jstalgntop',
        )
    );    
    $configsForm->addElement(
        'ValidationTextBox',
        'option_title',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Title' ),
            'trim'      => true,
            'required'  => true,
            'class'     => 'lablvalue jstalgntop',
        )
    );
    $configsForm->addElement(
        'ValidationTextBox',
        'option_value',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Value' ),
            'trim'      => true,
            'required'  => true,
            'class'     => 'lablvalue jstalgntop',
        )
    );
    $configsForm->addElement(
        'select',
        'option_status',
        array(
            'label'         => $this-> view -> __('Configs_Option Status'),
            'required'      => true,
            'value'         => '',
            'multiOptions'  => array('' => $this -> view -> __('Root'), 0 => 'Disabel', 1 => 'Enabel'),
        )
    );
    $configsForm->addElement(
        'FilteringSelect',
        'locale_id',
        array(
            'label' => $this-> view -> __ ( 'Configs_Locale' ),
            'class' => 'lablvalue jstalgntop',
            'autocomplete'=>false,
            'required'  => true,
            'multiOptions' => $this->_getLocaleOptions(),
            'id' => 'locale_id',
        )
    );
    $configsForm->addElement(
        'ValidationTextBox',
        'option_hint',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Hint' ),
            'trim'      => true,
            'required'  => false,
            'class'     => 'lablvalue jstalgntop',
        )
    );
    $configsForm->addElement(
        'ValidationTextBox',
        'option_description',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Description' ),
            'trim'      => true,
            'required'  => false,
            'class'     => 'lablvalue jstalgntop',
        )
    );
    $configsForm->addElement(
        'ValidationTextBox',
        'comments',
        array(
            'label'     => $this-> view -> __ ( 'Configs_Option Comments' ),
            'trim'      => true,
            'class'     => 'lablvalue jstalgntop',
            )
    );
    $configsForm->addElement(
        'hidden',
        'id'
    );


    $configsForm->addElement(
        'SubmitButton',
        'submit',
        array(
            'value'     => 'submit',
            'label'     => $this-> view -> __ ( 'Object_Save' ),
            'type'      => 'Submit',
            'ignore'    => true,
            'onclick'   => 'dijit.byId("add-edit").submit()',
        )
    );
    $configsForm->addElement(
        'reset', 
        'reset',
        array(
            'label' => 'Reset',
            'id'    => 'reset',
            'ignore'=> true,
        )
    );

    $configsForm ->setDecorators ( array ('FormElements', array ('HtmlTag', array ('tag' => 'table', 'class'=>'formlist' ) ), 'ContentPane' ) );
    $configsForm->setElementDecorators(array(
    'DijitElement',
    'Errors',
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'lable jstalgntop')),
        array('Label', array('tag' => 'td', 'class' => 'lable jstalgntop')),
        array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
    ));

    $this->addSubForm($configsForm, 'configs');
}

And the code in my controller looks like

$form -> populate($configsObjResults);

The $configsObjResults containes

Array
(
    [0] => Array
    (
        [id] => 11
        [group_id] => 2
        [group_key] => advanced
        [option_title] => advanced.iptable.status
    )

    [1] => Array
    (
        [id] => 12
        [group_id] => 2
        [group_key] => advanced
        [option_title] => advanced.memchache.iptable
    )

)

Solution

  • Put your subform code in a method called addConfigSubForm() within your form code, like so:

    class myForm extends Zend_Dojo_Form
    {
        ...
    
        // $number - 1st, 2nd, 3rd... subform
        // $data - data to populate
        public function addConfigSubForm($number, $data)
        {
            [ Create your subform here ]
    
            // populate it with $data
            $configsForm->populate($data);
    
            // add it to the form
            $this->addSubForm($configsForm, 'configs' . $i);
        }
    }
    

    Then in your controller, do the following:

    $myform = new myForm();
    foreach ($configsObjResults as $i=>$config) {
        $myform->addConfigSubForm($i, $config);
    }
    

    This will add a subform for each configs object in your array.