EDIT2:向下滚动查看最新信息!
在CodeIgniter 3中,我最近将所有控制器的回调规则移至application/libraries/MY_Form_validation.php
以防止代码重复等,并进行清理。
现在,它们似乎不再起作用了。
MY_Form_validation.php就像这样开始:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Form_validation extends CI_Form_validation
{
public $CI;
function run($module = '', $group = '')
{
log_message('debug',"Now running the MY_Form_validation");
(is_object($module)) AND $this->CI = &$module;
return parent::run($group);
}
然后是一个完整的回调函数列表,全部定义为public function callback_name(){}
。
我还有一个(在同一个类中)检查提供的用户登录信息是否正确(因此,如果用户可以登录等),但表单验证无法找到规则。
错误日志如下所示:
INFO - 2016-06-23 13:33:18 --> Form Validation Class Initialized
DEBUG - 2016-06-23 13:33:18 --> Now running the MY_Form_validation
INFO - 2016-06-23 13:33:18 --> Language file loaded: language/english/form_validation_lang.php
DEBUG - 2016-06-23 13:33:18 --> Unable to find callback validation rule: check_database
第一个DEBUG消息表明已加载MY_Form_validation
(因为它使用了覆盖的run()
方法,因此调试日志记录),但它无法找到下面明确定义的回调函数。 / p>
我还包含语言文件application/language/english/form_validation_lang.php
,其中包含以下行:
$lang['form_validation_check_database'] = 'The password does not match the username. Try again.';
,它正确捕获(即在执行表单验证时显示此消息),但它本身无法找到回调函数。
编辑:我检查了方法是否未正确继承:
public function __construct($rules = array())
{
$this->CI =& get_instance();
var_dump(get_class_methods($this));
var_dump()
会输出正确的完整数组方法,包括我自己的自定义回调和内置方法。
EDIT2:
我阅读了system/libraries/Form_validation.php
并调查了调试消息的发生位置,可以在此代码示例中看到(第734-749行):
// Call the function that corresponds to the rule
if ($callback OR $callable !== FALSE)
{
if ($callback)
{
if ( ! method_exists($this->CI, $rule))
{
log_message('debug', 'Unable to find callback validation rule: '.$rule);
$result = FALSE;
}
else
{
// Run the function and grab the result
$result = $this->CI->$rule($postdata, $param);
}
}
似乎只在主CI对象中查找回调,而不是在表单验证库本身中查找。我可以添加一些可以选择库回调的hacky异常,但我怀疑这是最好的事情,我想我忽略了一些简单的事情......
如果需要任何其他信息,请告知我们。
答案 0 :(得分:0)
好吧,我发现了......
显然,只要将回调函数移动到MY_Form_validation.php,它们实际上就是内置验证规则,并且不再充当回调。
设置表单规则时,我仍然应用了回调_ 前缀,这使得Form_validation库在普通CI
对象(即控制器)中查找规则而不是(MY_)Form_validation类。
我的修复是简单地从应用的验证规则设置中删除此前缀。现在它发现'回调'功能正确。
答案 1 :(得分:0)
请尝试这个
<?php
class Form extends CI_Controller {
public function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
public function username_check($str)
{
if ($str == 'test')
{
$this->form_validation->set_message('username_check', 'The {field} field can not be the word "test"');
return FALSE;
}
else
{
return TRUE;
}
}
}
?>