2015-12-08 156 views
0

我有一個奇怪的問題,與我的一個實體。symfony隱藏字段,但驗證它們

我的車實體具有以下數據庫表字段:

  • 訂單(PK)
  • licenseplate(PK)
  • 使
  • 模型
  • 變種

在唯一可見的字段形式是牌照。

該字段後面有一個按鈕,訪問者通過ajax調用將數據添加到數據庫的AjaxController來獲取make/model/variant數據。 (有一個$ session'orderId'來設置'orders'字段)。

我需要絕對確定訪問者已經獲取了make/model/variant,並且訪問者不能更改make/model/variant數據。

如何檢查表單上是否填寫了車輛表?我可以做一個學說檢查並將表格設置爲「無效」嗎?

謝謝你的時間。

問候,拉斯

+0

爲什麼不提取ajax數據並填充表單的隱藏字段並在提交時包含該數據?這樣你就可以製作需要使用標準驗證的字段(但隱藏)。 此外,如果用戶必須選擇製造商/型號/變體,爲什麼這些字段是隱藏的?他們不想看看他們選擇了什麼嗎? – Richard

+0

嗨@Richard - 這些字段不在

中,因爲用戶可能無法更改這些值。 我的ajax調用返回make/model/variant作爲一個字符串,以便用戶可以看到它是正確的汽車。 但我想確保用戶不會更改make/model/variant值,因此我將它們保存在ajax調用中。 但同時我想確認在表單提交用戶已經提取了汽車數據。 它有道理嗎? –

+0

這很有道理,有很多方法可以做到這一點,我已經添加了一個作爲我頭頂的答案。 – Richard

回答

0

一種方法是:

  1. 卸妝,從表單模型和變型。如果你不希望用戶潛在地改變它們,並且你將它們保存在其他地方,那麼讓它們毫無意義。
  2. 向表單中添加隱藏的非映射字段,如'dataFetched'。
  3. 當通過ajax成功獲取/保存汽車數據時,將此字段設置爲選中/ true
  4. 通過javascript,直到dataFetched字段被選中才允許表單提交。
  5. 在PRE_SUBMIT偵聽器中,檢查dataFetched是否爲true,如果不是,則使表單失效(因爲JS檢查本身是不夠的)。有關偵聽器示例,請參閱symfony標準包中的CsrfValidationListener。 (我使用2.3,但我認爲它仍然在更新版本中)。
  6. (可選)如果您想在表單中保留make/model/variant。在收聽者中,您還可以檢查製作/型號/變體 是否符合您的預期(在用戶更改 的情況下)&將使表單在此時無效。
+0

如何查看Listener中的make/model/variant? 據我所知「Docity」在「EntityType」中不可用?它可以注射嗎? –

+0

是的,你可以注入doctrine/entitymanager到一個表單類型(以及擴展的監聽器)沒有問題。您可以直接作爲構造函數參數來完成,或者將表單類型定義爲服務並以此方式注入實體管理器。聽衆本身也可以訪問表單中的底層實體對象。 – Richard

+0

嗨@Richard - 我接受了你的回答 - 你有沒有注射工程的例子?我昨天沒有任何運氣搜索谷歌。感謝您的時間! –