Tuy nhiên, nhu cầu của con người khôngngừng tăng lên, chúng ta luôn cần những điều mới mẻ, từ thực tế đó yêu cầu cáccông ty thiết kế web không dừng lại ở việc lập trình web bằng PHP tuần
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP HCM
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG MÁY TÍNH VÀ TRUYỀN THÔNG
TRẦN MẠNH PHI - 0851120056
HỒ THANH BÌNH - 0851120005
XÂY DỰNG WEBSITE CHÙA THẠNH LÂM TRÊN NỀN ZEND FRAMEWORK
KHÓA LUẬN TỐT NGHIỆP KỸ SƯ CNTT
GIÁO VIÊN HƯỚNG DẪN
NIÊN KHÓA 2008 - 2012
Trang 2NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
Trang 3
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
Trang 4
Đặc biệt chân thành bày tỏ lòng cảm ơn sâu sắc đến thầy Thạc Sĩ Đặng NhânCách là người đã tận tình hướng dẫn và giúp đỡ chúng tôi thực hiện khóa luận này.Bên cạnh đó, chúng tôi xin cảm ơn gia đình và bạn bè đã luôn bên cạnh ủng hộ,giúp đỡ trong quá trình thực hiện khóa luận.
Sinh viên thực hiệnTrần Mạnh Phi
Hồ Thanh Bình
Trang 5Khoa Công Nghệ Thông Tin
Bộ môn mạng máy tính và truyền thông
ĐỀ CƯƠNG CHI TIẾT Tên đề tài: Xây dựng website chùa Thạnh Lâm trên nền Zend Framework
Giáo viên hướng dẫn: ThS Đặng Nhân Cách
Thời gian thực hiện: Từ 24/09/2012 đến 20/12/2012
Sinh viên thực hiện:
• Trần Mạnh Phi – 0851120056
• Hồ Thanh Bình – 0851120005
Loại đề tài:
• Tìm hiểu Zend Framework
• Xây dựng website chùa Thạnh Lâm
Nội Dung Đề Tài:
• Nghiên cứu công nghệ Zend Framework và các lĩnh vực khác liên quan đến lập trình thiết kế web
• Tìm hiểu cách thức hoạt động, quản lý của chùa Thạnh Lâm
• Vận dụng vấn đề đã nghiên cứu để xây dựng website chùa Thạnh Lâm
• Đưa website chùa Thạnh Lâm vào hoạt động thực tiễn
Phi, BìnhPhi, BìnhPhi
2 01/10/2012
07/10/2012
Chỉnh sửa, cắt ghép layoutSoạn thảo dàn ý lý thuyết
PhiBình
3 08/10/2012
17/10/2012
Phân tích và thiết kế CSDLSoạn thảo lý thuyết
PhiBình
Trang 6Phi, BìnhPhiBìnhPhi
SV Thực hiện
Trang 7MỤC LỤC
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI TP HCM 1
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN i
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN ii
LỜI CÁM ƠN iii
ĐỀ CƯƠNG CHI TIẾT iv
MỤC LỤC vi
DANH SÁCH CÁC BẢNG vii
DANH SÁCH CÁC HÌNH viii
DANH SÁCH CÁC CHỮ VIẾT TẮT, CHỮ TIẾNG ANH ix
MỞ ĐẦU xi
1.1.Gi i thi uớ ệ 1
1.2.M c tiêuụ 1
1.3.Ph m vi đ tàiạ ề 2
1.4.B c c báo cáoố ụ 2
2.1.C s d li u MySQLơ ở ữ ệ 3
2.2.Ngôn ng đánh d u siêu v n b n - HTMLữ ấ ă ả 3
2.3.Cascading Style Sheet – CSS 4
2.4.Ngôn ng l p trình PHPữ ậ 4
2.5.L p trình h ng đ i t ngậ ướ ố ượ 5
2.6.Zend Framework 7
2.6.1.Gi i thi uớ ệ 7
2.6.2.Mô hình MVC trong Zend Framework 8
2.6.3.C b n v các thành ph n trong Zend Frameworkơ ả ề ầ 9
2.6.4.Các l p c b n trong th vi n Zend Frameworkớ ơ ả ư ệ 11
2.6.5 u đi m và khuy t đi mƯ ể ế ể 33
3.1.Kh o sátả 35
3.2.Phân tích 36
3.3.L p trình và thi t kậ ế ế 37
3.3.1.Công c và ngôn ng s d ngụ ữ ử ụ 37
3.3.2.Thi t k c s d li uế ế ơ ở ữ ệ 38
3.3.3.S đ trang webơ ồ 47
4.1.Các ch c n ng c a trang webứ ă ủ 50
4.2.Các ng d ng trong trang webứ ụ 66
4.2.1 ng d ng công ngh Zend Framework vào trang webỨ ụ ệ 66
4.2.2.Các ng d ng khácứ ụ 67
5.1.Tóm t tắ 72
5.2.H ng phát tri nướ ể 72
TÀI LIỆU THAM KHẢO 74
Trang 8DANH SÁCH CÁC BẢNG
Trang 9DANH SÁCH CÁC HÌNH
Trang 10DANH SÁCH CÁC CHỮ VIẾT TẮT, CHỮ TIẾNG ANH
Các chữ viết tắt:
• AJAX (Asynchronous JavaScript And XML): Công nghệ tải một phần
nội dung website
• API (Application Programming Interface): Giao diện lập trình ứng dung.
• CMS (Content Management System): Hệ thống quản lý nội dung.
• CSS (Cascading Style Sheet): Ngôn ngữ trang trí website.
• DOM (Document Object Model): Là một mô hình cho phép truy xuất
đến các thành phần của một tài liệu có cấu trúc
• HTML (Hyper Text Markup Language): Ngôn ngữ đánh dấu siêu văn
bản
• JSON (JavaScript Object Notation)Là cú pháp để lưu trữ và trao đổi
thông tin văn bản
• LDAP (Lightweight Directory Access Protocol): Giao thức ứng dụng
truy cập các cấu trúc thư mục
• MVC (Model View Controller): Phương pháp chia nhỏ một ứng dụng
thành ba thành phần để cài đặt, mỗi thành phần đóng một vai trò khácnhau và ảnh hưởng lẫn nhau
• OOP (Object Oriented Programming): Lập trình hướng đối tượng.
• PDF (Portable Document Format): Là một loại định dạng tài liệu văn
bản di dộng
• PHP (Hypertext Preprocessor): Một ngôn ngữ lập trình website phổ
biến
• RSS (Really Simple Syndication): Một định dạng tập tin thuộc họ XML
dùng trong việc chia sẻ tin tức website
• SQL (Structured Query Language): Ngôn ngữ truy vấn cấu trúc cơ sở dữ
liệu
Trang 11• TCP/IP (Transmission Control Protocol/Internet Protocol): Tập hợp các
giao thức hỗ trợ việc lưu truyền trên mạng
• URL (Uniform Resource Locator): Địa chỉ liên kết trỏ đến đích của một
website
Các chữ tiếng Anh:
• Album: Bộ sưu tập, tập ảnh, tập nhạc, …
• Banner: Bảng giới thiệu ở vị trí đầu trang web.
• Captcha: Nhập văn bản như trong hình hiển thị để xác nhận.
• Footer: Phần dưới cùng của trang web.
• Menu: Thực đơn tùy chọn.
• Request: Yêu cầu.
• Username: Tên đăng nhập.
• Zoom: Phóng to, thu nhỏ một nội dung.
Trang 12MỞ ĐẦU
Khi công nghệ thông tin ra đời, con người có thể tiếp cận mọi thứ ở hầu hếtmọi nơi trên thế giới một cách dễ dàng Trong đó, website là một thành tựu nổi bậtgóp phần không nhỏ cho bước ngoặc này Tuy nhiên, nhu cầu của con người khôngngừng tăng lên, chúng ta luôn cần những điều mới mẻ, từ thực tế đó yêu cầu cáccông ty thiết kế web không dừng lại ở việc lập trình web bằng PHP tuần tự hay lậptrình hướng đối tượng, mà còn phải biết ứng dụng các công nghệ Framework hiệnđại, trong đó Zend Framework là một framework phổ biến được nhiều người dùngnhất do là một PHP Framework được chính công ty phát triển ngôn ngữ PHP pháttriển Chúng tôi chọn đồ án này, bên cạnh việc được trực tiếp trải nghiệm quá trìnhthiết kế web thì chúng tôi còn muốn nhiều người nhận thấy được những nét đẹp vànhững điều tốt đẹp mà Phật Giáo mang lại cho cuộc sống, đồng thời chúng tôi cũngmuốn thay mặt đảo Phú Quý-tỉnh Bình Thuận gửi một thông điệp đến khách dulịch: Phú Quý- một hòn đảo tuyệt đẹp và nhiều bí ẩn đang chờ du khách đến khámphá
Khóa luận không chỉ xoay quanh việc nghiên cứu một công nghệ duy nhất làZend Freamework, mà còn kết hợp thêm nhiều công nghệ hiện đại khác như: CSS3,nhúng các CMS và các thư viện mã nguồn AJAX, JQuerry,… vào website để mangđến cho website những diện mạo mới, nhiều tính năng mới hiện đại hơn và từ đó sẽthu hút nhiều người xem hơn
Trang 13CHƯƠNG 1: TỔNG QUAN 1.1 Giới thiệu
Hiện nay, thiết kế website đã trở nên khá phổ biến rộng rãi ở mọi nơi trên thếgiới, nên việc áp dụng các công nghệ mới là điều tất yếu cần phải có Nhu cầu thiết
kế web trên các framework với các thư viện được lập trình sẵn ngày càng cao dotính tiêu chuẩn hóa mã nguồn, tính thuận tiện và nhanh chóng,… Zend Framework
là một ví dụ điển hình, nó được chính công ty phát triển ngôn ngữ PHP(www.zend.com) phát triển với kho thư viện hỗ trợ ngày càng đầy đủ và phong phúluôn được cập nhật liên tục Hầu hết các nhà nghiên cứu và lập trình web đều biếtđến Zend Framework vì nó khá phổ biến Do Zend Framework là một dạng mãnguồn mở, nên thư viện của Zend Framework không chỉ được phát triển bởi các kỹ
sư lập trình web chuyên môn, mà còn được cộng đồng mạng đóng góp phát triển,nên Zend không ngừng phát triển và hoàn thiện
Tuy nhiên, do thư viện hỗ trợ khổng lồ, nên việc tìm hiểu và thích nghi vớiZend Framework là một điều khó khăn và tốn thời gian Vì thế, chúng tôi thực hiệnkhóa luận này nhằm trình bày các vấn đề cơ bản về Zend Framework, sau đó là cácphần mở rộng về Zend Framework cũng như các vấn đề khác liên quan đến lập trìnhthiết kế website Bên cạnh đó còn tạo một website thực tế cho chùa Thạnh Lâm đểứng dụng công nghệ Zend Framework
1.2 Mục tiêu
Khi tìm hiểu và ứng dụng Zend Framework, bên cạnh nắm vững phươngthức lập trình theo hướng đối tượng, chúng ta còn có thể biết được cách thức hoạtđộng của mô hình chuẩn MVC (Model-View-Controller) và sự thuận lợi mà các lớptrong thư viện Zend Framework hỗ trợ như việc tạo form, kiểm tra và sàn lọc dữliệu đầu vào, chứng thực và phân quyền người dùng, tích hợp các ứng dụng và dịch
vụ của các hãng thứ ba vào trong dự án,
Dựa vào lý thuyết đã tìm hiểu để ứng dụng vào xây dựng website chùaThạnh Lâm Khi xây dựng website, chúng ta sẽ biết được cách thức hoạt động vàquản lý thực tế cụ thể từ phía nhà chùa, cũng như nhu cầu từ phía người dùng Từ
Trang 14đó rút ra kinh nghiệm thực tế cho công việc lập trình thiết kế website sau này Đồngthời giới thiệu nét đẹp văn hóa Phật Giáo đến cho mọi người, nhằm đem lại cuộcsống an lành hạnh phúc Qua đó, hình ảnh đảo Phú Quý-tỉnh Bình Thuận cũng đượcquảng bá rộng rãi – một danh lam thắng cảnh đẹp của miền nam Việt Nam.
1.3 Phạm vi đề tài
Đề tài khóa luận không chỉ xoay quanh việc nghiên cứu một công nghệ duynhất là Zend Freamework, mà còn kết hợp thêm nhiều công nghệ hiện đại khác liênquan đến việc lập trình và thiết kế website như: công nghệ thiết kế CSS3 mới,nhúng các CMS và các thư viện mã nguồn AJAX, JQuerry, … vào website để mangđến cho website những diện mạo mới, nhiều tính năng mới hiện đại hơn và từ đó sẽthu hút nhiều người xem hơn
Áp dụng các lý thuyết đã nghiên cứu trong khóa luận để tạo một trang webhoạt động thực tiễn cho chùa Thạnh Lâm Để thực hiện được điều đó, chúng tôiphải tham khảo mô hình hoạt động, quản lý của các trang web nói chung và websitechùa nói riêng Nắm bắt được nhu cầu thực tế của người dùng để lập trình và thiết
kế trang web một cách hợp lý, tối ưu
1.4 Bố cục báo cáo
Khóa luận tập trung nghiên cứu các vấn đề sau:
Tìm hiểu công nghệ Zend Framework
• Giới thiệu về Zend Framework
• Mô hình MVC (Model-View-Controller) trong Zend Framework
• Các lớp cơ bản trong thư viện Zend Framework
• Ưu điểm và khuyết điểm của Zend Framework
Lập trình thiết kế website chùa Thạnh Lâm
• Khảo sát và phân tích hiện trạng thực tế
• Phân tích và thiết kế cơ sở dữ liệu cho website
• Ứng dụng Zend Framework và các công nghệ khác vào thiết kế vàlập trình web cho chùa Thạnh Lâm
• Hướng phát triển trong tương lai
Trang 15CHƯƠNG 2: CƠ SỞ LÝ THUYẾT
2.1 Cơ sở dữ liệu MySQL
MySQL là hệ quản trị cơ sở dữ liệu tự do nguồn mở phổ biến nhất thế giới
và được các nhà phát triển rất ưa chuộng trong quá trình phát triển ứng dụng VìMySQL là cơ sở dữ liệu tốc độ cao, ổn định và dễ sử dụng, có tính khả chuyển, hoạtđộng trên nhiều hệ điều hành cung cấp một hệ thống lớn các hàm tiện ích rấtmạnh.Với tốc độ và tính bảo mật cao, MySQL rất thích hợp cho các ứng dụng cótruy cập CSDL trên internet MySQL miễn phí hoàn toàn cho nên có thể tải vềMySQL từ trang chủ Nó có nhiều phiên bản cho các hệ điều hành khác nhau: phiênbản Win32 cho các hệ điều hành dòng Windows, Linux, Mac OS X, Unix,FreeBSD, NetBSD, Novell NetWare, SGI Irix, Solaris, SunOS,
MySQL là một trong những ví dụ rất cơ bản về Hệ Quản trị Cơ sở dữ liệuquan hệ sử dụng Ngôn ngữ truy vấn có cấu trúc (SQL)
MySQL được sử dụng cho việc bổ trợ PHP, Perl, và nhiều ngôn ngữ khác, nólàm nơi lưu trữ những thông tin trên các trang web viết bằng PHP hay Perl,
2.2 Ngôn ngữ đánh dấu siêu văn bản - HTML
HTML là dạng viết tắt của Hyper Text Markup Language (ngôn ngữ đánhdấu siêu văn bản) được biết đến là một loại ngôn ngữ dùng để mô tả hiển thị cáctrang web Nhiều người nhầm tưởng HTML là ngôn ngữ lập trình nhưng sự thựckhông phải như vậy, nó là một ngôn ngữ đánh dấu Một ngôn ngữ đánh dấu là một
Trang 162.3 Cascading Style Sheet – CSS
Cascading Style Sheets, hay còn gọi tắt là CSS, là những tập tin hỗ trợ chotrình duyệt web trong việc hiển thị một trang HTML Về cơ bản, các trang HTMLnhư bộ xương - khuôn khổ cơ bản của một trang web, trong khi các file CSS sẽ cụthể hóa các thành phần của một trang nên được hiển thị như thế nào CSS cho phépkiểm soát phông chữ, màu chữ, kiểu nền của một trang HTML
CSS đã giúp cho việc thay đổi phong cách của một trang web đơn giản hơn
và đỡ tốn thời gian hơn, có thể thực hiện sự thay đổi trên một mục nào đó và sau đó
áp dụng sự thay đổi này trên toàn bộ trang web thay vì phải thực hiện trên từng mụcriêng lẻ như trước đây
Thế mạnh của CSS:
• Tách riêng phần định dạng ra khỏi nội dung trang web
• CSS giúp người thiết kế kiểm soát toàn bộ giao diện trang web mộtcách nhanh nhất và hiệu quả nhất nên người thiết kế sẽ tiết kiệm đượcnhiều công sức
• Do được tách rời khỏi nội dung của trang web, nên các mã HTML sẽgọn gàng hơn, giúp người thiết kế thuận tiện hơn trong việc chỉnh sửagiao diện Kích thước của file html cũng được giảm đáng kể Hơn thếnữa sẽ được trình duyệt tải một lần và dùng nhiều lần (cache), do đógiúp trang web được load nhanh hơn
Trang 17dụng web, tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ học và thời gian xâydựng sản phẩm tương đối ngắn hơn so với các ngôn ngữ khác nên PHP đã nhanhchóng trở thành một ngôn ngữ lập trình web phổ biến nhất thế giới.
2.5 Lập trình hướng đối tượng
Lập trình hướng đối tượng (gọi tắt là OOP, từ chữ Anh ngữ object-orientedprogramming), hay còn gọi là lập trình định hướng đối tượng, là kĩ thuật lập trình
hỗ trợ công nghệ đối tượng OOP được xem là giúp tăng năng suất, đơn giản hóa độphức tạp khi bảo trì cũng như mở rộng phần mềm bằng cách cho phép lập trình viêntập trung vào các đối tượng phần mềm ở bậc cao hơn Ngoài ra, nhiều người còncho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn là cácphương pháp trước đó
Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ cácthao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà các yếu tốbên ngoài có thể tương tác với các chương trình đó giống như là tương tác với cácđối tượng vật lý
Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và dữ liệu
mà chúng được nhìn nhận như là một đơn vị duy nhất Mỗi đối tượng có một tênriêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến hành qua tên của nó.Như vậy, mỗi đối tượng có khả năng nhận vào các thông báo, xử lý dữ liệu (bêntrong của nó), và gửi ra hay trả lời đến các đối tượng khác hay đến môi trường
Các tính chất cơ bản:
• Tính trừu tượng (abstraction): Đây là khả năng của chương trình bỏqua hay không chú ý đến một số khía cạnh của thông tin mà nó đang
Trang 18trực tiếp làm việc lên, nghĩa là nó có khả năng tập trung vào nhữngcốt lõi cần thiết Mỗi đối tượng phục vụ như là một "động tử" có thểhoàn tất các công việc một cách nội bộ, báo cáo, thay đổi trạng tháicủa nó và liên lạc với các đối tượng khác mà không cần cho biết làmcách nào đối tượng tiến hành được các thao tác Tính chất này thườngđược gọi là sự trừu tượng của dữ liệu.
Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu có thể
có một số đặc điểm chung cho nhiều đối tượng khác như là sự mởrộng của nó nhưng bản thân đối tượng ban đầu này có thể không cócác biện pháp thi hành Tính trừu tượng này thường được xác địnhtrong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng
• Tính đóng gói (encapsulation) và che giấu thông tin (informationhiding): Tính chất này không cho phép người sử dụng các đối tượngthay đổi trạng thái nội tại của một đối tượng Chỉ có các phương thứcnội tại của đối tượng cho phép thay đổi trạng thái của nó Việc chophép môi trường bên ngoài tác động lên các dữ liệu nội tại của mộtđối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã.Đây là tính chất đảm bảo sự toàn vẹn của đối tượng
• Tính đa hình (polymorphism): Thể hiện thông qua việc gửi các thôngđiệp (message) Việc gửi các thông điệp này có thể so sánh như việcgọi các hàm bên trong của một đối tượng Các phương thức dùng trảlời cho một thông điệp sẽ tùy theo đối tượng mà thông điệp đó đượcgửi tới sẽ có phản ứng khác nhau Người lập trình có thể định nghĩamột đặc tính (chẳng hạn thông qua tên của các phương thức) cho mộtloạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một têngọi mà sự thi hành của mỗi đối tượng sẽ tự động xảy ra tương ứngtheo đặc tính của từng đối tượng mà không bị nhầm lẫn
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì
có một phương thức chung là "chu_vi" Khi gọi phương thức này thì
Trang 19nếu đối tượng là "hinh_vuong" nó sẽ tính theo công thức khác với khiđối tượng là "hinh_tron".
• Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng cóthể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa.Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn
có mà không phải tiến hành định nghĩa lại Tuy nhiên, không phảingôn ngữ định hướng đối tượng nào cũng có tính chất này
2.6 Zend Framework
2.6.1 Giới thiệu
Năm 2005, Andi Gutmans của Zend Technologies đã công bố Zend’s PHPCollaboration Project và giới thiệu Zend Framework Phiên bản 1.0 được phát hànhvào 7/2007 và các phiên bản mới được ra đời thường xuyên sau đó Phiên bản mớinhất hiện nay là Zend Framework 2.0
Zend Framework là một framework mã nguồn mở nhằm phát triển các ứng dụng
và dịch vụ web trên nền ngôn ngữ lập trình PHP Zend Framework là một PHPFramework được chính công ty phát triển ngôn ngữ PHP phát triển.Vì vậy sẽ không
có lý do nào mà Zend Framework sẽ bị biến mất trong tương lai trừ khi PHP khôngtồn tại nữa Những thành viên phát triển Zend Framework là những chuyên gia nổitiếng về mã nguồn mở và PHP trên thế giới
Zend Framework được triển khai bằng 100% mã hướng đối tượng nên có thể dễdàng thừa kế, nâng cấp các ứng dụng Zend Framework cung cấp một mô hìnhMVC mạnh mẽ với hiệu suất cao Cơ cấu thành phần của Zend Framework là đơnnhất, mỗi thành phần được thiết kế ít phụ thuộc vào các thành phần khác Kiến trúcnày cho phép các nhà phát triển dễ sử dụng các thành phần riêng lẻ Zend sử dụngnhững kiểu mẫu thiết kế (design pattern) hiện đại, hỗ trợ tối đa tính linh hoạt, khinghiên cứu và làm việc trên Zend Framework ta thu được rất nhiều kiến thức mới.Thư viện Zend rất đầy đủ, phong phú và chúng ta có thể tự phát triển thêm
Trang 202.6.2 Mô hình MVC trong Zend Framework
MVC (Model View Controller) là tên một phương pháp chia nhỏ một ứngdụng thành ba thành phần để cài đặt, mỗi thành phần đóng một vai trò khác nhau vàảnh hưởng lẫn nhau, đó là models, views, và controllers Mô hình MVC phát triểnnhằm mục tiêu giảm thiểu độ phức tạp của phần mềm, thuận tiện cho việc pháttriển, nâng cấp, phân rã các thành phần (module) đễ dễ dàng thay thế, thêm hoặcsửa chữa các thành phần này
Các thành phần trong mô hình MVC:
Trong kiến trúc này, hệ thống được chia thành 3 tầng tương ứng đúng với têngọi của nó (Model – View – Controller) Ở đó nhiệm vụ cụ thể của các tầng đượcphân chia như sau:
Hình 2 1: Mô hình kiến trúc MVC
• Controller (Tầng điều khiển): Là phần điều khiển của ứng dụng, điều hướngcác nhiệm vụ (task) đến đúng phương thức (method) có chức năng xử lýnhiệm vụ đó Nó chịu trách nhiệm xử lý các tác động về mặt giao diện, cácthao tác đối với models, và cuối cùng là chọn một hiển thị (view) thích hợp
để hiển thị ra màn hình
Trang 21• Model (Tầng dữ liệu): Là một đối tượng hoặc một tập hợp các đối tượng biểudiễn cho phần dữ liệu của chương trình Nó được giao nhiệm vụ cung cấp dữliệu cho cơ sở dữ liệu và lưu dữ liệu vào các kho chứa dữ liệu Tất cả cácnghiệp vụ logic được thực thi ở Model Dữ liệu vào từ người dùng sẽ thôngqua View đến Controller và được kiểm tra ở Model trước khi lưu vào cơ sở
dữ liệu Việc truy xuất, xác nhận, và lưu dữ liệu là một phần của Model
• View (Tầng giao diện): Là phần giao diện với người dùng, bao gồm việchiện dữ liệu ra màn hình, cung cấp các menu, nút bấm, hộp đối thoại, chọnlựa…, để người dùng có thể thêm, xóa sửa, tìm kiếm và làm các thao táckhác đối với dữ liệu trong hệ thống Thông thường, các thông tin cần hiển thịđược lấy từ thành phần models
Hình 2 2: Mô hình MVC trong Zend Framework
Tóm lại, chu trình hoạt động tổng quát của mô hình MVC như sau: Controllertiếp nhận yêu cầu từ phía người dùng, sau đó phân tích các yêu cầu đó để lấy dữliệu từ các Model, dữ liệu được trả về Controller để chuyển tới phần View để hiểnthị hồi đáp cho yêu cầu của người dùng
2.6.3 Cơ bản về các thành phần trong Zend Framework
Có thể chia các thành phần trong Zend Framework thành 6 nhóm chính:
Thành phần MVC: cung cấp đầy đủ các tính năng để xây dựng ứng dụngtheo mô hình MVC, tách phần hiển thị ra khỏi phần xử lý Bao gồm các lớpsau:
Trang 22• Zend_Layout, Zend_View, Zend_View_Helper, …
Thành phần xác nhận và truy cập: hỗ trợ người xây dựng web đảm bảo tính
an toàn, bảo mật, quản lý và phân quyền cho người dùng một cách nhanhchóng và đơn giản Bao gồm các lớp sau:
• Zend_Service
• Zend_Service_Amazon
• Zend_Service_Yahoo, …
Trang 23 Thành phần cốt lỗi: giúp tăng tốc website một cách đáng kể
về, nó sẽ chuyển các dữ liệu ra view để hiển thị ra màn hình
Các controller sẽ nằm trong thư mục controllers, controller mặc định khi vàomột trang web là IndexController
Tên tập tin controller được quy ước đặt tên như sau:
Chữ cái đầu tiên viết hoa + Controller.php
Ví dụ: ta có thành viên là một controller thì có tên file như sau:
ThanhvienController.phpMỗi controller là một lớp, tên lớp là tên controller và lớp này phải kế thừa lớpZend_Controller_Action, mỗi lớp có các Action là các hàm, trong đó có một hàmđặc biệt là hàm init() được tự động gọi khi ta gọi một Action trong controller.Action mặc định khi gọi một controller là indexAction()
Tên action được quy ước đặt tên như sau:
Tên action viết thường + Action()
Ví dụ:
class ThanhvienController extends Zend_Controller_Action {
public function init() {
…}
public function indexAction () {
…}
Trang 24Với mỗi controller chúng ta phải tạo một thư mục trong thư mục views,trong các thư mục của controller vừa tạo chứa các tệp *.phtml tương ứng với têncủa các action
2.6.4.2 Zend_View
Ứng với mỗi controller chúng ta phải tạo một thư mục trong thư mục views,trong các thư mục của controller vừa tạo chứa các tệp *.phtml tương ứng với têncủa các action
Ví dụ: views/scripts/thanhvien/index.phtml
Khi một action của controller được gọi, Zend sẽ vào thư mục mang têncontroller trong thư mục views và gọi tệp *.phtml mang tên action được gọi Tạiđây các dữ liệu truyền qua từ action sẽ được hiển thị ra màn hình qua tệp *.phtml
Cách thức truyền biến:
Trong action của controller Tại view tương ứng với action đó
$this->view->ten_bien = "giá trị"; echo $this->ten_bien;
echo "[$chiSo] - $giaTri <br>";
Bảng 2 1: Bảng cách thức truyền biến trong Zend Framework
Để gọi các tệp *.css và *.js, ta thêm các dòng lệnh sau trong hàm init():
Trang 26• Cách 1: thêm vào các mã lệnh sau trong hàm init() ở các controller:public function init() {
$option = array (
"layout" => "layouts", // tên file layout: *.phtml
"layoutPath" => APPLICATION_PATH "/modules/default/layouts/scripts" // đường dẫn chứa layout
Trang 27require("banner.php"); // chèn trang chứa banner vàorequire("menu.php"); // chèn trang chứa menu vàoecho $this->layout()->content;
require("footer.php"); // chèn trang chứa footer vào
Trước tiên ta phải thực hiện kết nối cơ sở dữ liệu bằng một trong hai cách sau:
• Cách 1: khai báo trong tệp application.ini
• Cách 2: bổ sung hàm sau vào tệp Bootstrap.php
protected function _initDB(){
$db = Zend_Db::factory(
'Pdo_Mysql',array(
'host' => 'localhost', 'username' => 'root',
Trang 28'password' => '', 'dbname' => 'sanpham', 'charset' => 'utf8'
));
• Tên bảng:
protected $_name = "TênBảng";
• Tên khóa chính
Nếu chỉ có một khóa chính
protected $_primary = "TênKhóaChính";
Nếu có nhiều hơn một khóa chính
protected $_primary = array('id_abc', 'id_cba');
Nếu khóa chính có thuộc tính “AUTO_INCREMENT”
protected $_sequence = true;
Ví dụ: chúng ta có bảng sanpham, với id_ sanpham là khóa chính, ta sẽ tạotệp sanpham.php với nội dung sau
Trang 29Khi làm việc với các framework, chúng ta sẽ làm quen với khái niệm “activerecord”, đó là các hàm dựng sẵn giúp ta dễ dàng thực hiện các câu truy vấn bằngviệc truyền vào các dữ liệu cần thiết mà không cần viết câu truy vấn Sau đây là cácactive record cơ bản:
Câu lệnh select:
Tạo một select: $se = $this->select();
Lệnh này tương đương với câu SQL: “select *”
Sau đó chúng ta sẽ sử dụng $se để thêm các thông số cho truy vấn:
• Câu lệnh from: $se->from(tênBảng, array(“trường1”, “trường2”));
• Câu lệnh where: $se->where(‘tênTrường biểuThức giáTrị’);
• Câu lệnh order: $se->order(‘tênTrường ACS|DESC’);
• Câu lệnh limit: $se->limit(‘sốDòngĐượcLấy’, ‘từDòngSố’);
• Lấy toàn bộ mảng dữ liệu trả về: $this->fetchAll($se)->toArray();
• Lấy dòng đầu tiên của dữ liệu: $this->fetchRow($se)->toArray();
• Khởi tạo đối tượng
$all= array(); //mảng dữ liệu cần phân trang
Trang 30$pa= Zend_Paginator::factory($all);
• Các thuộc tính hỗ trợ
Thuộc tính Chức năng
firstPageInRange Trang đầu tiên của nhóm đang hiển thị
curent Trang hiện hành
currentItemCount Số dòng trong trang hiện hành
lastItemNumber Số thứ tự dòng cuối cùng trong trang hiện hành
lastPageInRange Trang cuối cùng trong nhóm
pageCount Tổng số trang
pagesInRange Các trang trong nhóm
previous Trang trước trang hiện hành
totalItemCount Tổng số dòng
Bảng 2 2: Bảng các thuộc tính trong Zend_Paginator
Các thuộc tính này có tác dụng tại tệp tạo hiển thị điều khiển phân trang
• Các phương thức hỗ trợ
setCurrentPageNumber($page) Trang hiện hành
setItemCountPerPage Số dòng trong một trang
setPageRange Số trang hiển thị ở phần điều khiển
Bảng 2 3: Bảng các phương thức trong Zend_Paginator
• Tạo cache khi phân trang
Một nhược điểm của Zend_Paginator là nó mang theo toàn bộ dữ liệulấy ra để phân trang và mang từ trang này sang trang khác chứ không dùng từkhóa limit trong câu SQL, điều này làm cho website chạy chậm lại Tuynhiên chúng ta có thể cải thiện điều này bằng việc tạo cache cho các trang.Khi ghé thăm mỗi trang, trang đó sẽ được cache lại và mỗi lần ghé thăm sau
sẽ không phải tải lại trang đó
Sau đây là các hàm thông dụng trong việc cache:
setCacheEnable(false) enable hoặc disable cache
getCurrentItems() đưa trang hiện hành vào cache
getItemsByPage($page) cache một trang chỉ định
Trang 31clearPageItemCache($page) xóa cache cho một trang.
getPageItemCache() lấy dữ liệu cache ra
setItemCountPerPage($count
Bảng 2 4: Bảng các hàm hỗ trợ cache trong Zend_Paginator
2.6.4.6 Zend_Form
Để tạo ra một form, cách đơn giản nhất vẫn là tự gõ các thẻ HTML như thôngthường Tuy nhiên hầu hết các framework đều dựng sẵn các lớp hỗ trợ việc tạoform Về hình thức, các lớp tạo một form của các framework khá rườm rà Mặc dùvậy chúng có những lợi điểm riêng và những tính năng hỗ trợ thêm ngoài khả năngtạo form
Tạo Zend_Form:
Cú pháp: $form = new Zend_Form;
Đặt các thuộc tính cho form:
• Action: $form->setAction(“action của form”);
• Method: $form->setMethod(“POST|GET”);
• Attribute: $form->setAttrib(“tên thuộc tính”, “giá trị”);
Tạo các thẻ trong form:
Cú pháp: $form->CreateElement(“loạiĐốiTượng”, “tênĐốiTượng”, array(danhSáchThuộcTính));
Trong đó loại đối tượng là các giá trị: text, password, select, radio, checkbox, textarea, hidden, reset, image, button, submit,
Lợi ích khi dùng Zend_Form:
• Đổ dữ liệu tự động (populate): nếu người dùng đã có sẵn dữ liệu trong cơ
sở dữ liệu và có nhu cầu đổ vào form để chỉnh sửa, như thông thườngchúng ta phải tự động làm các thao tác này, sẽ khá vất vã nếu đối tượng
có nhiều thuộc tính Zend_Form cho hỗ trợ đổ dữ liệu vào các đối tượngtrong form tự động với điều kiện tên các đối tượng HTML phải trùng têncác trường tương ứng trong cơ sở dữ liệu
Trang 32• Kiểm tra dữ liệu (validate): zend cho phép kiểm tra dữ liệu đầu vào cóphù hợp với điều kiện đặt ra hay không Nếu không phù hợp sẽ hiệnthông báo lỗi.
• Lọc dữ liệu (filter): zend lọc dữ liệu đầu vào so với điều kiện trước khilưu vào cơ sở dữ liệu, nếu không phù hợp sẽ hiện thông báo lỗi
2.6.4.7 Zend_Validate
Zend_Validate cho phép kiểm tra dữ liệu đầu vào phổ biến cần thiết Nó có thểđược áp dụng cho nhiều đối tượng, và mỗi đối tượng có thể có nhiều validate Sauđây là các validate phổ biến:
$val= Zend_Validate_NotEmpty; Không được rỗng
$val= new Zend_Validate_Alnum; Chuỗi chỉ gồm chữ và số
Không có khoảng trắng trong chuỗi
$val= new Zend_Validate_Alnum(
array(“allowWhiteSpace”=>true));
Chuỗi chỉ gồm chữ và số
Ký tự khoảng trắng là hợp lệ
$val= new Zend_Validate_Alpha; Chuỗi chỉ gồm ký tự chữ
Không có khoảng trắng trong chuỗi
$val= new Zend_Validate_Alpha(
$val= new Zend_Validate_Digits; Giá trị là các số
$val= new Zend_Validate_EmailAddress; Email hợp lệ
Trang 33Bảng 2 5: Bảng chức năng của các validate
2.6.4.8 Zend_Filter
Zend_Filter cho phép lọc lại dữ liệu trước khi lưu vào cơ sở dữ liệu Cũnggiống như Zend_Validate, nó có thể được áp dụng cho nhiều đối tượng, và mỗi đốitượng có thể có nhiều filter Sau đây là các filter phổ biến:
$fil=new Zend_Filter_Alnum(); Chỉ lấy chữ và số
Không lấy khoảng trắng và ký tự đặc biệt
$fil=new Zend_Filter_Alnum(
array("allowWhiteSpace"=>true));
Chỉ lấy chữ và số, không lấy ký tự đặc biệtcho phép lấy khoảng trắng
$fil=new Zend_Filter_Alpha(); Chỉ lấy chữ
không lấy khoảng trắng và ký tự đặc biệt
$fil=new Zend_Filter_StringTrim; Lấy chuỗi và bỏ khoảng trống đầu cuối
$fil=new Zend_Filter_Digits(); Chỉ lấy số
$fil=new Zend_Filter_Int; Chỉ lấy số đầu tiên của chuỗi
$fil=new Zend_Filter_StripTags(); Bỏ toàn bộ thẻ XML và HTML
$fil=new Zend_Filter_StripTags(
array("allowTags"=>"a"));
Bỏ toàn bộ thẻ XML và HTML Ngoại trừ các thẻ liệt kê
$fil=new Zend_Filter_StripTags(array( Bỏ toàn bộ thẻ XML và HTML
Trang 34lý tập trung và dễ dàng hơn.
Như trong PHP thuần, trước khi thao tác với session chúng ta phải khởi độngsession Trong Zend Framework chúng ta làm việc này bằng cách thêm dòng sauvào file bootstrap ở ngoài cùng:
Zend_Session::start();
Tạo một đối tượng session:
$tên_session= new Zend_Session_Namespace(“namespace”);
Namespace có thể bỏ trống, khi đó namespace có giá trị là “default”
Ví dụ: $user= new Zend_Session_Namespace(“user”);
Dòng code trên tương đương với khai báo: $_SESSION[“user”];
Trang 352.6.4.10 Zend_Auth
Zend Framework hỗ trợ việc chứng thực thông qua đối tượng Zend_Auth, đối tượng này nhận thông tin từ người dùng và kiểm tra với dữ liệu được chỉ định trong
cơ sở dữ liệu để kiểm tra tính hợp lệ
Sau đây là các khái niệm trong Zend_Auth:
tableName tên bảng chứa thông tin chứng thực
identityColumn tên cột nhận dạng (thường là username) trong bảng thông tin
chứng thựccredentialColum
n
tên cột nhận dạng bí mật (thường là password) trong bảng thôngtin chức thực
Identity tên text field chứa thông tin so sánh với identityColumn
credential tên password field chứa thông tin so sánh với credentialColumn
Bảng 2 7: Bảng các khái niệm trong Zend_Auth
Sau đây là các bước chứng thực:
• Chỉ ra các bảng chứa thông tin chứng thực:
$authTable= new Zend_Auth_Adapter_Dbtable();
$authTable->setTableName(“tên bảng chứa thông tin chứng thực”);
$authTable->setIdentiny(“tên cột nhận dạng”);
$authTable->setCredentialColumn(“cột chứa thông tin bí mật”);
• Đưa các giá trị tương ứng với identity và credential vào đối tượng
Zend_Auth_Adapter_Dbtable:
$authTable->setIdentity(“dữ liệu của identity đầu vào”);
$authTable->setCredential(“dữ liệu credential đầu vào”);
Trang 36$kq= $result->isValid();
• Lấy thông tin nếu thành công:
o Bỏ một vài field từ dữ liệu thành công
$info= $authTable->getResultRowObject(null, array(“các trường không nhận”));
o Chỉ nhận một vài field cần thiết
$info= $authTable->getResultRowObject(array(“các trường cần trả về”));
• Ghi dữ liệu đã chứng thực vào session
Trước tiên, ta phải tìm hiểu khái niệm Roll và Resource:
• Role: Cấp độ người dùng bị tác động: user, admin, …
• Resource: phân quyền lên các tài nguyên: module, controller, action,…
Để thực hiện phân quyền, trước tiên ta phải khai báo như sau:
$acl= new Zend_Acl();
Trang 37Chỉ ra các role và resource cho Zend_Acl biết:
$user= new Zend_Acl_Role(‘user’);
$resindex= new Zend_Acl_Resource(‘index’);
Sau khi chỉ ra, resource và role phải được đưa vào đối tượng Zend_Acl
Ta hiến hành cấp quyền như sau:
• Cho phép: $acl->allow(role, resource, action);
Ví dụ: $acl->allow(“user”,”index”,”index”);
Nghĩa là: cho phép user vào action index của controller index
• Không cho phép: $acl->deny(role, resource, action);
Ví dụ: $acl->deny(“user”,”index”,”delete”);
Nghĩa là: cấm user vào action delete của controller index
Thông thường website có nhiều controller và mỗi controller có nhiều action,đôi khi muốn cấp quyền cho nhiều hay toàn bộ đối tượng giống nhau, không thểthiết lập từng quyền allow hay deny được Cú pháp chung của quyền allow và denynhư sau:
allow/deny(role, resource, action)Nếu như một trong ba tham số là null thì nghĩa là chọn toàn bộ đối tượng củanhóm đó
Ví dụ: $acl->allow(“admin”, null, “index”);
Nghĩa là: cho phép admin vào action index của tất cả các controller
Để kiểm tra với các role được cung cấp có quyền trên action và của resourcehay không ta dùng câu lệnh sau:
$acl->isAllowed($role, $resource, $action);
Trang 382.6.4.12 Zend_Captcha
Trong một website, việc thêm, xóa, sửa các bảng dữ liệu đa phần nằm trongphần quản trị Tuy nhiên ở một vài chức năng của người dùng có cho phép thao tácvới cơ sở dữ liệu Việc cho người dùng thao tác trên cơ sở dữ liệu chứa nhiều rủi ro,
có thể các đoạn mã độc được chèn vào, làm ngập lụt cơ sở dữ liệu hay các tấn côngSQL injection Một trong các giải pháp hạn chế rủi ro là dùng captcha Captcha là
mã xác nhận dưới dạng hình ảnh, chúng làm cho hacker khó khăn hơn trong việcđọc dữ liệu xác nhận Zend hỗ trợ lớp Zend_Captcha giúp chúng ta tạo captchanhanh chóng và các phương thức giúp quản lý captcha một cách đơn giản
Bản chất captcha là một ảnh và các ký tự xác nhận được vẽ lên ảnh đó Theotrình tự thực hiện, một ảnh nền sẽ được tạo, tiếp đó phát sinh chuỗi xác nhận, vẽchuỗi xác nhận lên ảnh và tạo một session chứa kí tự đã vẽ lên ảnh
Để thực hiện captcha, ta làm như sau:
Khởi tạo đối tượng: $captcha= new Zend_Captcha_Image();
Thiết lập các thông số của captcha:
• setWordLen(‘6’): số kí tự xuất hiện trên captcha
• setHeight(‘80’): chiều cao của ảnh chứa kí tự xác nhận
• setWidth(‘200’): độ rộng của ảnh captcha
Trang 39• setImgDir(‘đường dẫn’): đường dẫn tuyệt đối tới thư mục chứa captcha phát sinh.
• setImgUrl(‘đường dẫn’): đường dẫn tương đối tới thư mục chứa captcha
• setFont(‘đường dẫn’): đường dẫn tới thư mục chứa font chữ
• Khởi tạo đối tượng:
$zfile= new Zend_File_Transfer_Adapter_Http;
• Lấy thông tin các filefield:
$info= $zfile->getFileInfo();
• Lấy tên tệp được tải lên:
$filename= $info[‘tên filefield’][‘name’];
• Chỉ đường dẫn đến thư mục chứa các tệp được tải lên:
$zfile->setDestination(“đường dẫn”);
• Số lượng tệp được tải lên:
$zfile->setValidators(array(‘count’=>array(
‘min’=>‘số tệp tối thiểu’,
’max’=>‘số tệp tối đa’)));
Trang 40• Giới hạn dung lượng tệp (tính theo byte:
Một thao tác khá quen thuộc trong các website chính là gửi mail, Zend
Framework tạo ra đối tượng Zend_Mail hỗ trợ việc gửi mail dễ dàng hơn và có thể tùy biến nhiều yếu tố giúp cho việc gửi mail trở nên đơn giản
• Cài đặt thông số mail server
$tr= new Zend_Mail_Transport_Smtp(“ip hoặc link mail server”);Zend_Mail::setDefaultTransport($tr);
• Khởi tạo đối tượng Zend_Mail và các thông số của một mail
$mail= new Zend_Mail(); //khởi tạo đối tượng
$mail->setBodyText(“nội dung mail”);
$mail->setFrom(email người gửi, tên người gửi);
$mail->addTo(email người nhận, tên người nhận);
$mail->setSubject(tiêu đề mail);
$mail->send($tr); // gửi mail
• Gửi mail qua nhiều connection
$gate1= new Zend_Mail_Transport_Smtp(ip hoặc link mail server);
$gate2= new Zend_Mail_Transport_Smtp(ip hoặc link mail server);
$mail->send($gate1);
$mail->send($gate2);
• Người nhận trong Zend_Mail