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

[中级] CodeIgniter 和 Doctrine 从零开始 第四天 用户登录 上

[复制链接]
发表于 2010-1-26 09:04:21 | 显示全部楼层 |阅读模式
CodeIgniter Doctrine 从零开始第四天:用户登录

我们按以下步骤建立一个用户登录系统:

l
建立登录表单视图和登录控制器

l
学习一些URL helpers

l
改变默认控制器

l
进行用户认证

l
学习单例模式,并用它改善我们的代码设计

l
学习Sessions library

l
进行用户登出

无标题.png 登录表单视图

我们首先创建登录表单视图 system/application/views/login_form.php

<!DOCTYPE html>

<html lang="en">

<head>


<meta http-equiv="Content-Type" content="text/html; charset=utf-8">


<title>Login Form</title>


<link rel="stylesheet" href="<?php echo base_url(); ?>css/style.css"


type="text/css" media="all">

</head>

<body>

<div id="signup_form">


<p class="heading">User Login</p>


<?php echo form_open('login/submit'); ?>


<?php echo validation_errors('<p class="error">','</p>'); ?>


<p>


<label for="username">Username: </label>


<?php echo form_input('username',set_value('username')); ?>


</p>


<p>


<label for="password">Password: </label>


<?php echo form_password('password'); ?>


</p>


<p>


<?php echo form_submit('submit','Login'); ?>


</p>


<?php echo form_close(); ?>


<p>


<?php echo anchor('signup','Create an Account'); ?>


</p>

</div>

</body>

</html>

Anchor()建立一个链接。<?php echo anchor('signup','Create an Account'); ?> 返回:<a href="http://localhost/ci_doctrine/signup">Create an Account</a>样式链接

编辑样式表,让表单更好看。编辑 css/style.css

body {


font-family: "Trebuchet MS",Arial;


font-size: 14px;


background-color: #212426;


color: #11151E;

}

a {


color: #FFF;

}

a:hover {


color: #B9AA81;

}

/* ... */

红色部分为添加部分。

编辑:system/application/views/signup_form.php

表单下面添加:


<p>


<?php echo anchor('login','Login Form'); ?>


</p>

也就是添加了一个链接到login控制器,但是这个控制器还没有建立,下面我们建立它

Login Controller

建立system/application/controllers/login.php

<?php

class Login extends Controller {


public function __construct() {


parent::Controller();


$this->load->helper(array('form','url'));


$this->load->library('form_validation');


}


public function index() {


$this->load->view('login_form');


}


public function submit() {


if ($this->_submit_validate() === FALSE) {


$this->index();


return;


}

         
redirect('/');


}


private function _submit_validate() {


}

}

除了红色部分,其它和上次的signup controller类似。

Redirect()

他是URL helper的一个函数,作用是转到指定的控制器。这里我们给了‘/,就是转到home page 也就是 默认控制器。所以,这里会跳转到 http://localhost/ci_doctrine/

测试登录控制器和视图

访问:http://localhost/ci_doctrine/login


现在,点击 Create an Account
你会看到我们以前的Signup 表单页面


无标题.png

工作正常!

默认控制器

当用户没有输入控制器名称,会调用默认的控制器。现在我们输入:http://localhost/ci_doctrine/ 你会看到:



无标题.png

因为codeigniter的默认控制器为welcome。这里我们需要的默认控制器名为home

建立:system/application/controllers/home.php

<?php

class Home extends Controller {


public function index() {


echo "Home Sweet Home!";


}

}

Routes File 路由文件

编辑system/application/config/routes.php

改变下面的值:

// ...

$route['default_controller'] = "home";

$route['scaffolding_trigger'] = "";

// ...

Ok,现在访问 http://localhost/ci_doctrine/ 你会看到访问了我们的home控制器,显示: Home Sweet Home

用户登录鉴定

现在我们给程序添加用户登录鉴定的功能。首先,我会告诉你一个简单也是常见的处理方式,过后,我会提供一个更好的方法。

表单身份验证

编辑: system/application/controllers/login.php

<?php

class Login extends Controller {


public function __construct() {


parent::Controller();


$this->load->helper(array('form','url'));


$this->load->library('form_validation');


}


public function index() {


$this->load->view('login_form');


}


public function submit() {


if ($this->_submit_validate() === FALSE) {


$this->index();


return;


}


redirect('/');


}

         private function _submit_validate() {

                   $this->form_validation->set_rules('username', 'Username','trim|required|callback_authenticate');


$this->form_validation->set_rules('password', 'Password','trim|required');

                   $this->form_validation->set_message('authenticate','Invalid login. Please try again.');


return $this->form_validation->run();


}


public function authenticate() {


//
username取得User对象


if ($u = Doctrine::getTable('User')->findOneByUsername($this->input->post('username'))) {


//
建立对象,为变异(加密)password


$u_input = new User();


$u_input->password = $this->input->post('password');


//
密码匹配 (比较加密的 passwords)


if ($u->password == $u_input->password) {


unset($u_input);


return TRUE;


}


unset($u_input);//
注销这个为加密password而生的对象,防止意外保存到数据库里


}


return FALSE;


}

}

红色部分是更新过的。先给_submit_validate()函数,增加了一条规则(绿色部分)。这次用了Callback规则(callback_authenticate

),格式是:callback_[function_name]

第二回绿色部分,是callback_authenticate验证失败后返回的用户自定义错误信息。

Authenticate 函数是回调(callback)函数,如果一切正常,返回真,否则返回假。

测试表单

首先,建立一个新的用户 http://localhost/ci_doctrine/signup

现在访问,http://localhost/ci_doctrine/login 输入错误登录信息,你会看到:





如果输入正确的信息,你会转到 home page,看到 Home Sweet Home!我们的登录表单可以使用了。

1

1

2

2

3

3

4

4
发表于 2010-1-26 23:51:38 | 显示全部楼层
这个贴的排版太乱了点吧?
 楼主| 发表于 2010-1-27 09:09:57 | 显示全部楼层
回复 2# tmnh168


    是的,排版不好。而且发帖有字数限制。所以感触把1-8章的都打包提供下载了。还可以自己编辑。
发表于 2010-1-27 10:54:33 | 显示全部楼层
我有时间把这些逐渐整理到论坛上。
发表于 2010-2-8 08:37:40 | 显示全部楼层
很久没看见这种帖子了~顶!
发表于 2010-7-15 11:21:29 | 显示全部楼层
看后有点混乱
发表于 2010-9-13 13:42:47 | 显示全部楼层
登录状态怎么保存,怎么没有写完整?
发表于 2011-5-23 20:25:09 | 显示全部楼层
参考一下,多谢LZ!

本版积分规则