CI 中的 form_validation 规则单独以 $config 文件保存后验证失灵
本帖最后由 wyg27 于 2011-1-12 22:22 编辑Hi,
我目前在使用 CI 1.7.3,在使用 CI 提供的表单验证功能时遇到这样一个问题:如果我把所有的过滤规则都以默认的形式写在 controller 中时,表单验证工作正常。但当我想让代码整洁一些,并按照官方 guide 中的说明将验证规则保存在 $config 数组中并以独立文件 form_validation.php 的形式保存在 application/config/ 子目录下之后,表单验证就失灵了,表单在 submit 后没有任何反应。
为了这个问题我把 CI 的英文 BBS 翻遍了,虽然看到几个人遇到同样的问题,但也都没有得到十分明确的解答,不知道这里有没有朋友有这方面的经验?
期待答复。
代码就不贴了,因为为此我特意单独书写过极为简单的测试用例,有信心不是代码方面的问题。 我经过测试,确定表单验证类是没问题的,配置文件是有效的。
特别的,请检查你的 config/form_validation.php 是否有加 <?php 标记,我发现有很多人不写这个,导致出现的问题。
或者请贴出你的代码。 这个有一定要顶 回复 2# Hex
感谢 Hex 的帮助,以下是我的代码,为了测试,很简单。
首先给出将 rules 写在 controller 中的情景。
view 部分,文件名:test_form.php
<body>
<div id="erro-msg"><?php echo validation_errors(); ?></div>
<form action="<?php echo site_url('test/form');?>" method="post">
<input type="text" name="name" value="" />
<button type="submit">确定</button>
</form>
</body>
controller 部分,文件名:test.php
class Test extends MY_Controller {
function __construct() {
parent::__construct();
}
function form() {
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$config = array(
array(
'field' => 'name',
'label' => '姓名',
'rules' => 'required'
)
);
$this->form_validation->set_rules($config);
if ($this->form_validation->run() == FALSE) {
$this->load->view('test_form');
} else {
$this->load->view('formsuccess');
}
}
}
以上代码经测试准确无误。
接下来给出将 rules 写在独立文件 form_validation.php 内,并存放于 application/config/ 文件夹内的情景。
这里是 form_validation.php 文件(确认没有忘记“<?php”标记。
<?php
$config = array(
array(
'field' => 'name',
'label' => '姓名',
'rules' => 'required'
)
);
/* End of file 'form_validation.php' */
然后是修改后的 controller 部分
class Test extends MY_Controller {
function __construct() {
parent::__construct();
}
function form() {
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE) {
$this->load->view('test_form');
} else {
$this->load->view('formsuccess');
}
}
}
至于 view 部分没有变化,不再重复。
至此,按照 guide 的说法就是“Your validation rule file will be loaded automatically and used when you call the run() function.”,但是我运行时没有任何反应。而且这是最基本的写法,即便我进一步创建 sets of rules 或者 controller/method 的形式也依旧如此。不知是我哪里书写有误或者马虎了,请 Hex 指点。
Thanks. 呵呵,你这个确实见鬼了。。。我也是这么写的,经过测试确实是没问题 -_-
我怀疑是不是你的 MY_Controller 中有什么特别的东西?
我直接用的 Controller,没问题,你也可以试试,或者把 MY_Controller 中的代码贴出来,大家分析下,呵呵
PS: 可以尝试重新下载一个 1.7.3 覆盖下。 回复 5# Hex
好的,我的 MY_Controller 很简单,只是为了方便而加入了一些可以“全局”使用的东西,很丑陋。
请 Hex 检查。Thanks!
class MY_Controller extends Controller {
public $QX_SITENAME = ''; //站点名称
public $M_ID = FALSE; //当前登录用户 id,并依靠其来判断用户是否登录
public $NICKNAME = FALSE; //当前登录用户 nickname
protected function __construct() {
parent::__construct();
$this->M_ID = $this->session->userdata('m_id');
$this->NICKNAME = $this->session->userdata('nickname');
/* 初始化站点运行时常用的配置参数 */
$this->QX_SITENAME = $this->config->item('site_name');
}
}
MY_Controller 中的 parent::__construct(); 错了。
应该是 parent::Controller();
记住,CI 是 PHP4 的,不会用 PHP5 的语法,建议仔细看手册。 本帖最后由 wyg27 于 2011-1-11 23:27 编辑
回复 7# Hex
……我迷茫了。
首先一个问题是,如果是我使用 PHP5 语法的问题,那么为什么我程序中大量使用的 private, public, protected等关键词来定义变量和函数,以及我在每个 class 的构造函数中都是用了 __construct() 这种形式,可是程序都运行正常,而单单只有这个 form validation 不行。而且,我依照您的建议,将我的 MY_Controller 修改后,依旧不能用……
protected function MY_Controller() {
parent::Controller();
$this->M_ID = $this->session->userdata('m_id');
$this->NICKNAME = $this->session->userdata('nickname');
/* 初始化站点运行时常用的配置参数 */
$this->QX_SITENAME = $this->config->item('site_name');
}
同时,我还测试了将测试用 Controller“Test”重新按 PHP4 的方式书写,依旧没有反应。
class Test extends Controller {
function Test() {
parent::Controller();
}
function form() {
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE) {
$this->load->view('test_form');
} else {
$this->load->view('formsuccess');
}
}
}
如果你的依旧不能,那就是你的服务器等的问题了。
因为我这里按照手册的例子是完全正常的,我亲自测试的。
至于你说的 PHP5 的问题,是这样的:
因为你要调用 Controller 的构造函数,而为什么是parent:Controller();而不是parent::__construct();呢?原因就是 Controller 的构造函数是前者而不是后者,这个和 PHP 版本无关,如果 Controller 的构造函数写成了 abc,那就要 parent:abc(); 就是这个道理。当然了,构造函数只有两种,不会出现 abc,举例而已,呵呵 回复 9# Hex
好的,暂时我对这个问题也没有办法了,现在只是把 rules 写在自定义 config 文件中,然后通过 $this->config->item() 的形式导入后再应用。好在不影响别的,期待 CI 的更新吧。
谢谢 Hex 多天来的解答和关注。
页:
[1]
2