PHP と CodeIgniter で複数のステップ/ページ フォームを作成しようとしていますが、どなたか助けていただけないでしょうか。
戻るボタンで前のステップに戻ったときに、再度挿入するのではなく更新する複数ステップのフォームを CI に含めるにはどうすればよいですか? これらの戻るボタン POST フォームがメッセージを再送信しないフォームを作成するにはどうすればよいですか?
編集:可能であればJSなし
ありがとう!
PHP と CodeIgniter で複数のステップ/ページ フォームを作成しようとしていますが、どなたか助けていただけないでしょうか。
戻るボタンで前のステップに戻ったときに、再度挿入するのではなく更新する複数ステップのフォームを CI に含めるにはどうすればよいですか? これらの戻るボタン POST フォームがメッセージを再送信しないフォームを作成するにはどうすればよいですか?
編集:可能であればJSなし
ありがとう!
これが別の質問からの私の答えです。データを失うことなく前進/後退する能力を提供し、ページ間を瞬時にジャンプし、コーディングが簡単で、セッションを必要とせず、フレームワークに依存しません(どのような状況でも使用できます)。
私は心理学市場向けに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>
ウィザードのすべてのステップで使用する一意の ID を作成します。フォームを最初に保存するときに、その ID をデータベースに保存します。を使用して、この ID を次のステップに転送しますinput type="hidden"
。
ステップを保存するときは、最初に ID の照合を試み、データベース内で見つかった場合は、挿入ではなく更新を実行します。
「ポスト データを再送信しますか」というメッセージを回避するには、2 つの CodeIgniter コントローラ アクションで各ウィザード ステップを実行します。
フォームの各フィールドの変数を使用してウィザード データを格納するモデルがあります。
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>
投稿の再送信についてユーザーに警告するメッセージを回避したい場合、また JavaScript で異なる手順だけでなく複数の適切なページを作成したい場合は、回答を GET パラメータとして URL に入れることができます..最初のフォームの後に送信すると、form2.php を取得できますか? URLに..これらの回答をform2などの隠し変数として追加できます。
ただし、これは非常にエレガントなソリューションではありません。javascript を使用することをお勧めします。フォーム送信用のカスタム ハンドラーを追加し、ajax 経由でフォーム コンテンツを送信してから、ajax 完了時に次のフォームをロードします。
また、他の人が答えたように、サーバー側では、データベース内の送信データを取得/更新する一意の ID が必要になります。
すべてのステップが完了するまでデータベースの更新を待つアプローチが気に入っています。セッションの中間ステップですべてのデータを保存できます。使用しているモデル オブジェクト (使用している場合) をセッションに保存することもでき、すべての手順が完了したら、データベースの挿入を行うことができると思います。