0

セッションを使用して、Zend アプリケーションの複数選択ボックスにオプションを設定しています。

ユーザーは 1 つ以上のオプションを選択し、フォームの他のフィールドに入力して送信します。ユーザーが複数選択ですべてのオプションを選択しなかった場合、フォームは再び表示されますが、複数選択には、ユーザーが最後に選択しなかったオプションしかありません。このプロセスは、複数選択から処理するオプションがなくなるまで続きます。

複数選択ボックスの入力に使用されないように、既に処理されたオプションを削除するために使用するコードを次に示します。

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);正しいオプションが表示されますが、ユーザーが送信したときにフォームが読み込まれると、最初から存在していたオプションが複数選択に表示されます。つまり、ユーザーが選択して送信したばかりのオプションは、複数選択から取り出されません。ユーザーがフォームを再度送信したときにのみ、複数選択ボックスが更新されます。

助けに感謝します。

4

2 に答える 2

1

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).'/');
        }
    }
于 2011-03-08T16:45:11.167 に答える
0

したがって、ここには Zend_Form オブジェクトに関するコードはありません。フォーム要素にどのように入力しますか? Zend_Form を拡張するクラス コード (またはフォームにダイヤルするその他のコード) を投稿していただければ、私がお手伝いできるかもしれません。ただし、いずれの場合でも、multiselectbox の各項目に対して setMultiOptions() メソッドまたは addMultiOption() を使用して multiselectbox にデータを入力できます。

于 2011-03-03T21:10:50.367 に答える