2009-10-23 24 views
0

我將在我的MVC應用程序(自制MVC框架)中編寫一個mutistep表單,在最後一步完成之前不會插入任何數據。PHP中的多步表單 - MVC App

我得到了下面的問題我真的想找到一種方式來解決這個問題/問題

  • ,有沒有?
  • 我希望它很容易執行返回操作,並在最後一步獲取數據。問題:會話是傳遞數據的唯一方式嗎?獲取參數可能是更好/更簡單的選項?
  • 你是如何解決這個問題之前

回答

1

看他們如何實現它Symfony,這是相當好建在該框架內。

你只需要下載它,並期待在您的項目:/ lib目錄/ symfony中/形式

基本上你應該爲你的表單輸入每一個班;

  • 你總是可以創建不同的和複雜的,然後;
  • 你去創造他們每個校驗器類(也許配置),
  • 你存儲在你的會話或Cookie保存PHP對象數據,

我不建議使用的參數保存,其中太多,你必須考慮URL最大尺寸和瀏覽器限制。

1

我不會去的數據在任何東西,但餅乾/會話,至少不是如果你希望用戶能夠來回您的步驟之間。

在你的控制器:

$_SESSION['yourform']['optionalSubformOrPage']['field'] = $_POST['field']; 
header('Location: nextpage'); 
die; 

在你看來:

<input name="field" value="<?php echo isset($_SESSION['yourform']['optionalSubformOrPage']['field']) ? $_SESSION['yourform']['optionalSubformOrPage']['field'] : null; ?>" /> 
1

幾個相對簡單的解決方案:

  • 將數據保存到第二個數據庫表,只有將其複製到最後的主表
  • 將您的數據保存到<input type="hidden">個元素,讓你的$_POST全球將包含給定到目前爲止
  • 將數據保存到一個會話/ cookie的

我不會永遠使用GET PARAMS像這樣的任務,每一個答案;很容易忽略掉一兩個,而且大多數瀏覽器都有一個相對較短的maximum URL length。在這種情況下,餅乾或隱藏的<input>將是您最好的選擇。

0

我自己做了這個。我開始嘗試通過在隱藏的表單字段中存儲來自其他步驟的值來避免對會話的依賴,但是這很快變得很難處理,所以最終我使用了會話。

0

您也可以通過隱藏字段傳遞變量,但使用像螢火蟲這樣的工具可以修改這些字段,這不是一個好主意。我認爲會話是存儲這種類型數據的最佳方式。

不管怎樣,在PHP代碼,我總是存儲變量,表示該表必須顯示:

switch($_SESSION['step']) 
{ 
    case 1: echo "<form name='first'..."; 
    break; 
    case 2: echo "<form name='second'..."; 
    break; 
    .... 
} 
1

杜洛斯提出了一些很好的建議。另一種選擇是逐步將數據存儲到數據庫中,但對該數據保留一個標記以表明它不完整。當他們提交表格的最後一頁時,插入數據並將其標記爲完整。你會碰到這種方法的問題是:被留在桌上

  • 你需要運行一些維護一個多星期來清除舊的不完整數據(較老的

    • 不完整的數據,或者其他的東西)
  • 它可能會讓你的程序邏輯的其餘部分變得更加複雜。您必須始終檢查記錄是否「完整」。

如果你是不完整的數據存儲在另一張表,就像Duroth提到的,那麼你會避免第二個問題,但你必須在你的數據庫中的一些重複表。

0

有一個很好的方法可以讓你的任務變得非常簡單,不需要在會話中存儲值。

您只需將您的多個步驟從不同的div中劃分出來,並將除第一個div之外的所有div都隱藏起來。這樣你就可以返回並使用jquery,而不會丟失數據。

例如表單會喜歡這個

<form action="your_url" action="post"> 
    <div class="div1"> 
     your first page 
    </div> 
    <div class="div2" style="display:none;"> 
     your second page 
    </div> 
</form>