[KOHANA] Bài 9 - Lập trình chức năng đăng nhập với kohana (Model- View- Controller)

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:

PHP Code:
<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:

 

PHP Code:
<?php defined('SYSPATH') or die('No direct script access.');
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