wyg27 发表于 2011-1-8 06:14:31

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 翻遍了,虽然看到几个人遇到同样的问题,但也都没有得到十分明确的解答,不知道这里有没有朋友有这方面的经验?

期待答复。

代码就不贴了,因为为此我特意单独书写过极为简单的测试用例,有信心不是代码方面的问题。

Hex 发表于 2011-1-8 09:49:41

我经过测试,确定表单验证类是没问题的,配置文件是有效的。

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

或者请贴出你的代码。

davidx 发表于 2011-1-8 09:59:34

这个有一定要顶

wyg27 发表于 2011-1-9 02:30:46

回复 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.

Hex 发表于 2011-1-10 00:59:49

呵呵,你这个确实见鬼了。。。我也是这么写的,经过测试确实是没问题 -_-
我怀疑是不是你的 MY_Controller 中有什么特别的东西?
我直接用的 Controller,没问题,你也可以试试,或者把 MY_Controller 中的代码贴出来,大家分析下,呵呵

PS: 可以尝试重新下载一个 1.7.3 覆盖下。

wyg27 发表于 2011-1-11 00:55:23

回复 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');
        }
}

Hex 发表于 2011-1-11 01:06:01

MY_Controller 中的 parent::__construct(); 错了。
应该是 parent::Controller();

记住,CI 是 PHP4 的,不会用 PHP5 的语法,建议仔细看手册。

wyg27 发表于 2011-1-11 23:19:50

本帖最后由 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');
                }
        }       
}

Hex 发表于 2011-1-12 13:47:28

如果你的依旧不能,那就是你的服务器等的问题了。
因为我这里按照手册的例子是完全正常的,我亲自测试的。

至于你说的 PHP5 的问题,是这样的:
因为你要调用 Controller 的构造函数,而为什么是parent:Controller();而不是parent::__construct();呢?原因就是 Controller 的构造函数是前者而不是后者,这个和 PHP 版本无关,如果 Controller 的构造函数写成了 abc,那就要 parent:abc(); 就是这个道理。当然了,构造函数只有两种,不会出现 abc,举例而已,呵呵

wyg27 发表于 2011-1-12 22:21:58

回复 9# Hex

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

谢谢 Hex 多天来的解答和关注。
页: [1] 2
查看完整版本: CI 中的 form_validation 规则单独以 $config 文件保存后验证失灵