如何以zend形式填充多数组

时间:2012-06-23 08:39:33

标签: zend-framework zend-form zend-form-element zend-form-sub-form

我正在尝试将所有结果从DB填充到zend表单但不能正常工作。

这是我的表格

    $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');
}

我的控制器中的代码看起来像

$form -> populate($configsObjResults);

$configsObjResults包含

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
    )

)

1 个答案:

答案 0 :(得分:1)

将您的子表单代码放在表单代码中名为addConfigSubForm()的方法中,如下所示:

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);
    }
}

然后在您的控制器中,执行以下操作:

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

这将为数组中的每个configs对象添加一个子表单。