Как заполнить поле формы Zend с помощью сессии? - PullRequest
0 голосов
/ 03 марта 2011

Я использую сеансы для заполнения поля множественного выбора с опциями в моем приложении 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 ]

1 голос
/ 08 марта 2011

Решил проблему, используя параметры URL. Вот код (может сильно отличаться от того, что я опубликовал первым, потому что были сделаны некоторые большие изменения):

   // 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 голосов
/ 04 марта 2011

Так что у вас нет кода об объекте Zend_Form здесь. Как вы заполняете элемент формы? Если вы публикуете свой код класса, который расширяет Zend_Form (или любой другой код, набираемый вашей формой), тогда я могу помочь. Но в любом случае вы можете заполнить свой multiselectbox методом setMultiOptions () или addMultiOption () для каждого элемента в multiselectbox.

...