Qua các bài trước chúng ta đã tìm hiểu qua về View, controller, Model với những cách kết nối cơ sở dữ liệu. có một số ví dụ cơ bản về thêm xóa sửa rồi. cơ bản như vậy là tạm ổn. Bây giờ bắt tay vào một ứng dụng thôi. Ứng dụng nào đầu tiên cũng phải có user đăng ký, đăng nhập. Đăng ký thật chất là thêm vào CSDL, đăng nhập là truy vấn kiểm tra cơ sở dữ liệu. Để bắt đầu ứng dụng Kohana với MVC ta thực hiện chức năng đăng nhập.
Giả sử có cơ sở dữ liệu rồi ở bài trước http://www.mediafire.com/download/had5t7yhyyj7lry/tintuc_db.sql
tạo cơ sở dữ liệu theo file trên
Cài đặt kohana và test xem hoạt động chưa nhé xem bài 1 . và sao đó vào modules\database\config chép database.php vào thư mục application\config rồi điều chỉnh cấu hình phù hợp để kohana kết nối được với CSDL nhé.
Cấu hình trong bootstrap.php để thử mục controller của user trong thư mục user
Route::set('user', '<directory>(/<controller>(/<action>(/<id>)(/<key>)))', array(
'directory' => 'user'
))
->defaults(array(
'controller' => 'user',
'action' => 'index',
));
Bây giờ chuẩn ta chuẩn bị một form đăng nhập, ừ thì kiếm một giao diện đăng nhập... ở đây tôi lấy 1 template để sau này ai đưa giao diện thì mình thực hiện cũng tương tự. link down cho giao diện đây http://www.mediafire.com/?m7984klxmk4xvx7
xem như đã chuẩn bị tương đối giờ lập trình thôi.
chep code của template giao diện đăng nhập vào trong application\views sau đó đổi tên tập tin chính phần đăng nhập thành login.php
xem như cơ bản xong phần VIEW
bay giờ tạo controller để liên kết đến view thử thế nào
vào trong application\classes\Controller\ tạo thư mục user sau đó tạo tập tin cho controller là login.php trong thư mục này với nội dung
<?php defined('SYSPATH') OR die('No Direct Script Access');
Class Controller_User_Login extends Controller
{
public function action_index() {
$vlogin = View::factory('login');
$this->response->body($vlogin);
} }
lúc này gõ
http://localhost/kohana/user/login giao diện đã hiện lên, tuy nhiên đường dẫn của CSS cũng như hình ảnh có khác biệt nên cần điều chỉnh
vì trong kohana đường dẫn được rewrite lại rồi vì thế cần phải đưa đường dẫn lại. để tổng quát. tạo một thư mục ở ngoài cùng chứa tất cả những gì liên quan đến giao diện như CSS, javascript..... ở đây tôi tạo thư mục contents, sau đó vào phần giao diện đăng nhập ở trên chép các thư mục CSS, JS vào trong thư mục contents. Bây giờ thì đưa đường dẫn tuyệt đối thông qua URL::base(); sẳn của kohana đã cấu hình trong bootstrap.
như vậy vào trong code giao diện login.php tìm dòng
<link type="text/css" rel="stylesheet" href=./css/id_main.css">
sửa thành
<link type="text/css" rel="stylesheet" href="<?php echo URL::base(); ?>contents/css/id_main.css">
tìm
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/jquery.autocomplete.pack.js"></script>
<script type="text/javascript" src="./js/css_browser_selector.js"></script>
<script type="text/javascript" src="./js/jquery.tinyTips.js"></script>
<script type="text/javascript" src="./js/user_register.js"></script>
Sửa thành
<script type="text/javascript" src="href="<?php echo URL::base(); ?>contents/js/jquery.min.js"></script>
<script type="text/javascript" src="href="<?php echo URL::base(); ?>contents/js/jquery.autocomplete.pack.js"></script>
<script type="text/javascript" src="href="<?php echo URL::base(); ?>contents/css_browser_selector.js"></script>
<script type="text/javascript" src="href="<?php echo URL::base(); ?>contents/js/jquery.tinyTips.js"></script>
<script type="text/javascript" src="href="<?php echo URL::base(); ?>contents/js/user_register.js"></script>
Thử lại xem http://localhost/kohana/user/login tốt chứ
Bây giờ tạo model login trong thư mục application\classes\Model như sau
<?php defined('SYSPATH') OR die('No Direct Script Access');
Class Model_Login extends Model
{
//hàm kiểm tra sự tồn tại trong CSDL
public function check_exist($form) {
$query = DB::select()->from('users')->where('username', '=', $form['txtuname'])->and_where('password', '=', MD5($form['txtupass']));
$result = $query->execute();
if($result->count() > 0){
return ($result->as_array());
}else{
return 0;
}
}
//hàm này kiểm tra sự hợp lệ nhập vào của giá trị nhập
public function validate_user($arr) {
$kq= Validation::factory($arr)//trước 3.x là Validate
->rule('txtuname', 'not_empty')
->rule('txtupass', 'not_empty');
return $kq;
}
}
vậy là có 2 phương thức kiểm tra sự tồn tại và tính hợp lệ rồi. bây giờ tiếp tục điều chỉnh controller login.php
Ở trên tôi chỉ mởi tạo controller để chạy thử giao diện thôi giờ phải bổ sung thêm những hàm kiểm tra lấy từ model như sau
<?php defined('SYSPATH') OR die('No Direct Script Access');
Class Controller_User_Login extends Controller
{
public function action_index() {
$mlogin = Model::factory('login');
$vlogin = View::factory('login')
->bind('validator', $validator)
->bind('errors', $errors);
if ($this->request->method() == HTTP_Request::POST) { // lấy từ giao diện đến
$validator = $mlogin->validate_user(arr::extract($_POST,array('txtuname','txtupass')));
if ($validator->check()) {
// kiểm tra việc nhập trên form có hợp lệ hay không
$form = $validator->as_array();// Đưa form về dạng mảng
$ch_e=$mlogin->check_exist($form);
//gọi phương thức của model để kiểm tra sự tồn tại của username/pass trong CSDL
if ($ch_e!=0){// nếu tồn tại thì đăng ký biến session cho các thao tác sau
Session::instance()->set('uname' ,$ch_e[0]['username']);
Session::instance()->set('uid' ,$ch_e[0]['user_id']);
$this->redirect('user/'); //rồi chuyển về trang chủ của user
}else{// nếu không tồn tại trong CSDL thì báo lỗi và đăng ký biến lỗi để hiện thông báo
$error[] = 'Tài khoản hoặc mật khẩu không đúng.';
Session::instance()->set('errors' ,$error);
$this->redirect('user/login');// quay về trang đăng nhập
}
} else {
//validation failed, get errors
$errors = $validator->errors('errors');
}
}
$this->response->body($vlogin);
}
}
như vậy là đã cơ bản hoàn thành các thao tác. Giờ chi còn điều chỉnh phần giao diện
để hiện thông báo lỗi nhập liệu thì vào trong view điều chỉnh như sau
để hiển thị thông báo lỗi khi nhập thiếu tên người sử dụng thì tìm dòng
<input type="text" name="txtuname" id="txtuname" value="" class="login-textfield" placeholder="người sử dụng">
thay bằng
<input type="text" name="txtuname" id="txtuname" value="" class="login-textfield" placeholder="<?php if (isset($errors)): if (isset ($errors['txtuname'])){echo $errors['txtuname']; }else { } else: echo "người sử dụng"; endif?> ">
để hiển thị thông báo lỗi khi nhập thiếu password tìm dòng
<input type="password" name="txtupass" id="password" value="" class="login-textfield" placeholder="mật khẩu">
thay bằng
<input type="password" name="txtupass" id="password" value="" class="login-textfield" placeholder="<?php if (isset($errors)): if (isset ($errors['txtupass'])){echo $errors['txtupass']; }else { } else: echo "mật khẩu"; endif?>">
Như vậy cơ bản đã xong...
chỉ còn khi thành công sau khi dăng ký thì chuyển về trang chủ của phần user ở đây tôi không thiết kế giao diện của user mà chỉ hiện kết quả cuối cùng nên tôi thiết kế đơn giản như sau
trang index.php
VIEWS:
Trong thư mục user các bạn tạo một tập tin là index.php
Cấu trúc:
- views
--- index.php
Với nội dung như sau:
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
Xin chào, <?php echo Session::instance()->get('uname');?> | <a href="<?php echo url::site('user/logout');?>">Thoát ra</a></p>
</body>
</html>
CONTROLLER:
[/B] Tạo tập tin index.php trong thư mục user vừa tạo.
Cấu trúc:
-- classes
--- controller
---- user
----- index.php
Với nội dung:
class Controller_User_index extends Controller{ public function action_index(){
$vlogin = View::factory('login') ->bind('title', "chao mừng đến trang user");
if(!Session::instance()->get('user')){// Kiểm tra sự tồn tại của $_SESSION['user']
$this->redirect('user/login'); }
$this->response->body($vlogin);
} }
rồi đã hoàn thành, test đi nhé các bạn.... Bài này tôi chỉ hướng cho các bạn tiếp cận được cách viết với giao diện
Bài tiếp theo tôi sẽ nói đến việc dùng module Auth của Kohana để làm đăng nhập
còn tiếp
Submitted by hoaiphan on Thu, 08/29/2013 - 23:19 Permalink
Code tham khảo
Đây là link code thử nghiệm các bạn tham khảo
http://www.mediafire.com/?4n6k30mg53auhc2