0
votes

I am using sessions to populate a multi select box with options in my Zend application.

The user selects one or more options and fills in other fields on the form and then submits. If the user didn't select all of the options in the multi select then the form is displayed again but the multi select only has the options that the user did not select the last time. This process goes on until there are no more options from the multi select left to process.

Here is the code I use to get rid of the options that have already been processed so that they are not used to populate the multi select box:

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); displays the correct options, however when the form is loaded when the user submits, the multi select displays the options that were there from the begining ie the options the user has just selected and submitted are not being taken out of the multi select, it is only when the user submits the form again then the multi select box updates.

Appreciate the help.

2

2 Answers

1
votes

Solved the issue by making use of URL parameters. Here is the code (might differ a lot from what I posted first because some big changes were made):

   // 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).'/');
        }
    }
0
votes

So you don't have any code about Zend_Form object here. How do you populate the form element? If you post your class code which extends Zend_Form (or any other code dials with your form) then I may help. But in any case you can populate your multiselectbox with setMultiOptions() method or addMultiOption() for each item in multiselectbox.