Tiếp theo phần 1, phần 2 này sẽ hướng dẫn phần login vào trang quản trị admin và thay đổi layout các file trong template. Trong phần login không có chức năng nhớ mật khẩu, và sẽ sử dụng cách login mà CakePHP hỗ trợ $this->Auth->loggedIn() .

1. Đầu tiên quay lại file /app/View/Users/admin_login.ctp: chúng ta thay đổi các html trong file này bằng HtmlHelper mà CakePHP hỗ trợ, cách sử dụng thì xem các bài trước nhá

Thay đổi form trong file thành(chỉ thay thành phần trong form html thui nhá):

<?php echo $this->Session->flash();?>
 <?php echo $this->Form->create();?>
 <fieldset>
 <div class="form-group">
 <?php echo $this->Form->input('username',array('class'=>"form-control", "placeholder"=>"Username", "autofocus"));?>
 </div>
 <div class="form-group">
 <?php echo $this->Form->input('password', array('type'=>'password',"class"=>"form-control", "placeholder"=>"Password"));?>
 </div>
 </fieldset>
 <?php echo $this->Form->button('Login',array('class'=>'btn btn-success'));?>

Sau khi đổi chạy lại url nó cũng chẳng thay đổi gì so với lúc chưa đổi đâu (^^): nói vậy chứ nếu xem phần tử html sẽ có thay đổi rồi. Bây giờ thử nhấn chữ Login luôn xem thế nào, nếu các bạn tải hoặc làm theo hướng dẫn bài 22 sẽ có lỗi Call to a member function login() on a non-object nghĩa là nó thiếu khai báo Auth của CakePHP, chúng ta sẽ tiến hành khai báo Components này trong file /app/Controller/AppController.php để có thể sử dụng ở tất cả các controller khác khi cần thiết.

class AppController extends Controller {
 public $components = array(
 'Session',
 'Auth'
 );
}

sao khi AppController ở trên chạy url lại sẽ không còn lỗi trên nữa. Trong file admin_login.ctp có đoạn <?php echo $this->Session->flash();?> việc này cũng giống như để hiển thị lỗi trong session được tạo ra từ controller, vì thế ta khai báo thêm Components session trong AppController.php nhá.

Giờ chúng ta sẽ tạo một Dashboard để hiển thị view sau khi đăng nhập thành công:

– Tạo một controller /app/Controller/DashboardsController.php, một view /app/View/Dashboards/admin_index.ctp rồi copy nội dung html trong thẻ body của file /app/webroot/template_admin/pages/index.html rối dán vào nó vào file admin_index.ctp.

– Tiếp theo ta thay đổi file AppController.php như sau:


class AppController extends Controller {
public $components = array(
'Session',
'Auth'=>array(
'authenticate' => array(
'Blowfish' => array(
'userModel' => 'User',
)
),
'loginAction' => array('admin'=>true, 'controller'=>'users', 'action'=>'login'),
'loginRedirect' => array('admin'=>true, 'controller'=>'dashboards', 'action'=>'index'),
'logoutRedirect' => array('admin'=>true, 'controller'=>'users', 'action'=>'login'),
'authError' => 'You can not access that page',
'authorize' => array('Controller')
)
);
public function beforeFilter(){
if($this->params['prefix'] == "admin"){
if($this->Auth->loggedIn()){
$this->Auth->allow();
}
}else{
$this->Auth->allow();
}
$this->set('current_user', $this->Auth->user());
}
}

Phía trên là cách sử dụng Auth của CakePHP để đăng nhập, mặc định khi sử dụng Auth nó sẽ chặn tất cả các trang không cho sử dụng và cứ chạy vào trang đăng nhập nếu không login. Sau khi đăng nhập thành công sẽ tự động chuyển đến trang admin/dashboards/index, nếu logout sẽ chuyển lại về trang đăng nhập. Phần trong function beforeFilter() là để kiểm tra nếu truy cập là trang admin thì phải đăng nhập mới cho truy cập, nếu không phải trang admin thì vẫn cho truy cập bình thường. Phần cuối có đoạn $this->set(‘current_user’, $this->Auth->user()); nghĩa là sẽ lấy toàn bộ thông tin user sau khi đăng nhập gán vào biến current_user và ta có thể sử dụng nó bất cứ đâu trong các view html

Tiếp theo sửa lại file /app/Controller/UsersController.php


<?php
class UsersController extends AppController
{
var $uses = array('User');
var $layout = "admin";
public function beforeFilter(){
parent::beforeFilter();
}

public function admin_login(){
if($this->request->is('post')){
if($this->Auth->login()){
return $this->redirect($this->Auth->redirectUrl());
}else{
$this->Session->setFlash('Username hoặc pass sai');
}
}
}

public function admin_logout(){
$this->redirect($this->Auth->logout());
}
}

Bây giờ test lại bằng cách chạy các url sau:

  • http://doctruyen.local/admin, tiến hành đăng nhập bằng user: nongdanit, pass: 123456, nó sẽ tự động chạy vào http://doctruyen.local/admin/dashboards, và hiển thị nội dung giống file /app/webroot/template_admin/pages/index.html.
  • Logout ra trực tiếp bằng url này http://doctruyen.local/admin/users/logout
  • Và chạy thêm url http://doctruyen.local, sẽ ra page mặc định của CakePHP

Quay lại file /app/View/Elements/admin/navigate.ctp đã tạo ở trên chúng ta sẽ lấy nội dung html trong thẻ <nav>…</nav> ở file /app/View/Dashboards/admin_index.ctp cắt qua và sử dụng <?php echo $this->element(‘admin/navigate’)?> thay thế, từ đây khi chúng ta cần thay đổi gì trong menu bên trái sẽ vào file navigate.ctp này chỉnh sửa là được. Nội dung dài nên mình không để trên đây, các bạn tải file về sẽ có.

Chỉnh sửa navigate.ctp cho phù hợp:

Có rất nhiều menu trong file này chúng ta không cần sử dụng nên mình sẽ ẩn hoặc xoá nó đi cho đở rối mắt. Kết quả như sau:

Dashboard

Phần 2 chỉ tới đây thui, các bạn có thể download lại source code bên dưới, phần 3 sẽ là hiển thị danh sách, add, edit, del user và một phần thay đổi layout mặc định của cakephp ngoài front-end.

Cập nhật:

Mời cập nhật thêm phần kiểm tra nếu tồn tại session khi chưa logout, mà truy cập trang login sẽ tự động chuyển qua trang dashboard.


public function admin_login(){
if($this->Auth->user()){
return $this->redirect($this->Auth->redirectUrl());
}
if($this->request->is('post')){
if($this->Auth->login()){
return $this->redirect($this->Auth->redirectUrl());
}else{
$this->Session->setFlash('Username hoặc pass sai');
}
}
}

Kết luận

  1. Nếu có thắc mắc gì các bạn để lại comment bên dưới mình sẽ trả lời sớm nhất có thể.
  2. Cảm ơn các bạn đã đọc.

Nongdanit.info
[Cakephp] Bài 23 – Toàn tập website truyện tranh phần 2
Tagged on: