如何使用session填充zend表单字段?

时间:2011-03-03 17:19:50

标签: zend-framework php zend-session

我正在使用会话来填充我的Zend应用程序中包含选项的多选框。

用户选择一个或多个选项并填写表单上的其他字段,然后提交。如果用户未选择多选中的所有选项,则表单将再次显示,但多选仅包含用户上次未选择的选项。此过程继续进行,直到多选左侧没有其他选项进行处理。

以下是我用来摆脱已经处理的选项的代码,以便它们不会用于填充多选框:

if($form_successful){
// TODO remove $post['keyword_names'] (i.e. already processed) from $keyword_names (that come from $_SESSION)
    $keyword_names = array_diff($keyword_names, $post['keyword_names']);
    print_r($keyword_names);
if(is_array($keyword_names) && !empty($keyword_names)){
// save updated $keyword_names into $_SESSION['workflow1']
$session = new Zend_Session_Namespace('workflow1');
$session->keyword_names = $keyword_names;

// set flag to false so that we display form again
$form_successful = false;
}else{ // all keywords have been assigned
// go to next step
$this->_redirect('/workflow-1/step-'.($step+1).'/');
}
}

print_r($keyword_names);显示正确的选项,但是当用户提交时加载表单时,多选显示从开头那里的选项,即用户刚刚选择和提交的选项未被采用在多重选择之外,只有当用户再次提交表单时,才会更新多选框。

感谢帮助。

2 个答案:

答案 0 :(得分:1)

通过使用网址参数解决了这个问题。以下是代码(可能与我首先发布的内容有很大不同,因为进行了一些重大更改):

   // after successful form submission
    if($form_successful){
        // remove $post['keyword_names'] (i.e. already processed) from $keyword_names (that come from $_SESSION)
        $keyword_names = array_diff($keyword_names, $post['keyword_names']);

        // save remaining $keyword_names into $_SESSION['workflow1']
        $session = new Zend_Session_Namespace('workflow1');
        $session->keyword_names = $keyword_names;

        if(is_array($keyword_names) && !empty($keyword_names)){

            // redirect to the same step again - to ensure that the form will reflect (in select lists) newly created AdGroup and/or Campaign
            // GET parameteres ($params_array) provide a way to remember user's choice
            $params_array = array();
            if(!empty($post['match_type_id'])){
                $params_array['match_type_id'] = $post['match_type_id'];
            }
            if(!empty($post['with_permutations'])){
                $params_array['with_permutations'] = $post['with_permutations'];
            }
            if(!empty($ad_group_id)){
                $params_array['ad_group_id'] = $ad_group_id;
            }                                       
            $this_step_url = UrlUtils::assemble('', $this->getRequest()->getActionName(), $this->getRequest()->getControllerName(), $this->getRequest()->getModuleName(), $params_array);
            $this->_redirect($this_step_url);               

        }else{ // all keywords have been assigned
            // go to next step
            $this->_redirect('/workflow-1/step-'.($step+1).'/');
        }
    }

答案 1 :(得分:0)

所以你这里没有关于Zend_Form对象的任何代码。你如何填充表单元素?如果您发布扩展Zend_Form的类代码(或任何其他代码拨打您的表单),那么我可以提供帮助。但无论如何,您可以使用setMultiOptions()方法填充多选框,或者为multiselectbox中的每个项目添加addMultiOption()。