用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6832|回复: 13
收起左侧

[已解决] CI 中的 form_validation 规则单独以 $config 文件保存后验证失灵

[复制链接]
发表于 2011-1-8 06:14:31 | 显示全部楼层 |阅读模式
本帖最后由 wyg27 于 2011-1-12 22:22 编辑

Hi,

我目前在使用 CI 1.7.3,在使用 CI 提供的表单验证功能时遇到这样一个问题:如果我把所有的过滤规则都以默认的形式写在 controller 中时,表单验证工作正常。但当我想让代码整洁一些,并按照官方 guide 中的说明将验证规则保存在 $config 数组中并以独立文件 form_validation.php 的形式保存在 application/config/ 子目录下之后,表单验证就失灵了,表单在 submit 后没有任何反应。

为了这个问题我把 CI 的英文 BBS 翻遍了,虽然看到几个人遇到同样的问题,但也都没有得到十分明确的解答,不知道这里有没有朋友有这方面的经验?

期待答复。

代码就不贴了,因为为此我特意单独书写过极为简单的测试用例,有信心不是代码方面的问题。
发表于 2011-1-8 09:49:41 | 显示全部楼层
我经过测试,确定表单验证类是没问题的,配置文件是有效的。

特别的,请检查你的 config/form_validation.php 是否有加 <?php 标记,我发现有很多人不写这个,导致出现的问题。

或者请贴出你的代码。
发表于 2011-1-8 09:59:34 | 显示全部楼层
这个有一定要顶
 楼主| 发表于 2011-1-9 02:30:46 | 显示全部楼层
回复 2# Hex

感谢 Hex 的帮助,以下是我的代码,为了测试,很简单。

首先给出将 rules 写在 controller 中的情景。

view 部分,文件名:test_form.php
HTML复制代码
 
<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

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复制代码
 
<?php
$config = array(
                 array(
                       'field'   => 'name',
                       'label'   => '姓名',
                       'rules'   => 'required'
                       )
                                );
 
/* End of file 'form_validation.php' */
 
复制代码


然后是修改后的 controller 部分
PHP复制代码
 
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.
发表于 2011-1-10 00:59:49 | 显示全部楼层
呵呵,你这个确实见鬼了。。。我也是这么写的,经过测试确实是没问题 -_-
我怀疑是不是你的 MY_Controller 中有什么特别的东西?
我直接用的 Controller,没问题,你也可以试试,或者把 MY_Controller 中的代码贴出来,大家分析下,呵呵

PS: 可以尝试重新下载一个 1.7.3 覆盖下。
 楼主| 发表于 2011-1-11 00:55:23 | 显示全部楼层
回复 5# Hex

好的,我的 MY_Controller 很简单,只是为了方便而加入了一些可以“全局”使用的东西,很丑陋。

请 Hex 检查。Thanks!

PHP复制代码
 
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');
        }
}
 
复制代码
发表于 2011-1-11 01:06:01 | 显示全部楼层
MY_Controller 中的 parent::__construct(); 错了。
应该是 parent::Controller();

记住,CI 是 PHP4 的,不会用 PHP5 的语法,建议仔细看手册。
 楼主| 发表于 2011-1-11 23:19:50 | 显示全部楼层
本帖最后由 wyg27 于 2011-1-11 23:27 编辑

回复 7# Hex

……我迷茫了。

首先一个问题是,如果是我使用 PHP5 语法的问题,那么为什么我程序中大量使用的 private, public, protected  等关键词来定义变量和函数,以及我在每个 class 的构造函数中都是用了 __construct() 这种形式,可是程序都运行正常,而单单只有这个 form validation 不行。而且,我依照您的建议,将我的 MY_Controller 修改后,依旧不能用……

PHP复制代码
 
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 的方式书写,依旧没有反应。
PHP复制代码
 
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');
                }
        }      
}
 
复制代码
发表于 2011-1-12 13:47:28 | 显示全部楼层
如果你的依旧不能,那就是你的服务器等的问题了。
因为我这里按照手册的例子是完全正常的,我亲自测试的。

至于你说的 PHP5 的问题,是这样的:
因为你要调用 Controller 的构造函数,而为什么是
PHP复制代码
parent:Controller();
复制代码
而不是
PHP复制代码
parent::__construct();
复制代码
呢?原因就是 Controller 的构造函数是前者而不是后者,这个和 PHP 版本无关,如果 Controller 的构造函数写成了 abc,那就要
PHP复制代码
parent:abc();
复制代码
就是这个道理。当然了,构造函数只有两种,不会出现 abc,举例而已,呵呵
 楼主| 发表于 2011-1-12 22:21:58 | 显示全部楼层
回复 9# Hex

好的,暂时我对这个问题也没有办法了,现在只是把 rules 写在自定义 config 文件中,然后通过 $this->config->item() 的形式导入后再应用。好在不影响别的,期待 CI 的更新吧。

谢谢 Hex 多天来的解答和关注。

本版积分规则