CI3 - form_validation回调坏了吗?

时间:2018-04-13 11:57:07

标签: php codeigniter codeigniter-3

我正在运行以下表单验证;

$this->form_validation->set_rules('pricing_group', 'Pricing Group', 'callback_pricing_group');

使用回调函数:

public function pricing_group($pricing_group) {
        if ($pricing_group > 0) {
            return true;
        } else {
            $this->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
            return false;
        }
    }

返回错误:

"pricing_group":"Unable to access an error message corresponding to your field name Pricing Group.(pricing_group)"

我还尝试在执行true / false检查之前放置set_message函数。请注意,现在的逻辑(只是检查它是否大于零)与预期的最终逻辑不同 - 它只是我正在尝试找出问题所在的基本示例。

如果我在这里犯了一些愚蠢的错误,有人能发现吗?这与我之前使用回调函数的唯一区别在于,此表单验证是在模型中进行的(因为它将在数据库中检查此值),而不是在控制器中。如果我删除callback_pricing_group规则并将其换成“numeric”之类的内容,则可以正常使用。

3 个答案:

答案 0 :(得分:0)

您可以尝试使用' trim'在回调之前,获取带有null的参数,如下所示。因为您没有验证'必需'所以它可能是从回调中返回null的原因。同时在调用函数

中传递field-name作为参数
$this->form_validation->set_rules('pricing_group', 'Pricing Group', 'trim|callback_pricing_group[pricing_group]');

public function pricing_group($pricing_group=0) {
    if ($pricing_group > 0) {
        return true;
    } else {
        $this->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
        return false;
    }
}

答案 1 :(得分:0)

我在我的项目中测试了以下代码,它运行正常。现在试试吧,我百分百肯定它会起作用。

请确保subclass_prefix中的application/config/config.php。它应该

$config['subclass_prefix'] = 'MY_';

按照自定义验证功能工作。

如果您已更改subclass_prefix值。示例ABC_,那么您的验证文件应该与ABC_Form_validation.php

中的application/libraries相似

您的控制器

class Your_Controller extends CI_Controller{
    function Your_Function(){
        $this->load->library('form_validation');
        if($this->input->post()){
            if($this->form_validation->run('pricing_group_validation') == TRUE){ 
                    // success          
                _e($this->input->post());
            }else{
                _e($this->form_validation->error_array());
            }
        }
    }
}

<强>应用/配置/ form_validation.php

$config = array(   
    'pricing_group_validation' => array(
        array(
            'field' => 'pricing_group',
            'label' => 'Pricing Group',
            'rules' => 'trim|pricing_group'
        )
    )
);

<强>应用/库/ MY_Form_validation.php

class MY_Form_validation extends CI_Form_validation{    
    function __construct($config = array()){
        parent::__construct($config);
        $this->CI =& get_instance();
        $this->_config_rules = $config;
    }
    public function pricing_group($pricing_group){
        if ($pricing_group > 0) {
            return true;
        } else {
            $this->CI->form_validation->set_message('pricing_group', 'Invalid Price Group Specified.');
            return false;
        }
    }
}

答案 2 :(得分:0)

在通过Github联系CI开发团队后,终于想到了这一点。文档有点不清楚 - 所以我发布了下面的解决方案。

首先,模型内验证本身并不起作用,不幸的是,这是一个事实。除非您想扩展核心库,否则它不会发生。

相反,必须从控制器调用form_validation函数 - 验证函数本身可以位于模型中。因此,以我的问题为例,这将成为;

<强>控制器:

$this->form_validation->set_rules('pricing_group', 'Pricing Group', array('valid_pricing_group', array($this->pricing_group_model, 'valid_pricing_group')));

请注意围绕valid_pricing_group回调的嵌套数组。未能嵌套此数组并包含字段名称将导致上述&#34;错误消息未找到&#34;问题

定价模式:

public function valid_pricing_group($pricing_group) {
        if ($this->get_pricing_group($pricing_group) === false) {
            $this->form_validation->set_message('valid_pricing_group', 'Pricing group does not exist.');
            return false;
        }

        return true;
    }

同样,命名约定很重要。请注意,数组中使用的字段名称与错误消息和函数名称匹配。

有了这个,我们可以运行验证 - 但同样,必须来自控制器。

控制器:

if ($this->form_validation->run() === false) {
   var_dump($this->form_validation->error_array());
} else {
   // continue
}

这是最干净的&#39;可以在不扩展任何核心库的情况下使用该方法,或者解决该问题。在具有单独的api / web控制器的情况下,它确实需要跨控制器进行一些代码复制 - 但作为一个小的好处,您可以使用JSON期望的API字段名称,同时使用用户友好的&#39; Web控制器输出的字段名称。

希望将来可以帮助某人。