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

[视图] 表单自动填充的问题

[复制链接]
发表于 2009-12-12 14:50:03 | 显示全部楼层 |阅读模式
本帖最后由 ares333 于 2009-12-12 14:51 编辑

如下是用于登陆验证的简单代码,位于admin/start控制器
PHP复制代码
    function login(){
        $this->load->view('admin/login',$data);
    }
 
    function assess(){
        if($_POST['username']=='ares' && $_POST['password']=='123'){
            redirect('admin/main');
        }else{
            $this->login();
        }
    }
复制代码

login视图关键代码
HTML复制代码
<?php echo form_open('admin/start/assess',array('name'=>'myform'));?>
<input name="username" class="editbox4" value="<?php echo set_value('username');?>" size="20">
<input class="editbox4" type="password" size="20" name="password">
<?php echo form_close();?>
复制代码


访问http://localhost/admin/start/login 填写正确的用户名和错误的密码,显然不会进入admin/main控制器,返回了登录界面,而且用户名被自动填上了,这说明CI能够自动填充表单(<?php echo set_value('username');?>)。但是有一个比较不爽的问题,浏览器的地址栏变成了http://localhost/admin/start/assess,很不爽,我想解决的就是这个地址问题

改进如上代码,只修改了assess()方法
PHP复制代码
    function assess(){
        if($_POST['username']=='ares' && $_POST['password']=='123'){
            redirect('admin/main');
        }else{
            redirect('admin/login');
        }
    }
复制代码

再次填写正确的用户名和错误的密码,浏览器地址栏变成了理想的http://localhost/admin/start/login,但是CI的自动填充功能失效了,也就是说用户名那个输入框是空的。

有没有办法使表单能够自动填充,而且浏览器地址栏显示http://localhost/admin/start/login ???
发表于 2009-12-12 15:20:32 | 显示全部楼层
那你只能自己填充表单了,因为 redirect 以后是另外一个请求了,这只能通过 session 存储两个请求之间的数据。当然,你可以改进一下验证类。
一般来说,我建议用 redirect,这样可以避免重复提交的问题。
 楼主| 发表于 2009-12-12 16:54:04 | 显示全部楼层
本帖最后由 ares333 于 2010-3-6 09:16 编辑

首先谢谢你的及时回复,我又考虑了一下,session存储太麻烦,首先要修改index.php,添加session_start()一行,而且也不清楚如果加载了CI原生类库SESSION会不会起冲突,因为我开发后台用的CI原生SEESION。
后来我又考虑了一下,感觉搞代码时间长了容易反映迟钝,吧上面的代码又修改了一下就OK了。
表单自动填充是有前提的,前提就是装载表单视图的控制器函数必须能够接收此表单的$_POST数据,个人感觉。

PHP复制代码
    function login(){
        if($this->assess($_POST['username'],$_POST['password']))
               redirect('admin/main');
        $this->load->view('admin/login',$data);
    }
 
    function assess($name='',$pass=''){
        if($name=='ares' && $pass=='123'){
            return TRUE;
        }else{
            return FALSE;
        }
    }
复制代码

当然这只是原理代码,省去了从数据库读取管理员信息和设置session信息等步骤。

本版积分规则