我正在运行以下表单验证;
$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
”之类的内容,则可以正常使用。
答案 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控制器输出的字段名称。
希望将来可以帮助某人。