【问题标题】:Codeigniter use validation callback to change submitted valueCodeigniter 使用验证回调来更改提交的值
【发布时间】:2011-06-05 01:22:42
【问题描述】:

我有一个文本输入,用户在其中提交 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 声明中添加了这个以删除重复项

$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
);          

它似乎有效

【问题讨论】:

    标签: php forms codeigniter callback


    【解决方案1】:

    尽管有 cmets,但这是使用回调的完全正当理由,类似于实际更改所提交输入值的“准备”规则(例如: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 库或其任何扩展的任何函数你可能有。

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

    希望这能消除一些困惑。

    【讨论】:

    • 谢谢。当我写“具有更多 CI 专业知识的人”时,我想到了你。 ;) 这是否记录在用户指南中?我只是看了看,发现了一行,但没有例子。当你返回它时,$result 去哪里了?令人困惑!
    • 参见prepping data 上的示例。其中之一是 md5 例如,它将 md5 字符串。看看他们如何建议在返回 true/false 的验证规则之前不要运行改变输入的函数,以便在重新填充表单时显示原始数据。通常使用url_title() 之类的东西也是一个很好的例子。基本上,任何返回字符串的函数都会改变输入的值。
    • 嗯。仍然很困惑;我明天会检查一下,因为现在是凌晨 4 点,我现在可能太累了。谢谢你教我一些新东西;)
    • @Wesley Murch 我为你的回答鼓掌!我认为我们都学到了一些有价值的东西。在我的验证规则中,我在末尾添加了callback__remove_dublicates。我只有1个问题。在回调函数中为什么使用$str = ''?只是$str 似乎也有效。再次感谢!
    • @Cyber​​Junkie:这是我的偏执狂,我总是在 PHP 中提供默认参数,因此如果缺少它不会引发通知。这可能是一个坏习惯,因为有时您希望收到错误通知。仅供参考,我认为你的函数太有用了,不能只是一个回调 - 我建议将它写在可以在其他控制器中使用的地方(比如在帮助器中),然后你可以使用 $this->form_validation->set_rules('colors','Colors','required|remove_duplicates'); 或类似的东西。
    【解决方案2】:

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

    我只是将检查重复项的函数调用放入您的 else 并始终在其中运行它,然后再将数据插入数据库。

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

    【讨论】:

    • +1。我同意。验证回调不是合适的地方。如果我们想显示关于重复问题的错误消息,回调将是合适的,但如果它本身不是验证,那么它应该在之后发生..
    • 好建议。我用解决方案编辑了我的问题。你喜欢吗?
    • 回调可以返回真/假返回一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多