Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

31 13 0
Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ZEND FRAMEWORK 1.x Biên soạn: GV Bùi Quốc Huy – C.E.O/Founder QHOnline www.qhonline.edu.vn – www.qhonline.info Lưu hành nội Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Giáo trình: PHP Framework Project Training Xây dựng ứng dụng nhỏ với Zend 1.x A- Thiết lập, cấu hình cho blog: Để thực thi tốt cho việc cấu hình blog Ta sử dụng zend tool tự cấu hình theo hướng dẫn này: http://www.qhonline.info/zend-framework/73/zend-framework-huong-dan-cau-hinhung-dung-theo-mo-hinh-module.html Để tạo cấu trúc mặc định, sau ta thiết lập theo hướng mà ta mong muốn Lúc ứng dụng zf có cấu trúc hình sau: Như vậy, ta phải thiết lập ứng dụng theo mơ hình Mơ hình phân tách ứng dụng theo module admin default Đi kèm với module giao diện tương ứng Để có mơ hình ta phải cấu hình thiết lập sau Tại file index.php ta chỉnh lại: Co loi xay ra:
17/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Chú ý phương thức populate() zend form Đây điểm nhấn thư viện ZF Populate() làm công việc, giữ lại tham số mà người dùng vừa nhập liệu liệu chưa hợp lệ nên bị từ chối xử lý Trong trường hợp liệu hợp lệ Thì cơng việc cịn lại thêm người dùng vào CSDL phương thức adduser() model sau: function adduser($arr) { $data=array( "username" => $arr['username'], "password" => $arr['password'], "email" "level" => $arr['email'], => $arr['level'] ); $this->insert($data); } Sau đẩy người dùng indexAction để kết thúc thao tác xử lý Vậy code xử lý cho kiện sau: public function addAction(){ $form=new Admin_Form_User(); if($this->_request->isPost()){ $data= $this->_request->getParams(); $validate = new Admin_Form_Validator_CheckUser($data); if($validate->_report == true){ $this->view->error = $validate->_messages; $form->populate($data); } else{ $muser= new Admin_Model_DbTable_Muser(); $muser->adduser($data); $this->_redirect('/admin/user/index'); } } $this->view->form=$form; } Giao diện ứng dụng đây: 18/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy 2- Xây dựng trang quản lý thành viên: Sau thực thi công việc thêm thành viên thành cơng, việc cịn lại liệt kê thông tin người dùng IndexAction() để tiện lợi cho việc sửa, xóa, quản lý thơng tin thành viên Tại model Admin_Model_DbTable_User ta thiết lập phương thức listuser() với chức liệt kê tồn thơng tin thành viên function listuser() { return $this->fetchAll(); } Kế tiếp, ta tiến hành gọi model IndexAction() để đổ liệu view public function indexAction(){ $muser=new Admin_Model_DbTable_Muser(); $info=$muser->listuser()->toArray(); $this->view->info=$info; } Tại view index.phtml ta thiết lập sau: STT Username Level Edit Del Và kết ta nhận là: Kế tới, ta tiến hành phân trang cho ứng dụng quản lý thành viên Tại controller ta thiết lập thông số sau: public function indexAction() { $muser=new Admin_Model_DbTable_Muser(); $info=$muser->listuser()->toArray(); $paginator = Zend_Paginator::factory($info); $paginator->setItemCountPerPage(3); $paginator->setPageRange(3); $currentPage = $this->_request->getParam('page',1); $paginator->setCurrentPageNumber($currentPage); $this->view->info=$paginator; } + Dòng ta khởi tạo đối tượng zend_paginator + Dòng thứ ta thiết lập số record trang + Dòng thứ ta thiết lập khoảng cách hiển thị số trang + Dòng thứ ta thiết lập trang đầu tiên, mang giá trị + Dòng thứ ta đưa đối tượng thực thi + Và cuối ta đổ view Tại view index, việc ta đổ liệu từ model ra, ta cần hiển thị số trang, link cho next, pre,… Vậy, ta có đoạn code sau: Tiếp tục, thư mục view/user ta tạo file có tên pagination.phtml với nội dung: 3- Xây dựng trang sửa thành viên: Để sửa thành viên, ta phải qua hai giai đoạn + Một lẫy liệu từ CSDL đổ chúng vào form + Hai cập nhật liệu từ form vào CSDL Vậy edit action ta cần lấy id mà người dùng muốn sửa để lấy thông tin chi tiết từ CSDL đưa chúng vào form Kế tiếp ta kiểm tra xem người dùng nhấn nút submit chưa ? Nếu chưa, ta đổ liệu từ CSDL form thông qua phương thức populate() Vậy code editAction là: public function editAction() { $id = $this->_request->getParam('userid'); $form=new Admin_Form_User(); $muser=new Admin_Model_DbTable_Muser(); if(!$this->_request->ispost()){ $data=$muser->getuser($id)->toArray(); $form->populate($data); 21/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy } else{ //Thực thi người dùng nhập liệu xong } $this->view->form=$form; } Tại Model Muser.php ta thêm phương thức getuser() để thực thao tác lấy liệu từ CSDL function getuser($id) { $data=$this->select()->where("id = ?",$id); return $this->fetchRow($data); } Tiếp theo, xử lý người dùng nhập liệu form Để làm việc này, ta cần lấy thơng tin từ mà người dùng nhập liệu Và xây dựng lớp validation dành cho việc sửa thành viên Với lớp validation update này, yêu cầu người dùng phải nhập mật khẩu, Vì họ muốn khơng muốn chỉnh sửa mật Ngồi ra, cần tính tới trường hợp người sử dụng muốn sửa lại tên truy cập tồn CSDL Lúc này, ta cần sửa lại phương thức checkuser Muser.php Khi người dùng muốn sửa user tức tồn id mà họ mong muốn sửa Sử dụng ID ta so sánh q trình kiểm tra thơng tin user điều kiện where id != $id Vậy tồn điều kiện where người dùng muốn sửa user Khi người dùng muốn thêm user tức không tồn id Vậy việc thêm vào cần kiểm tra điều kiện where username mà Đoạn code xử lý tình sau file Muser.php : function checkuser($user,$id="") { if($id != "") { $data=$this->select()->where("username = ?",$user)>where("id != ?",$id); } else{ $data=$this->select()->where("username = ?",$user); } $row=$this->fetchRow($data); if($row) return true; else return false; } 22/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Vậy file valid cho người dùng sửa thành viên (forms/validator/updateuser.php): Co loi xay ra:
Vậy Muser.php ta thiết lập phương thức edituser() sau để hồn tất tiến trình cập nhật thơng tin người sử dụng function edituser($arr) { $data=array( "username" => $arr["username"], "email" => $arr["email"], 23/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy "level" => $arr["level"], ); if($arr["password"] != ""){ $data["password"] = $arr["password"]; } $where="id =".$arr["userid"]; $this->update($data,$where); } Như vậy, trường hợp người dùng muốn sửa mật khẩu, chúng có thêm giá trị mảng password Nếu khác rỗng ta cập nhật chúng vào mảng, không ta bỏ qua trường mật Cuối editAction() sau: public function editAction() { $id = $this->_request->getParam('userid'); $form=new Admin_Form_User(); $muser=new Admin_Model_DbTable_Muser(); if(!$this->_request->ispost()){ $data=$muser->getuser($id)->toArray(); $form->populate($data); } else{ $data=$this->_request->getParams(); $valid=new Admin_Form_Validator_UpdateUser($data); if($valid->_report == true){ $form->populate($data); $this->view->error=$valid->_messages; } else{ $muser->edituser($data); $this->_redirect("admin/user/index"); } } $this->view->form=$form; } Sau cập nhật hoàn tất, ta chuyển người dùng tới action index để liệt kê thông tin người truy cập Và hoàn tất nhiệm vụ cập nhật thông tin người sử dụng ZF 4- Xây dựng trang xóa thành viên: 24/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Để xây dựng trang xóa thành viên, ta cần xây dựng delAction() Và phương thức deluser() Model để thực thi chức xóa thành viên Vậy ta xây dựng phương thức deluser() Model sau: function deluser($id) { $where="id = $id"; $this->delete($where); } Tiếp tục delAction() ta nhận id muốn xóa tiến hành gọi phương thức xóa để hồn tất việc xóa thành viên Đồng thời đẩy người dùng trở lại với action index thông qua phương thức _redirect() Do delAction() làm cơng việc xóa thành viên di chuyển họ trở indexAction, nên không cần tạo view Lúc ta cần sử dụng helper để quy ước không cần view cho action $this->_helper->viewRenderer->setNoRender(true); Và cuối nội dung delAction() public function delAction() { $id = $this->_request->getParam('userid'); $Muser= new Admin_Model_DbTable_Muser; $Muser->deluser($id); $this->_redirect('/admin/user/index'); $this->_helper->viewRenderer->setNoRender(true); } 5- Xây dựng chức đăng nhập, đăng xuất hệ thống: Để tiến tới xây dựng trang đăng nhập hệ thống ta sử dụng thư viện Zend_Auth ZF Thư viện hỗ trợ việc thiết lập sử dụng chức q trình chứng thực người dùng Để kích hoạt Zend_Auth ta cần thiết lập Zend_session file bootstrap.php chính: protected function _initSession(){ Zend_Session::start(); } Tiếp tục, Model Muser Ta lại thiết lập phương thức checklogin() Cơng việc phương thức sử dụng lớp Zend_Auth để chứng thực xem người dùng nhập thông tin username password có với CSDL hay khơng 25/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Trước hết, ta cần kiểm tra xem người dùng có nhập liệu hay khơng ? Nếu có ta tiếp tục khởi tạo Zend_Registry Cơng việc thư viện chúng lấy thông tin kết nối CSDL phương thức _initDB() mà ta cấu hình bootstrap.php function checklogin($data) { if($data['username'] != NULL && $data['password'] != NULL) { $registry = Zend_Registry::getInstance (); $DB = Zend_Registry::get ( 'DB' ); } } Sau đó, ta lại khởi tạo đối tượng Zend_Auth với tham số biến kết nối, tên bảng, tên cột username, tên cột password Tiếp theo dòng màu vàng Dịng làm cơng việc thêm điều kiện cho phép có level Kế tới ta truyền tham số username password từ form nhập liệu người dùng vào để so sánh với thông tin CSDL function checklogin($data) { if($data['username'] != NULL && $data['password'] != NULL) { $flag = false; $registry = Zend_Registry::getInstance (); $DB = Zend_Registry::get ( 'DB' ); $authAdapter = new Zend_Auth_Adapter_DbTable ( $DB, 'user', 'username', 'password'); $authAdapter->getDbSelect()->where("level = '2'"); $authAdapter->setIdentity ($data['username'] ); $authAdapter->setCredential ( $data['password'] ); $auth = Zend_Auth::getInstance (); $result = $auth->authenticate ( $authAdapter ); } } Nếu trình kiểm tra hồn tất chúng hồn tồn hợp lệ việc cịn lại đưa giá trị cột vào session Dĩ nhiên với password khơng nên đưa vào session (lưu ý ta khơng cần thiết lập session thân zend_auth thay ta làm việc rồi) function checklogin($data) { if($data['username'] != NULL && $data['password'] != NULL) { $flag = false; $registry = Zend_Registry::getInstance (); $DB = Zend_Registry::get ( 'DB' ); $authAdapter = new Zend_Auth_Adapter_DbTable ( $DB, 'user', 'username', 'password', ' level = 2' ); $authAdapter->setIdentity ($data['username'] ); $authAdapter->setCredential ( $data['password'] ); $auth = Zend_Auth::getInstance (); $result = $auth->authenticate ( $authAdapter ); 26/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy if ($result->isValid ()) { $data_sess = $authAdapter->getResultRowObject ( null, 'password' ); $auth->getStorage()->write($data_sess); return true; } else{ return false; } } } Sau cùng, hàm checklogin trả giá trị true false Nếu kết chứng thực hoàn tất ta trả true Ngược lại false Tại loginAction() ta thiết lập sau: public function loginAction() { $muser= new Admin_Model_DbTable_Muser(); if($this->_request->ispost()) { $data=$this->_request->getParams(); if($muser->checklogin($data)== true) { $this->_redirect("/admin/user/index"); } else{ $err="Wrong username or password"; $this->view->error=$err; } } } Nhiệm vụ action load nội dung Model Muser Nếu người dùng có nhấn submit lấy tham số đưa chúng vào biến $data Cuối ta gọi phương thức checklogin() để kiểm tra Nếu chúng hợp lệ, ta đưa người dùng trang hiển thị thông tin, ngược lại ta báo lỗi trả kết view Vậy Login.phtml (view) ta thiết lập sau:

Username: Password:

27/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Kế tới, ta cần tạo khống chế người sử dụng truy cập Có nghĩa kiểm sốt người truy cập chưa đăng nhập khơng thể truy cập vào controller action module admin Cách giải tốt class chủ đạo: QHO_Controller_Action ta thêm đoạn code kiểm tra session Nếu người dùng truy cập vào controller action khác mà chưa đăng nhập họ tự động đẩy tới Action Cụ thể sau: $data1=$this->_request->getParams(); $this->view->placeholder('Login')->login = false; $auth = Zend_Auth::getInstance(); if($auth->getIdentity()){ $this->view->placeholder('Login')->login = true; } else{ if($data1['controller'] != 'user' || $data1['action'] !='login'){ $this->_redirect('/admin/user/login/'); } } Quá trình hiểu giản đơn sau: + Đầu tiên ta lấy tất tham số từ phía người dùng (module nào, controller nào, action nào) + Kế tới ta sử dụng biến placeholder tên Login gán chúng mặc định false + Khởi tạo đối tượng Zend_Auth + Kiểm tra xem có tồn tham số session Zend_Auth hay khơng ? + Nếu có gán biến placeholder true + Nếu không ta kiểm tra xem controller họ truy cập liệu có khác user action mà họ truy cập có khác login hay không Nếu chúng khác ta đẩy họ tới trang login để thực thi việc đăng nhập vào hệ thống Như vậy, code diễn tiến ta có kết sau: Chú ý rằng, phần xử lý Ta sử dụng biến placeholder tên Login nhiều Việc sử dụng biến thực chất sử dụng để khống chế layout Vì 28/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy sử dụng hình rõ ràng người chưa đăng nhập thấy menu, layout thơng tin nhạy cảm trang admin Vì ta cần dùng biến placeholder để kiểm tra layout Lúc ta có code triển khai sau layout.phtml module admin Vậy biến placeholder Login có giá trị true (tức người dùng đăng nhập) ta gán layout hiển thị bao gôm top, left, bottom Như người thấy Ngược lại, ta show form login mà Nhưng, vấn đề mà gặp phải trang người dùng phải kiểm tra ? Vì ta viết QHO_Controller_Action có nghĩa gọi module default admin Do đó, hồn tồn khơng tối ưu triển khai chúng module 29/31 Giáo trình: PHP Framework Giảng viên:Bùi Quốc Huy Lúc này, ta cần tách thêm class thực nhiệm vụ giao cho module tương ứng Cụ thể module admin ta có class riêng dành cho như: QHO_Controller_Admin, dĩ nhiên class kế thừa từ tảng class QHO_Controller_Action chúng thừa hưởng đặc tính mà Action vốn có Vậy library/QHO/Controller/ ta tạo thêm file admin.php với nội dung mà ta đề cập Và nhớ để kế thừa hàm init() action.php ta cần phải khai báo từ khóa parent Vậy code tương đương sau:

Ngày đăng: 19/10/2021, 22:17

Hình ảnh liên quan

A- Thiết lập, cấu hình cho blog: - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

hi.

ết lập, cấu hình cho blog: Xem tại trang 2 của tài liệu.
Phần in đậm và có màu đỏ là phần ta dùng để cấu hình ứng dụng theo mô hình multi module. - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

h.

ần in đậm và có màu đỏ là phần ta dùng để cấu hình ứng dụng theo mô hình multi module Xem tại trang 3 của tài liệu.
Ở thời điểm này, để cấu hình multi layout cho module admin và default chúng ta phải chỉnh  sửa  và  viết  trực  tiếp  ở  phương  thứcinit()  giống  với  cách  chúng  ta  khai  báo  trước đây - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

th.

ời điểm này, để cấu hình multi layout cho module admin và default chúng ta phải chỉnh sửa và viết trực tiếp ở phương thứcinit() giống với cách chúng ta khai báo trước đây Xem tại trang 4 của tài liệu.
Xây dựng bảng user như sau: CREATE TABLE`user`( - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

y.

dựng bảng user như sau: CREATE TABLE`user`( Xem tại trang 13 của tài liệu.
) ENGINE=MyISAM; Và thêm 2 user như sau: - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

y.

ISAM; Và thêm 2 user như sau: Xem tại trang 13 của tài liệu.
Trong ZF, nếu chúng ta tương tác dữ liệu trên 1 bảng riêng biệt thì nên đưa chúng vào thư mục DbTable - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

rong.

ZF, nếu chúng ta tương tác dữ liệu trên 1 bảng riêng biệt thì nên đưa chúng vào thư mục DbTable Xem tại trang 17 của tài liệu.
nếu sử dụng như hình trên thì rõ ràng người chưa đăng nhập cũng có thể thấy cả menu, layout và những thông tin nhạy cảm trong trang admin - Giáo trình: PHP FrameworkProject Training Xây dựng ứng dụng nhỏ với Zend 1.x.C.E.O BÙI QUỐC HUY

n.

ếu sử dụng như hình trên thì rõ ràng người chưa đăng nhập cũng có thể thấy cả menu, layout và những thông tin nhạy cảm trong trang admin Xem tại trang 29 của tài liệu.

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan