2011-06-05 66 views
3

我有一個用戶提交CSV的文本輸入,例如red, blue, red, yellowCodeigniter使用驗證回調來更改提交的值

如果用戶提交重複值,例如red,如上所示,我想刪除重複項。我開始做回調,但我不知道如何完成它。

//callback rule 
    function _remove_dublicate($str) 
    { 
      $val = strtolower($str); //make everything lowercase 
      $colors = str_getcsv($val); //create array       
      $result = array_unique($colors); //remove duplicates 

    } 

如果有重複的,我應該怎麼做,從$result提交新的字符串到數據庫?

下面是我的表單驗證

$this->form_validation->set_rules('colors', 'Colors', 'trim|required|xss_clean|regex_match[/^[a-z, ]+$/i]|callback__remove_dublicate'); 


     if ($this->form_validation->run() == FALSE) //if validation rules fail 
     {   
      $this->load->view('edit/form'); 
     } 
     else //success 
     { 
      $data = array (
       'colors' => $this->input->post('colors') 
      );   
      $this->My_model->colors_update($data);   
     } 

編輯

基於歌廳的建議我加入這個在else語句刪除dublicates

$colors = str_getcsv($this->input->post('colors')); //create array 
$result = array_unique($colors); //remove duplicates 
$comma_separated = implode(",", $result); //add back CSV string 

$data = array (
    'colors' => $comma_separated 
);   

看來工作

回答

6

儘管有這些評論,但這是一個使用回調的完全有效的理由,類似於實際改變輸入值(例如trim,xss_clean,strtolower)的「prep」規則。

你在正確的軌道上,你所要做的就是在你的回調中使用return $result,它會改變輸入,但確保你返回一個字符串。例如:

//callback rule 
function _remove_duplicate($str = '') 
{ 
    $val = strtolower($str); //make everything lowercase 
    $colors = str_getcsv($val); //create array 
    // you could also use explode(',', $colors) 
    // if you aren't expecting other delimiters than a comma 
    // i.e. no commas within quotes       
    $result = array_unique($colors); //remove duplicates 
    $result = implode(',', $result); // back to string value 
    return $result; // Return the value to alter the input 
} 

現在,如果你想警告,有重複的,而不是簡單地刪除它們,只是return FALSE如果找到,可能與count($colors) === count($result)$result仍然是一個數組的用戶。這取決於你,但只是讓你知道選項返回真/假改變輸入可用。

你實際上可以在Form_validation類本身(擴展庫,甚至只是一個全局函數)內寫入類似這樣的新的表單驗證規則,而不需要使用回調,它似乎是一個非常可重用的功能。

這被認爲是「準備」規則。來自User Guide

除了像我們上面使用的驗證功能之外,您還可以以各種方式準備數據。例如,您可以設置規則是這樣的:

$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean'); 
$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5'); 
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required'); 
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email'); 

在上面的例子中,我們是「微調」的字段,密碼轉換爲MD5,並通過「xss_clean」運行的用戶名功能,可以刪除惡意數據。

任何本地PHP函數,接受一個參數可以作爲一個規則,像用htmlspecialchars,修剪,MD5等

注意:您通常會希望驗證規則後,使用預學習功能,所以如果有是一個錯誤,原始數據將顯示在窗體中。

因此,在檢查輸入有效後,您可以繼續清理它,修剪,從逗號分隔的字符串中刪除重複項或任何您想要的項目。任何全局可用的函數都是有效的(包括非本地PHP函數,例如:任何CI的輔助函數,只要它們被加載和定義),以及任何屬於Form_validation庫或其任何擴展的函數你可能有。

需要注意的一件事:如果函數不存在或不可用,它將被默默忽略。經常測試以確保您獲得正確的結果。

希望這會消除一些混亂。

+0

謝謝你。當我寫下「具有更多CI專業知識的人」時,我一直在想你。 ;)這是用戶指南中記錄的?我只是看了看,發現一條線,但沒有例子。當您返回時,結果在哪裏?混亂! – cabaret 2011-06-05 01:50:36

+1

請參閱[準備數據](http://codeigniter.com/user_guide/libraries/form_validation.html#preppingdata)上的示例。其中之一就是'md5',例如md5就是字符串。看看他們建議不要運行改變輸入的函數,直到返回true/false的驗證規則之後,以便在重新填充表單時顯示原始數據。通常使用類似'url_title()'的東西也是一個很好的例子。基本上,任何返回字符串的函數都會改變輸入的值。 – 2011-06-05 01:53:02

+0

嗯。仍然很困惑;我明天會檢查這個,因爲現在是凌晨4點,我現在可能已經太累了。感謝教我新的東西;) – cabaret 2011-06-05 01:56:21

2

就我個人而言,我會採取回調方法和哈稍後,在表單驗證通過之後。我不認爲有辦法從回調中返回結果數組。至少Userguide沒有指定任何關於它的內容。表單驗證庫的回調僅用於返回truefalse,我認爲

我只是把一個函數調用,檢查重複到你的else,並在數據插入到數據庫之前,總是運行它。

也許有更多CI專業知識的人知道更好的方法,但這就是我會這麼做的。

+2

+1。我同意。驗證回調並不適合這種情況。如果我們想要顯示關於重複問題的錯誤消息,回調將是適當的,但如果它本身不是驗證,那麼它應該發生在.. – Ben 2011-06-05 01:31:43

+0

好的建議。我用解決方案編輯了我的問題。你喜歡? – CyberJunkie 2011-06-05 01:39:38

+0

是的,這或多或少是我如何做到的。 :) – cabaret 2011-06-05 01:41:44