2011-02-22 14 views
1

我想在PHP和CodeIgniter中構建一個多步驟/頁面表單,我想知道你們中的任何一個人能否幫助我。在PHP和CodeIgniter中的多步/頁表格

如何在配置項中使用多步表單來更新而不是在您使用後退按鈕返回上一步時再次插入?我怎樣纔能有一個表單,沒有那些後退按鈕POST表單重新發送消息?

編輯:如果可能的話不帶JS的

謝謝!

+2

我會用JS去完成這些步驟,然後提交一切儘快... – prodigitalson 2011-02-22 19:42:12

+0

@prodigitalson對不起,我忘了在我的問題中提到這一點,但我希望它是免費的JS是可能的。謝謝 – RS7 2011-02-22 19:45:30

回答

3

創建一個您在嚮導的所有步驟中使用的唯一ID。在初始保存表單時將該ID保存到數據庫中。 使用input type="hidden"將此ID轉發到下一步。
保存步驟時,首先嚐試匹配ID,如果在數據庫中找到它,則執行更新而不是插入。

爲了避免「你要重新發送發佈數據」,則執行兩個笨控制器動作每個嚮導步驟:

  • SaveStep5(POST:形式實例ID +其他「嚮導步驟5」輸入): 在數據庫中查找表單實例ID並執行插入/更新命令; 重定向到LoadStep6並在GET參數中傳遞表單實例ID;
  • LoadStep6(GET:form instance ID); 查找形式實例在數據庫中, 如果實例未發現:錯誤處理 如果實例被發現,使得輸入表單「第6步」
+0

繼續與類似的東西,但使用uri段。謝謝 – RS7 2011-02-27 23:48:32

0

如果你想避免這些消息,這些消息警告用戶重新發送帖子,並且您還希望擁有多個適當的頁面,而不僅僅是javascript中的不同步驟,您可以將URL中的答案作爲GET參數。 所以在第一次提交表單之後,您將獲得form2。 PHP的?在網址中,您可以將這些答案作爲隱藏變量添加到form2等內容中。
雖然這不是一個非常優雅的解決方案。我建議你使用javascript:爲表單提交添加自定義處理程序,並通過ajax提交表單內容,然後在ajax上加載下一個表單。
另外,就像其他人在服務器端回答的那樣,您需要一個唯一的ID來獲取/更新數據庫中的提交數據。

0

我喜歡等待數據庫更新的方法,直到所有步驟都完成。您可以將所有數據存儲在會話的中間步驟中。我想你甚至可以在會話中保存你正在使用的模型對象(如果你使用的是),並且在所有步驟完成後,你可以進行數據庫插入。

5

這是我從另一個問題的答案。它爲您提供前向/後向能力,而不會丟失數據,即時跳轉頁面,易於編碼,無需會話,並且與框架無關(可以在任何情況下使用):

我開發了一個產品心理學市場,250問題心理測試。爲了進行不完全壓倒性的測試,我將表單分成25個問題段,並通過帶有順序ID的div標籤(即。div1,div2,div3)在循環中輸出。每個div都設置爲顯示:只有第一個。

我然後提供與該切換按鈕的用戶的當前的div + 1(即,如果上DIV 1,它會做$(#div2).show()等回到按鈕做相反。

最重要的部分是,形式涵蓋了所有的div,然後它只需要用提交按鈕替換掉前進/後退按鈕。

Voila!是的,技術含量低,但FAST ....沒有機會失去價值向前或向後

所以,一個粗略截斷的例子:

<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> 
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參數和方法的我們的階段:

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'); 
... 
... 

在該控制器我有我們在該階段的開關 - 它升ooks爲「後退」按鈕,第一:

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的驗證顯示錶單和流程「下一步」,如果它被點擊或者它僅僅是被稱爲與交換機/註冊/ IN_PROGRESS /會議/ 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」)我有prev和next按鈕的底部:

<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>