Codeigniter使用验证回调来更改提交的值

时间:2011-06-05 01:22:43

标签: php forms codeigniter callback

我有一个用户提交CSV的文字输入,例如red, blue, red, yellow

如果用户提交了实例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);          
        }

修改

根据Cabaret的建议,我在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
);          

似乎有效

2 个答案:

答案 0 :(得分:7)

尽管有评论,但这是使用回调的完全正当理由,类似于实际更改提交输入值的“准备”规则(例如:trim,xss_clean,strtolower)。

你走在正确的轨道上,你所要做的就是在你的回调中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仍然是数组。这取决于你,但只是你知道返回true / false的选项改变输入是可用的。

你实际上可以将这样的东西写入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,trim,MD5等。

     

注意:您通常希望在验证规则之后使用预备功能,因此如果出现错误,原始数据将显示在表单中。

因此,在您检查输入有效后,您可以继续清理,修剪,删除逗号分隔字符串中的重复项或任何您想要的内容。任何全局可用的函数都是有效的(包括非本机PHP函数,例如:CI的任何辅助函数,只要它们被加载和定义。),以及属于Form_validation库或其任何扩展的任何函数。你可能有。

要注意的一件事:如果该功能不存在或不可用,它将被静默忽略。始终进行测试以确保您获得正确的结果。

希望这可以解决一些困惑。

答案 1 :(得分:2)

就个人而言,在表单验证通过后,我会将回调方法取出并稍后处理。我认为没有办法从回调中返回结果数组。至少用户指南未指定任何内容。表单验证库的回调仅用于返回truefalse我认为

我只是将一个函数调用检查重复项到else并在将数据插入数据库之前始终在那里运行。

也许拥有更多CI专业知识的人知道更好的方法,但我就是这样做的。