1

PHP と CodeIgniter で複数のステップ/ページ フォームを作成しようとしていますが、どなたか助けていただけないでしょうか。

戻るボタンで前のステップに戻ったときに、再度挿入するのではなく更新する複数ステップのフォームを CI に含めるにはどうすればよいですか? これらの戻るボタン POST フォームがメッセージを再送信しないフォームを作成するにはどうすればよいですか?

編集:可能であればJSなし

ありがとう!

4

5 に答える 5

5

これが別の質問からの私の答えです。データを失うことなく前進/後退する能力を提供し、ページ間を瞬時にジャンプし、コーディングが簡単で、セッションを必要とせず、フレームワークに依存しません(どのような状況でも使用できます)。

私は心理学市場向けに250問の心理学ベースのテストを行う製品を開発しています。完全に圧倒的ではないテストを行うために、フォームを25の質問セグメントに分割し、シーケンシャルIDが追加されたdivタグ(つまり、div1、div2、div3)を介してループで出力します。各divは次を表示するように設定されています。最初のもの以外はありません。

次に、現在のdiv + 1を切り替えるボタンをユーザーに提供します(つまり、div 1の場合は、$(#div2).show()などを実行します。戻るボタンは逆になります。

重要な部分は、フォームがすべてのdivをカバーすることです。次に、最後に送信ボタンで進む/戻るボタンを交換するだけです。

出来上がり!はい、ローテクです。しかし、高速です....そして、前進または後退して値を失う可能性はありません。

したがって、大まかな切り捨てられた例:

<form>
  <div id="div1">
     First 25 Questions
     <input type="button">shows next div</input>
  </div>
  <div id="div2" style="display:none">
    Second 25 Questions
    <input type="submit">Submit Form</input>
  </div>
</form>
于 2011-02-22T20:38:08.877 に答える
3

ウィザードのすべてのステップで使用する一意の ID を作成します。フォームを最初に保存するときに、その ID をデータベースに保存します。を使用して、この ID を次のステップに転送しますinput type="hidden"
ステップを保存するときは、最初に ID の照合を試み、データベース内で見つかった場合は、挿入ではなく更新を実行します。

「ポスト データを再送信しますか」というメッセージを回避するには、2 つの CodeIgniter コントローラ アクションで各ウィザード ステップを実行します。

  • SaveStep5(POST: フォーム インスタンス ID + 他の「ウィザード ステップ 5」入力): データベースでフォーム インスタンス ID を検索し、挿入/更新コマンドを実行します。LoadStep6 にリダイレクトし、GET パラメータでフォーム インスタンス ID を渡します。
  • LoadStep6(GET:フォームインスタンスID); インスタンスが見つからない場合は、データベースでフォーム インスタンスを検索します。インスタンスが見つかった場合のエラー処理は、「ステップ 6」の入力フォームをレンダリングします。
于 2011-02-22T19:45:10.900 に答える
0

フォームの各フィールドの変数を使用してウィザード データを格納するモデルがあります。

class Class_signup_data extends CI_Model {
const table_name="signups_in_progress";
public $market_segment; // there is a field named 'market_segment' in the wizard view

... ... ...

session_id のパラメーターと現在のプロセスの段階を使用して、プロセス全体を処理するコントローラーが 1 つあります。

    class Signup extends CI_Controller {
    public function in_progress($session_id=NULL,$stage=1) {
        $this->index($session_id,$stage);
    }
    public function index($session_id=NULL,$stage=1) {
    if ($session_id===NULL) $session_id=$this->session->userdata('session_id');
...
...

このコントローラには、どのステージにいるかを示すスイッチがあります。最初に「前へ」ボタンを探します。

switch ($stage) {
        case 2:
            if ($this->input->post('prev')) { // if they click Previuous, the validations DON'T need to be met:
                $signup_data->save_to_db(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '1',
                    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
                $this->load->helper('url');
                redirect("/signup/in_progress/".$session_id."/1");

その後、スイッチで CI の Validations を使用してフォームを表示し、クリックされた場合、または /signup/in_progress/session/2 で呼び出されている場合は「次へ」を処理します。

    $this->form_validation->set_rules("your rules");
if ($this->form_validation->run() == FALSE) {
    $this->load->view('signupStage2',array('signup_data'=>$signup_data));
} else {
    $signup_data->save(array_merge(array('ip'=>$_SERVER['REMOTE_ADDR'],'session_id'=>$session_id,'signup_stage' => '3',
    'signup_complete' =>'0'),$this->input->post()),$this->db,$session_id);
    $this->load->helper('url');
    redirect("/signup/in_progress/".$session_id."/3");
};

各ビュー (例: 「signupStage2.php」) の下部に、前と次のボタンがあります。

    <span class="align-left"><p><input type="submit" name="prev" class="big-button"
value="<- Prev" /><input type="submit" name="next" class="big-button"
value="Next ->" /></p></span>
于 2015-05-06T23:53:13.050 に答える
0

投稿の再送信についてユーザーに警告するメッセージを回避したい場合、また JavaScript で異なる手順だけでなく複数の適切なページを作成したい場合は、回答を GET パラメータとして URL に入れることができます..最初のフォームの後に送信すると、form2.php を取得できますか? URLに..これらの回答をform2などの隠し変数として追加できます。
ただし、これは非常にエレガントなソリューションではありません。javascript を使用することをお勧めします。フォーム送信用のカスタム ハンドラーを追加し、ajax 経由でフォーム コンテンツを送信してから、ajax 完了時に次のフォームをロードします。
また、他の人が答えたように、サーバー側では、データベース内の送信データを取得/更新する一意の ID が必要になります。

于 2011-02-22T19:49:15.903 に答える
0

すべてのステップが完了するまでデータベースの更新を待つアプローチが気に入っています。セッションの中間ステップですべてのデータを保存できます。使用しているモデル オブジェクト (使用している場合) をセッションに保存することもでき、すべての手順が完了したら、データベースの挿入を行うことができると思います。

于 2011-02-22T19:52:17.833 に答える