2016-03-03 27 views
1

我有一個表單,我正在驗證使用CFWheels模型驗證和表單助手。CFWheels:在redirectto而不是渲染頁面上顯示錶單錯誤

我的索引()動作/視圖在控制器代碼:

public function index() 
{ 
    title = "Home"; 
    forms = model("forms"); 
    allforms = model("forms").findAll(order="id ASC"); 
} 

#startFormTag(controller="form", action="init_form")# 
    <select class="form-control"> 
     <option value="">Please select Form</option> 
     <cfloop query="allforms"> 
      <option value="#allforms.id#">#allforms.name#</option> 
     </cfloop> 
    </select> 
    <input type="text" name="forms[name]" value="#forms.name#"> 
    #errorMessageOn(objectName="forms", property="name")# 
    <button type="submit">Submit</button> 
#endFormTag()# 

這種形式提交給init_form()動作和代碼是:

public function init_form() 
{ 
    title = "Home"; 
    forms = get_forms(params.forms); 

    if(isPost()) 
    { 
     if(forms.hasErrors()) 
     { 
      // don't want to retype allforms here ! but index page needs it 
      allforms = model(tables.forms).findAll(order="id ASC"); 
      renderPage(action="index"); 
      //redirectTo(action="index"); 
     } 
    } 
} 

你可以從看上面的代碼我驗證表單字段的值,如果有任何錯誤發送到原始索引頁面。我的問題是,因爲我正在渲染頁面,所以我還必須重新輸入頁面所需的其他變量,例如在這種情況下的「allforms」下拉菜單。

有沒有辦法不輸入這樣的變量?如果不是renderPage()我使用redirectTo(),那麼錯誤不顯示?這是爲什麼?

爲了清楚起見,我想將頁面發送/重定向到原始窗體並顯示錯誤消息,但我不想輸入呈現該頁面所需的其他變量?有沒有辦法。

如果您需要更多說明,請讓我知道。

+0

你爲什麼不車輪的閃光信息功能顯示錯誤信息 –

+0

如何傳遞我在模型中定義的自動生成錯誤?如果我使用flash,那麼我必須編寫自己的驗證代碼並傳遞我自己的驗證消息。我想使用CFWheels功能來生成服務器端錯誤。但接下來的事情是如何將錯誤作爲參數傳遞?甚至在重定向的頁面上觸發錯誤。 –

回答

3

這似乎有點偏離主題,但我的猜測是,這是形式的問題,使用一個控制器控制(new)渲染和利用處理其他(create)或更新的情況下,渲染使用edit手柄表格使用update

我會爭論,恕我直言,等等...... cfWheels路線完成的方式留下了一些改進的餘地。在許多不同框架的路由組件中,您可以看到POST的控制器功能與GET不同。使用cfWheels,所有的調用都是基於url處理的,所以如果你使用相同的URL(比如當表單動作留空時),那麼GETPOST將由相同的控制器處理。

這是cfwheels互動做的:

cfwheels way of doing it

雖然有可能改變它的方式,將文檔和教程,你會發現似乎更喜歡做的這種方式。

TL; DR;

可用的解決方法是讓窗體呈現(GET:新建,編輯)和處理(POST:創建,更新)由同一個控制器函數(路由)處理。在函數...

  • 如果是POST,運行一個私有功能檢查,如果用戶提交的使用POST
    • (即handle_create())處理該handle_create()功能,你可以設置你所有的錯誤檢查和創建錯誤
    • 如果函數沒有錯誤,創建(或更新)的模型和可選重定向到
    • 成功頁面內的形式
    • 否則返回錯誤的目的/陣列
  • 使可用的結果誤差對象/陣列,以查看
  • 處理表單創建

在視圖中,如果存在錯誤,請將它們顯示在窗體中或頂部某處。確保表單操作指向自己或者是空的。給提交按鈕一個名稱和值也可以幫助確定一個表單是否被提交。

這個「模式」在沒有會話的情況下工作得很好。

否則,您可以使用Flash,因爲它是爲它創建的,但您確實需要使用Sessions。這裏描述它們的用途:http://docs.cfwheels.org/docs/using-the-flash在這裏:http://docs.cfwheels.org/v1.4/docs/flashmessages

但它確實是因爲添加以下內容到控制器

flashInsert(error="This is an error message."); 

一樣方便,這對你的看法

<cfif flashKeyExists("error")> 
     <p class="errorMessage"> 
      #flash("error")# 
     </p> 
    </cfif> 
相關問題