2014-04-18 77 views
1

使用CodeIgniter的Form_validation類時,set_rules()方法允許用戶向其表單字段添加無限數量的檢查。這些規則通常都在調用run()方法之前在同一個地方定義。

VALID例

// Require the user to be a werewolf. 
$this->form_validation->set_rules('werewolf', 'Are you a Werewolf?', 'required'); 

// If the form validates. 
if ($this->form_validation->run()) 
{ 
    // [...] 

(不,我不實際運行狼人網站)

該代碼使得很多的感覺,是很容易理解的。但是,有時候,這可能是不可取的。例如,也許你不在乎用戶是否是狼人,除非是午夜。您的代碼可能會是這樣的:

invalid範例

// If it is midnight. 
if (date('G') == '0') 
{ 
    // Require the user to be a werewolf. 
    $this->form_validation->set_rules('werewolf', 'Are you a Werewolf?', 'required'); 
} 

// If the form validates. 
if ($this->form_validation->run()) 
{ 
    // [...] 

都不行

至少,它不會到午夜工作。

默認情況下,如果沒有聲明任何規則,$this->form_validation->run()返回FALSE。在第二個示例中,除非是午夜,否則不會有任何規則設置,因此表單將永遠不會生效。從邏輯上講,人們會假設如果沒有規則,表單應該確認無論如何。相反,它失敗無論如何。

/系統/庫/ Form_validation :: run()的

(線293-297)

// No validation rules? We're done... 
if (count($this->_config_rules) == 0) 
{ 
    return FALSE; 
} 

我的問題是:

這是爲什麼默認返回值?如果我改變它可以嗎?

+0

你通常不希望驗證時,你有沒有規則把數據靠在。在這種情況下返回FALSE表明出現了問題:沒有找到「規則」。我可以看到這在使用動態規則集時非常有用(不是我可以想到這些用法)。 – L7Lynx

+0

在我的情況下,我試圖要求一個字段,當且僅當一個文件與表單一起提交時。當我意識到必須在沒有互聯網批准的情況下更換系統功能時,我非常擔心! – Nathanael

回答

1

@Nathanael - 你是對的,我不記得不看,如果這已經解決了V3或否。

兩種方式處理這個問題:

1)(這是不行的你的代碼是當前設置方式,但瓦特/小柚木它會) - 在每個字段設置爲「修剪」,每時每刻。這將觸發所有的驗證碼。即使您不想做任何必需的事情,對於重新填寫表單來說,這也是一種老式的解決方法。

2)更好 - 爲該字段制定一個自定義規則,該規則始終被檢查,並在規則內部有條件地要求。

記住驗證庫規則實際上是對的lib只是功能,讓您的自定義規則裏面,你可以這樣做:

$this->validation->required($str); 

類型的代碼來檢查你的輸入。

+0

使用「修剪」是一個很好的解決方案,儘管有點駭人聽聞。在選擇答案之前,我會等待以確定是否有人能夠解決有關第293-297行的問題。 – Nathanael

1

只需設置空規則,驗證庫將自動通過並繼續。

$ this-> form_validation-> run()將返回true。

$this->form_validation->set_rules(fieldName,'',''); 

參考https://github.com/bcit-ci/CodeIgniter/issues/1558

把你的代碼,例如,你的代碼會是這樣

// If it is midnight. 
if (date('G') == '0') { 
    // Require the user to be a werewolf. 
    $this->form_validation->set_rules('werewolf', 'Are you a Werewolf?', 'required'); 
} else { 
    $this->form_validation->set_rules('werewolf', '', ''); 
} 
+0

這也是一個很好的解決方案。感謝您添加它。 –

相關問題