【问题标题】:CI3 - form_validation callback broken?CI3 - form_validation 回调坏了?
【发布时间】:2018-04-13 11:57:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在您的application/config/autoload.php 文件中设置$autoload['helper'] = array('security');。这可能会有所帮助。
  • @pradeep :这是一个 API 调用。所有其他表单元素都可以通过它正常工作。
  • @Virb :添加了它 - 不幸的是,没有区别。
  • 试试callback_pricing_group[pricing_group] 和你的输入框[pricing_group]一样
  • 试过了,还是不行。

标签: php codeigniter codeigniter-3


【解决方案1】:

在通过 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 回调的嵌套数组。未能嵌套此数组并包含字段名称将导致上述“找不到错误消息”问题。

定价模式:

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
}

这是可用的“最干净”的方法,无需扩展任何核心库或解决问题。在拥有单独的 api/web 控制器的情况下,它确实需要跨控制器进行一些代码重复 - 但作为一个小好处,您可以为 API 使用 JSON 预期的字段名称,同时使用“用户友好”字段名称进行输出你的网络控制器。

希望这对将来的人有所帮助。

【讨论】:

  • 这有帮助。我的问题是在模型中验证。我将 CB 功能移至 Controller。下一个问题是将函数设置为私有。更正了这两个项目,宇宙中一切正常。
【解决方案2】:

您好,在回调之前尝试使用“trim”,并获取分配为 null 的参数,如下所示。因为您没有验证“必需”。所以这可能是从回调返回 null 的原因。还将字段名称作为回调函数中的参数传递

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

【讨论】:

  • 参数中的字段名不是必须的
  • 与包含 trim|required etc 规则集没有区别。
【解决方案3】:

我已经在我的项目中测试了以下代码,并且运行良好。立即尝试,我 100% 确定它会起作用。

请确保subclass_prefixapplication/config/config.php 中。应该

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

遵循自定义验证功能。

如果您已经更改了 subclass_prefix 值。例如ABC_,那么你的验证文件应该是ABC_Form_validation.php in 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());
            }
        }
    }
}

application/config/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;
        }
    }
}

【讨论】:

  • 试过这个。不幸的是,没有区别。
  • @Eoghan,请检查我更新的答案,我相信它对你有用。我已经在我的项目中进行了测试。 :)
猜你喜欢
  • 2020-02-19
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多