i
Lời cảm ơn
Trước tiên, tôi muốn gửi lời cảm ơn sâu sắc đến TS Nguyễn Hải Châu, người đã
hết lòng hướng dẫn tôi trong suốt quá trình thực hiện khóa luận tốt nghiệp.
Tôi xin chân thành cảm ơn các thầy, các cô của trường đại học Công Nghệ đã
cung cấp cho tôi nền tảng kiến thức quý báu và sự giúp đỡ tận tình để tôi có thể hoàn
thành khóa luận của mình.
Tôi cũng muốn cảm ơn các bạn tôi, nhữ
ng người đã giúp đỡ tôi đưa ra giải pháp
lập trình hiệu quả khi thực hiện các thử nghiệm liên quan đến khóa luận này.
Cuối cùng, tôi xin gửi lời cảm ơn đến gia đình và người thân của tôi, những
người đã luôn động viên và giúp đỡ tôi trong suốt quá trình học tập và thực hiện khóa
luận.
Hà Nội, ngày 20 tháng 5 năm 2010
Sinh viên
Đặng Vĩnh Thiêm
ii
Tóm tắt khóa luận
Drupal là một hệ quản trị nội dung được sử dụng khá phổ biến trên Internet trong
thời gian gần đây. Với thiết kế mang tính module, Drupal cho phép mở rộng các tính
năng một cách linh hoạt thông qua các module được thêm vào mà không phải thay đổi
mã nguồn của hệ thống.
Trong khoá luận này, chúng tôi tập trung tìm hiểu các kiến thức liên quan đến
việc xây dựng module cho Drupal bao gồm triển khai các hook, làm việc với cơ sở dữ
liệu, thực thi mã JavaScript, xử lý form..v..v. Đ
i vào thực nghiệm, chúng tôi đã thiết kế
và cài đặt thành công một module có chức năng tích hợp bản đồ số Google Maps vào
trang web bằng cách sử dụng API do Google cung cấp. Module này hướng tới các đối
tượng website liên quan đến địa danh, địa điểm như website du lịch, tra cứu địa điểm
trên bản đồ...
iii
Mục lục
Lời cảm ơn...................................................................................................................................i
Tóm tắt khóa luận.......................................................................................................................ii
Mục lục..................................................................................................................................... iii
Bảng từ viết tắt ..........................................................................................................................vi
Mở đầu........................................................................................................................................1
Chương 1: Tổng quan về Drupal................................................................................................2
1.1 Giới thiệu về Drupal .........................................................................................................2
1.2 Kiến trúc của Drupal ........................................................................................................2
1.2.1 Kiến trúc module .......................................................................................................3
1.2.2 Các module lõi...........................................................................................................4
1.2.3 Hook ..........................................................................................................................5
1.2.4 Giao diện ...................................................................................................................6
1.3 Các khái niệm cơ bản trong Drupal..................................................................................6
1.3.1 Node ..........................................................................................................................6
1.3.2 Người dùng (User).....................................................................................................8
1.3.3 Khối và cách thể hiện trang.......................................................................................9
1.3.4 Thực đơn – Menu ....................................................................................................10
1.3.5 Form ........................................................................................................................11
1.3.6 API cơ sở dữ liệu và lược đồ...................................................................................11
1.4 Hệ thống tệp tin và thư mục của Drupal.........................................................................11
1.5. Drupal xử lý yêu cầu như thế nào?................................................................................13
1.5.1 Vai trò của Web server ............................................................................................13
1.5.2 Quá trình khởi động.................................................................................................13
1.5.3 Xử lý yêu cầu...........................................................................................................15
1.5.4 Giao diện hoá nội dung............................................................................................15
1.6 Công cụ dành cho người phát triển.................................................................................15
1.6.1 Module Devel ..........................................................................................................15
iv
1.6.2 Module Coder..........................................................................................................16
Chương 2 - Xây dựng module cho Drupal ...............................................................................17
2.1 File .info và .module.......................................................................................................17
2.1.1 File .info ..................................................................................................................17
2.1.2 File .module.............................................................................................................19
2.2 Chú thích trong mã nguồn ..............................................................................................19
2.3 Một số hook cơ bản ........................................................................................................20
2.4 Định nghĩa một hook mới...............................................................................................24
2.4.1 Cách tạo một hook...................................................................................................25
2.4.2 Sử dụng hook vào các module khác ........................................................................26
2.5 Một số hàm quan trọng trong thư viện hàm của Drupal.................................................26
2.6 Sử dụng Javascript và AJAX/JSON ...............................................................................28
2.6.1 Giới thiệu về jQuery................................................................................................28
2.6.2 jQuery hoạt động như thế nào .................................................................................29
2.6.2.1 Sử dụng bộ lọc ID của CSS..............................................................................29
2.6.2.2 Sử dụng XPath..................................................................................................29
2.6.3 jQuery trong Drupal ................................................................................................30
2.7 Form API........................................................................................................................31
2.7.1 Quá trình thao tác với form .....................................................................................31
2.7.2 Một số thao tác cơ bản.............................................................................................34
2.7.2.1 Tạo form ...........................................................................................................34
2.7.2.2 Giao diện hoá form...........................................................................................35
2.7.2.3 Kiểm tra dữ liệu................................................................................................35
2.7.2.4 Gửi form lên trang web ....................................................................................36
2.8 Làm việc với cơ sở dữ liệu .............................................................................................36
2.8.1 Định nghĩa các tham số trong CSDL.......................................................................36
2.8.2 Một số truy vấn đơn giản.........................................................................................37
2.8.3 Lấy kết quả truy vấn................................................................................................38
Chương 3: Xây dựng module tích hợp .....................................................................................40
v
Google Maps vào Drupal..........................................................................................................40
3.1 Giới thiệu về Google Maps ............................................................................................40
3.2 Nhúng bản đồ vào trang web..........................................................................................40
3.2.1 Tạo một bản đồ đơn giản.........................................................................................41
3.2.2 Dịch vụ Geocoder - Chuyển đổi giữa địa chỉ và toạ độ ..........................................42
3.3 Xây dựng module Google Maps cho Drupal..................................................................42
3.3.1 Module Google Maps..............................................................................................42
3.3.1.1 File .info ...........................................................................................................42
3.3.1.2 File .module......................................................................................................43
3.3.1.3 Tạo thêm trường thông tin cho bài viết ............................................................43
Kết luận ....................................................................................................................................46
Phụ lục A ..................................................................................................................................47
A.1 Cài đặt module Google Maps ........................................................................................48
A.2 Chạy thử chương trình...................................................................................................50
Tài liệu tham khảo....................................................................................................................47
vi
Bảng từ viết tắt
Từ viết tắt Cụm từ đầy đủ
URI Uniform Resource Identifier
CVS Concurrent Version System
API Application Programming Interface
CSDL Cơ sở dữ liệu
CMS Content Management System
1
Mở đầu
Trong thời đại Công nghệ thông tin ngày nay, các dịch vụ và ứng dụng web ngày
càng phát triển. Việc một cá nhân hay tổ chức sở hữu một website, một cổng thông tin
là điều dễ thấy trên Internet. Để thiết kế một trang web phục vụ mục đích riêng, người
dùng có nhiều lựa chọn. Một trong số đó là sử dụng hệ quản trị nội dung sẵn có để tổ
chức và xây dựng các trang thông tin.
Vớ
i mục đích đó, chúng tôi đã chọn Drupal, một trong các CMS phổ biến nhất,
để thực hiện nghiên cứu. Sở dĩ chúng tôi chọn CMS này vì đây là một hệ mã nguồn
mở miễn phí, được sử dụng rộng rãi và được cộng đồng mạng phát triển ngày càng
hoàn thiện.
Drupal có thể được sử dụng trong nhiều mục đích như xây dựng cổng thông tin
trực tuyến, website cá nhân, tổ chức, website thương mại, báo
điện tử, thư viện hình
ảnh...
Hệ thống Drupal được thiết kế để có thể tuỳ biến theo mong muốn của người
dùng và việc tuỳ biến chỉ được thực hiện bằng cách thêm các module để làm tăng khả
năng của hệ thống mà không thay đổi bộ nhân. Do đó, trong khoá luận này chúng tôi
chú trọng tìm hiểu cách xây dựng module cho Drupal và các vấn đề liên quan.
Chúng tôi hi vọng phần kiến thức tìm hiểu được trong khóa lu
ận sẽ mạng lại
những ý nghĩa tích cực trong thực tiễn.
Ngoài phần mở đầu, bố cục của khóa luận gồm 3 chương sau:
• Chương 1: Trình bày các kiến thức cơ bản về hệ thống Drupal và cách hoạt
động.
• Chương 2: Tìm hiểu cách viết một module trong Drupal.
• Chương 3: Đưa lý thuyết đã trình bày vào thực tế để thiết kế một module cụ
thể.
•
Cuối cùng là phần kết luận và hướng phát triển trong tương lai.
2
Chương 1: Tổng quan về Drupal
1.1 Giới thiệu về Drupal
Drupal là một framework dùng cho phát triển phần mềm hướng module, một hệ
thống quản trị nội dung miễn phí và mã nguồn mở.
Cũng giống như các hệ thống quản trị nội dung hiện đại khác, Drupal cho phép
người quản trị hệ thống tạo và tổ chức dữ liệu, tùy chỉnh cách trình bày, tự động hóa
các tác vụ điều hành và quản lý hệ thống. Drupal có cấu trúc lập trình rất tinh vi, dựa
trên đ
ó, hầu hết các tác vụ phức tạp có thể được giải quyết với rất ít đoạn mã được
viết, thậm chí không cần. Đôi khi, Drupal cũng được gọi là "Framework cho ứng dụng
Web" vì kiến trúc thông minh và uyển chuyển của nó.
Drupal được chạy trên rất nhiều môi trường khác nhau, bao gồm Windows, Mac
OS X, Linux, FreeBSD, OpenBSD và các môi trường hỗ trợ máy phục vụ web Apache
(phiên bản 1.3+) hoặc IIS (phiên bản 5+) có hỗ trợ ngôn ngữ PHP (phiên bản 4.3.3+).
Drupal kết nối v
ới cơ sở dữ liệu MySQL hoặc PostgreSQL để lưu nội dung và các
thiết lập.
Hình 1.1. Các dịch vụ được sử dụng trong Drupal.
1.2 Kiến trúc của Drupal
Nói một cách ngắn gọn thì Drupal là một hệ quản trị nội dung được viết bằng
ngôn ngữ PHP và sử dụng cơ sở dữ liệu quan hệ để lưu trữ (thông thường là MySQL).
Mặc dù Drupal được viết bằng PHP nhưng lại không sử dụng hướng đối tượng mà sử
dụng kiểu lập trình thủ tục truyền thống. Một trong số lý do đó là khi Drupal ra đời thì
PHP chưa hỗ
trợ mạnh về hướng đối tượng. Tuy nhiên, nhìn một cách tổng quát thì
3
Drupal vẫn áp dụng những nguyên lý trong lập trình hướng đối tượng: tính đóng gói,
kế thừa, đa hình...
Kiến trúc của Drupal có thể mô tả như biểu đồ dưới đây:
Hình 1.2. Kiến trúc Drupal
Ở trung tâm của kiến trúc là phần nhân gồm một tập các file chứa các đoạn mã
nạp chương trình và các thư viện quan trọng. Thư viện nhân Drupal đóng vai trò như
lớp kết nối các modules. Phần này cung cấp các dịch vụ như kết nối và quản lý cơ sở
dữ liệu, quản lý bộ khung hook, thư viện trừu tượng phục vụ mail và hình ảnh, hỗ trợ
Unicode... Mặc dù nh
ững thư viện này cung cấp các tính năng quan trọng nhưng sức
mạnh thực sự của Drupal nằm ở kiến trúc kiểu module.
1.2.1 Kiến trúc module
Module là một bộ gồm mã PHP và các file hỗ trợ sử dụng API và kiến trúc của
Drupal tích hợp các thành phần mới vào trong framework của Drupal.
Cơ chế module của Drupal được thiết kế để cung cấp một cách thức đồng nhất
giúp người phát triển mở rộng khả năng của hệ thống.
Những file tạo nên module được gộp vào một ví trí nhất định trong cấu trúc thư
mục của Drupal. Khi Drupal cần thông tin về module nào đ
ó, nó sẽ tìm trong những
thư mục này. Mỗi module nằm ở một thư mục riêng và có ít nhất là 2 file - một file
4
cung cấp thông tin về module và một hay nhiều file khác chứa mã PHP thực hiện chức
năng của module đó.
Để một module sử dụng được thì nó phải được bật bởi người quản trị trang web.
Drupal sẽ chuyển các yêu cầu của người dùng đến module đó nếu cần thiết.
1.2.2 Các module lõi
Một số module có vai trò rất quan trọng trong hệ thống Drupal. Nếu gỡ bỏ hoặc
vô hiệu hóa các module này sẽ dẫn đến Drupal mất đi các chức năng thiết yếu. Những
module này được gọi là module lõi, được mặc định phân phối theo mã nguồn Drupal.
Danh sách module lõi nằm ở Administer | Site building | Modules. Trong số này có 5
module quan trọng nhất là Block, Filter, Node, System và User. Những module này
không thể gỡ bỏ hoặc vô hiệu hóa.
Hình 1.2.2. Danh sách các module lõi
Một nét đặc biệt trong kiến trúc của Drupal là các module có thể tác động với
nhau một cách dễ dàng. Bằng cách sử dụng cơ chế hook, dịch vụ mà các module khác
nhau cung cấp có thể kết hợp với nhau để tạo nên các tính năng mạnh hơn mà không
cần phải viết lại một lượng lớn mã nguồn.
5
1.2.3 Hook
Cơ chế hook là một khái niệm rất quan trọng trong việc phát triển module cho
Drupal. Cơ chế này giúp Drupal biết được phải gọi module nào khi xử lý các yêu cầu
khác nhau từ người dùng.
Một yêu cầu của người dùng sẽ được Drupal xử lý qua một chuỗi các bước khác
nhau. Đầu tiên, phần lõi khởi động ứng dụng, định nghĩa các các biến và các hàm
thường dùng. Tiếp theo, hệ thống sẽ nạp các thư viện, giao diện và module cần thiế
t và
ánh xạ URI được yêu cầu tới đoạn mã điều khiển tương ứng. Sau đó, dữ liệu sẽ được
định dạng và đặt vào giao diện để đưa ra trình duyệt của người dùng.
Trong một thời điểm xác định trước, Drupal thực thi các hook. Hệ thống sẽ dựa
vào hook để kiểm tra một số hoặc tất cả các module đang được bật, tìm kiếm các hàm
theo khuôn mẫu
được định nghĩa trước. Một số mẫu liên kết quá trình này với phương
thức "callback" thường được sử dụng trong mô hình xử lý sự kiện. Cơ chế hook cũng
tương tự như thế.
Ví dụ, trong khi tạo nội dung cho một trang dạng View, Drupal có thể quét qua
các module để tìm những hàm có tên
<modulename>_block()
và
<modulename>_view()
với
modulename
được thay bằng tên của module cụ thể khi kiểm tra. Những module
chứa các hàm trên bổ sung cho các hook
hook_block()
và
hook_view().
Khi Drupal tìm thấy những hàm đó thì sẽ thực thi chúng và sử dụng dữ liệu lấy
được để trả lời yêu cầu của người dùng. Sau đó hệ thống sẽ tiếp tục quá trình xử lý
từng bước đã nói ở trên và có thể sẽ thực thi các hook khác nếu cần thiết.
Khi tất cả các bước đã hoàn thành, phản hồi được gửi lại người dùng, Drupal sẽ
dọn dẹp hệ th
ống và thoát ra.
Những người quen thuộc với lập trình hướng đối tượng có thể xem hook là một
cơ chế tương tự như các giao diện hoặc phương thức ảo. Giống như giao diện trong lập
trình hướng đối tượng, bản triển khai (bao gồm tên, các tham số và giá trị trả về) phải
khớp với phần khai báo của hook. Khác với giao diện, người phát triển module có thể
chọn những hook nào sẽ s
ử dụng và những hook nào được bỏ qua. Drupal không yêu
cầu tất cả các hook đã định nghĩa phải được triển khai và sử dụng.
Module có thể định nghĩa các hook riêng và module khác có thể dùng chung các
hook đó. Theo cách này, cơ chế hook được mở rộng để cung cấp các chức năng phức
6
tạp. Sử dụng hook thực chất là cách để người phát triển tương tác gián tiếp với bộ
nhân của Drupal.
1.2.4 Giao diện
Đối với một hệ quản trị nội dung (CMS) trên nền web, sức mạnh xử lý không
phải là tất cả. Một CMS ở cấp độ thương mại cần phải cho phép người thiết kế có khả
năng tùy chỉnh trang web với chế độ xem-và-cảm nhận (look-and-feel) mà họ mong
muốn. Drupal cung cấp một hệ thống giao diện mạnh mẽ để phục vụ mục đích này.
Hệ th
ống giao diện của Drupal khá phức tạp. Giống như các module, giao diện
được thiết kế sao cho có thể được cải tiến và mở rộng bằng cách sử dụng cơ chế hook.
Giao diện bao gồm một bộ tài nguyên bao gồm các mẫu PHP, CSS, Javascript và
hình ảnh, tạo nên bố cục và cách trình bày cho nội dung trong Drupal. Một giao diện
đơn giản có thể được tạo ra bởi một vài file - một file định nghĩa cách trình bày, một
file thông tin về giao diện và một vài hình
ảnh. Bằng cách sử dụng mẫu có sẵn của
Drupal, người phát triển có thể tạo ra một giao diện tùy chỉnh mà không tốn nhiều thời
gian.
Một giao diện cũng có thể phát triển để đáp ứng những nhu cầu cao hơn. Những
khuôn mẫu tùy biến, thường được viết bằng ngôn ngữ PHP dành cho mẫu, có thể tái
cấu trúc các chi tiết của HTML. Một số file PHP được viết để nạp chồng các ph
ương
thức của bộ máy giao diện. Các cấu hình phức tạp của Javascript và các file CSS cũng
được hỗ trợ. Module có thể được sử dụng để giao tiếp với hệ thống giao diện phức tạp
này.
Nói tóm lại, một giao diện có thể trở thành đơn giản hay phức tạp là tùy vào thiết
kế của người phát triển.
1.3 Các khái niệm cơ bản trong Drupal
1.3.1 Node
Drupal là một framework quản lý nội dung. Khi nói về nội dung trong trường
hợp này, chúng ta thường nghĩ đến các đối tượng văn bản như bài viết tin tức hoặc một
mẫu blog.
Khái niệm về một mẫu nội dung dạng văn bản tổng quát trong Drupal được gọi
bằng thuật ngữ Node. Một node, hiểu theo cách của Drupal, là một đối tượng tổng
quát dùng để biểu diễn nội dung dạng vă
n bản.
7
Tuy nhiên, với khả năng tùy biến của Drupal, người phát triển có thể tạo ra các
module mở rộng khả năng trình bày của node để có thể hiển thị các nội dung ngoài văn
bản thuần túy, như hình ảnh, video hay các file âm thanh.
Các node được lưu trữ trong cơ sở dữ liệu và sẽ được lấy ra khi cần thiết. Một
node gồm có các thành phần:
- Một định danh không trùng nhau đối với 2 node bất kỳ (
nid
- Node ID).
- Ít nhất một giá trị thể hiện phiên bản của node (
vid
- Version ID).
- Ngày khởi tạo và thay đổi, cùng với thông tin xác định người dùng làm việc trực tiếp
với node đó.
- Dữ liệu meta như trạng thái xuất bản, ngôn ngữ được sử dụng và và các bản dịch
sang ngôn ngữ khác...
Thêm vào đó, hầu hết các node đều có phần tiêu đề và phần nội dung. Người
quản trị và nhà phát triển có thể chọn vô hiệu hóa hai phần này.
Chúng ta sẽ xem qua quá trình tạo một nội dung mới để hiể
u thêm về node.
Mặc định, người dùng có thể tạo một nội dung mới trong Drupal bằng cách nhấn
vào liên kết Create content ở trang điều hướng. Tại đây, người dùng sẽ được yêu cầu
chọn loại nội dung họ sẽ tạo ra.
Hình 1.3.1.a. Giao diện chọn nội dung cần tạo
Nói một cách tổng quát thì node là phần cốt lõi của hệ thống quản lý nội dung
của Drupal. Các API của node sẽ được khai thác nhiều ở các phần sau của khóa luận.
8
Lưu ý rằng comments (các bài bình luận) không phải là node. Trong khi hầu hết
các nội dung ở dạng bài viết là dựa trên node thì comment là một ngoại lệ. Bình luận
thực chất là một cơ chế phản hồi ở cấp người dùng được gắn vào các bài viết, trang tin
hay mẫu blog... Khi tạo ra một trang nội dung mới, người dùng có thể chọn cho phép
hoặc không cho phép các bài bình luận.
Dưới đây là ví dụ về giao diện khi người dùng muốn gửi bình luận:
Hình 1.3.1.b. Thêm chú thích vào bài viết
Lời bình luận đóng một vai trò khác với node trong hệ thống Drupal. Mặc dù
không phải là một thành phần quan trọng trong việc phát triển module nhưng lời bình
luận cho thấy Drupal là một kiến trúc rất uyển chuyển, có thể chấp nhận các phần mở
rộng (như comment) mà không phù hợp với khuôn mẫu điển hình của nội dung và
không sử dụng các API của node.
1.3.2 Người dùng (User)
Một kiểu đối tượng quan trọng khác trong Drupal là đối tượng Người dùng.
Giống như comment và node, dữ liệu người dùng cũng được lưu trữ trong cơ sở dữ
liệu và được lấy ra trong quá trình xử lý.
9
Thông tin về người dùng được sử dụng trong việc xác thực, định nghĩa các thiết
lập cá nhân và quyền hạn, và tạo các bản log.
Truy xuất và bảo mật
Các đặc quyền của người dùng được liên kết chặt chẽ với đối tượng người dùng
mà hệ thống chỉ định. Drupal có cơ chế để có thể cấp quyền cho một tập hợp người
dùng. Mặc định, mỗi ngườ
i dùng được gán một vai trò và các đặc quyền được cấp phát
hoặc thu hồi qua vai trò đó.
Vì thế, khi kiểm tra truy cập đến tài nguyên, Drupal nạp một đối tượng người
dùng, tìm vài trò của người dùng đó và kiểm tra các đặc quyền của vai trò để quyết
định cho phép truy cập hay không.
Những việc này được thực hiện bởi API người dùng, người phát triển module
không cần thao tác trực tiếp với vai trò của người dùng trước khi xác định quyền hạ
n.
1.3.3 Khối và cách thể hiện trang
Một khái niệm quan trọng trong Drupal là Khối (block). Nếu một node được sử
dụng để lưu trữ và trình bày các bài viết và mẫu tin lớn thì khối được dùng để biểu
diễn các nội dung nhỏ hơn. Ví dụ, menu điều hướng, đoạn trích dẫn, khung bầu chọn
hay ô tìm kiếm thường được thể hiện dưới dạng các khối.
Khối không phải là một dạng nội dung mà thực chất là m
ột đối tượng trừu tượng
được sử dụng chủ yếu để hiển thị các đối tượng nội dung khác. Người quản trị có thể
vào Block editor để chỉ định vị trí đặt các khối trong một trang giao diện:
10
Hình 1.3.3. Các vị trí đặt Blocks
Những phần được đánh dấu màu vàng ở hình trên cho thấy các vị trí mà khối có
thể được đặt.
Việc định nghĩa một block thực chất là chọn nội dung để hiển thị và chuyển đến
công cụ định dạng phù hợp.
1.3.4 Thực đơn – Menu
Một khái niệm liên quan chặt chẽ đến khối là Thực đơn. Drupal có một hệ thống
thực đơn phức tạp được sử dụng với mục đích chính là xây dựng điều hướng cho trang
web. Ví dụ, hình trên thể hiện thực đơn chính với các mục Code review, My account,
Create content... Thực đơn này được khởi tạo động bởi hệ thống thực đơn của
Drupal.
Hệ thố
ng này còn thực hiện chức năng như một công cụ dùng để ánh xạ các URL
tới chương trình điều khiển riêng. Bằng cách sử dụng API thực đơn, người phát triển
có thể liên kết các đường dẫn tới hàm định nghĩa trước.
11
1.3.5 Form
Cách chủ yếu để đưa thông tin, nội dung lên Web là thông qua các form HTML.
Mặc dù sự phổ biến của form làm cho người dùng web thuận tiện hơn nhưng đối với
lập trình viên, có rất ít lựa chọn cho công cụ xử lý form trong việc viết mã.
Tuy nhiên, trong Drupal, form được hỗ trợ đầy đủ và mạnh mẽ. Bộ API form
(FAPI) cung cấp một giao diện lập trình linh hoạt giúp cho lập trình viên giảm bớt
lượng công việc và thời gian trong việc thiết kế và x
ử lý form.
Bằng cách sử dụng FAPI, người phát triển chỉ cần cung cấp thông tin một form,
Drupal sẽ xây dựng và hiển thị form đó, thu thập kết quả và thậm chí kiểm tra tính hợp
lệ của dữ liệu người dùng đưa vào.
1.3.6 API cơ sở dữ liệu và lược đồ
Nằm ở dưới các framework cung cấp ứng dụng và giao diện là một lớp chịu trách
nhiệm về quản lý và thao tác về cơ sở dữ liệu. Drupal cung cấp một API cơ sở dữ liệu
ở cấp thấp để đơn giản hoá việc viết truy vấn SQL.
API này có cơ chế bảo mật giúp kiểm soát và lọc các truy vấn, đồng thời giúp
người phát triển dễ dàng viết các đoạn mã SQL để
có thể thực thi ở các cơ sở dữ liệu
khác nhau.
Ngoài ra, một API mới được giới thiệu từ phiên bản Drupal 6 là API lược đồ,
cho phép định nghĩa cấu trúc một cơ sở dữ liệu mà không cần phải viết mã SQL.
Trong khi các cơ sở dữ liệu khác nhau sử dụng các cấu trúc riêng biệt cho việc định
nghĩa bảng, API này giúp giải quyết vấn đề phát triển module có tính di động.
1.4 Hệ thống tệp tin và thư mục của Drupal
Hiểu rõ cấu trúc thư mục của Drupal giúp người quản trị quản lý website một
cách toàn diện và người phát triển có thể can thiệp sâu hơn vào hệ thống. Mặc định,
cấu trúc thư mục của Drupal được sắp xếp như sau:
Hình 1.4.a. Hệ thống tệp tin và thư mục của Drupal
12
Thư mục
files
sử dụng cho các logo tuỳ biến, hình ảnh đại diện người dùng
hoặc chứa các file đa phương tiện được tải lên website. Thư mục này phải được đặt
quyền đọc và ghi bởi web server phục vụ Drupal.
Thư mục
includes
chứa thư viện các hàm thường dùng.
Thư mục
misc
lưu trữ các biểu tưởng và hình ảnh dùng cho Javascript và một số
tài nguyên khác.
Thư mục
profiles
chứa các profile khác nhau dùng cho cài đặt và thiết lập
Drupal. Ở lần đầu tiên cài đặt, Drupal sẽ hỏi xem người dùng sử dụng profile nào.
Mục đích của các profile là giúp tự động hoá việc cài đặt bằng cách bật các module và
chức năng định sẵn trong phần nhân hệ thống để phù hợp với mục đích sử dụng
website.
Thư mục
scripts
chứa các tập lệnh dùng để phân tích cú pháp, dọn dẹp mã
nguồn và xử lý các tác vụ đặc biệt với
cron
. Những tập lệnh tiện ích này được viết
bằng ngôn ngữ shell và Perl.
Thư mục
themes
chứa các công cụ tạo khuôn mẫu và giao diện mặc định cho
Drupal.
Thư mục
sites
chứa các thay đổi đối với Drupal dưới dạng thiết lập, module và
giao diện. Các module được thêm vào sẽ nằm trong
sites/all/modules
. Trong thư
mục
sites
có thư mục được đặt tên là
default
chứa các thiết lập mặc định cho hệ
thống Drupal, được ghi lại trong file
settings.php
. Dưới đây là cấu trúc bên trong thư
mục
sites
:
13
Hình 1.4.b. Cây thư mục con của thư mục sites
1.5. Drupal xử lý yêu cầu như thế nào?
Nắm được cách thức Drupal xử lý yêu cầu từ phía người dùng và người quản trị
sẽ giúp lập trình viên tác động sâu vào trong hệ thống. Quá trình này có thể tự tìm hiểu
bằng cách sử dụng một bộ dò lỗi và bắt đầu từ file index.php, nơi mà Drupal tiếp nhận
hầu hết các yêu cầu.
1.5.1 Vai trò của Web server
Drupal hoạt động trên một web server, thường là Apache. Nếu web server hỗ trợ
file
.htaccess
, một số tuỳ chọn trong PHP sẽ được khởi tạo và chức năng URL rút
gọn cũng được bật. Chức năng này giúp chuyển các URL yêu cầu thành dạng ngắn
gọn, ví dụ URL
/> sẽ được chuyển thành
/>. Đối với các web server khác như Microsoft IIS, chức
năng này được hỗ trợ trong các module interface (ISAPI – Windows Internet Server
Application Programming Interface) như ISAPI_Rewrite.
1.5.2 Quá trình khởi động
Drupal tự nạp phần khởi động khi có yêu cầu bằng cách thao tác qua một chuỗi
các bước được định nghĩa trong file
bootstrap.inc.
Những thao tác này gồm:
Cấu hình
14
Bước này sinh ra một mảng chứa cấu hình bên trong Drupal và thiết lập biến
$base_url
cho trang web. File
settings.php
được phân tích thông qua hàm
include_once()
và sử dụng các biến được nạp chồng trước đó.
Bộ nhớ đệm
Trong những trường hợp yêu cầu khả năng mở rộng hệ thống cao, một bộ nhớ
đệm cần được thiết lập trước khi kết nối cơ sở dữ liệu. Bước này cho phép dẫn giải đến
một file PHP chứa hàm
page_cache_fastpath()
có nhiệm vụ lấy thông tin và trả lại
dữ liệu cho trình duyệt. Chức năng tạo bộ nhớ đệm được bật bằng cách đặt giá trị
TRUE cho biến
page_cache_fastpath
và file được tham chiếu phải được định nghĩa
thông qua đường dẫn của biến
cache_inc.
Cơ sở dữ liệu
Quá trình này xác định loại cơ sở dữ liệu được sử dụng và một kết nối ban đầu
được thiết lập để sử dụng cho các truy vấn.
Truy cập
Drupal cho phép ngăn chặn các truy cập từ máy khách thông qua tham chiếu IP
và tên máy. Trong bước này, hệ thống sẽ kiểm tra xem yêu cầu có phải được thực hiện
từ địa chỉ bị chặn hay không, nếu phải thì truy c
ập sẽ bị từ chối.
Phiên phục vụ
Drupal tận dụng lợi thế của PHP trong việc quản lý phiên đồng thời phát triển
thêm các chức năng riêng để bổ sung cho việc quản lý phiên cơ sở dữ liệu. Trong bước
này, các phiên sẽ được khởi tạo hoặc thiết lập lại.
Xử lý đường dẫn
Tại bước này, đoạn mã dùng để xử lý đường dẫn và đị
nh danh được nạp. Những
URL ở dạng rút gọn hoặc đã được chuyển sang dạng dễ đọc sẽ được phân tích thành
các yêu cầu.
Bước kết thúc
Bước này hoàn thành quá trình khởi động bằng cách nạp các thư viện và các hàm
dùng chung, bộ phận giao diện, xử lý file, mã Unicode, bộ công cụ ảnh PHP, khởi tạo
và xử lý form... Đến đây tất cả các module ở trạng thái bật cũng được nạp. Cuối cùng,
Drupal gọ
i hook có tên là
init
để các thông báo đến các module trước khi quá trình xử
lý yêu cầu chính thức bắt đầu.
15
Khi Drupal đã hoàn thành quá trình khởi động, tất cả các thành phần của
framework đều chuyển sang trạng thái sẵn sàng. Lúc này, hệ thống lấy và phân tích
yêu cầu từ phía trình duyệt và chuyển sang các hàm PHP tương ứng để xử lý.
1.5.3 Xử lý yêu cầu
Việc ánh xạ giữa địa chỉ URL và các hàm xử lý được thực hiện thông qua một
bước đăng ký hàm callback để quản lý URL và quyền truy cập. Các module đăng ký
hàm callback của mình bằng cách sử dụng hook
menu
.
Khi Drupal xác định được có tồn tại một callback đến địa chỉ URL của trình
duyệt mà yêu cầu được ánh xạ và người dùng gửi yêu cầu này có quyền truy cập
callback thì việc xử lý yêu cầu sẽ được giao cho hàm callback đó.
Ví dụ, nếu nhận được một yêu cầu về nội dung là
/>, URL sẽ được ánh xạ đến hàm
node_page_view()
ở
trong
node.module
. Các quá trình xử lý tiếp theo sẽ tiếp nhận dữ liệu cho node đó từ cơ
sở dữ liệu. Cuối cùng, phản hồi sẽ được gửi trả lại trình duyệt qua bộ phận giao diện.
1.5.4 Giao diện hoá nội dung
Việc giao diện hoá thực chất là chuyển dữ liệu mà Drupal nhận được, dữ liệu
thông qua xử lý hay dữ liệu tự tạo ra sang dạng HTML. Drupal sẽ sử dụng giao diện
mà người quản trị chọn trước để thiết kế trang web đúng với yêu cầu và chuyển kết
quả HTML cho trình duyệt để hiển thị tới người dùng.
1.6 Công cụ dành cho người phát triển
Drupal đưa ra một số công cụ đặc thù dành cho người phát triển module Drupal.
Những công cụ này được cung cấp bởi 2 module chủ yếu, có thể lấy từ trang web của
Drupal, là module Devel và module Coder.
1.6.1 Module Devel
Module này cung cấp một số công cụ đặc biệt hữu dụng cho việc phát triển
Drupal, gồm có quản lý bộ nhớ cache, công cụ dò lỗi SQL, công cụ thăm dò, công cụ
tham chiếu API...
Thông tin chi tiết về module này có ở:
16
Các công cụ trên được hiển thị dưới dạng các mục trong một Khối. Vì thế, sau
khi cài đặt module Devel, người quản trị phải vào Administer | Site building |
Modules để bật module và vào mục Blocks để xác định ví trí hiện thị nội dung trên
trang chủ.
Module này còn bao gồm các công cụ để xây dựng giao diện, bộ sinh mã macro
để giả lập dữ liệu dành cho form và các dữ liệu cho quá trình testing.
1.6.2 Module Coder
Cũng như một số framework khác, người phát triển Drupal phải tuân theo những
quy ước nhất định trong việc viết mã. Module Coder là một công cụ được thiết kế
nhằm giúp xác định và sửa những đoạn mã không theo quy ước định sẵn.
Ngoài ra, công cụ này còn thực hiện một số bước kiểm tra tính bảo mật bằng
cách quản lý việc các đoạn mã được xử lý như thế nào. Chức năng này hữu ích trong
việc phát hiện các lỗi lập trình và cảnh báo trước khi trở thành các lỗ hổng bảo mật.
Thông tin chi tiết về module này có thể tìm tại trang:
Mặc dù không làm tăng hiệu suất trong việc phát triển như module Devel nhưng
Coder giúp tạo nên những đoạn mã gọn gàng và mang phong cách Drupal. Quá trình
kiểm tra cú pháp của công cụ này còn có thể phát hiện các lỗ hổng về bảo mật.
17
Chương 2 - Xây dựng module cho Drupal
Trong nhiều ứng dụng mã nguồn mở, người dùng có thể tuỳ biến chương trình
bằng cách thay đổi hoặc thêm các đoạn mã. Điều này dẫn đến việc mỗi khi có bản cập
nhật, người dùng phải kiểm tra xem sự tuỳ chỉnh có còn tương thích và hoạt động
đúng như mong muốn hay không. Drupal hoạt động theo một cách khác. Mọi thay đổi
và sự mở rộng được thực hiện thông qua các module. Chương này sẽ
tập trung tìm
hiểu cách viết một module cho Drupal.
2.1 File .info và .module
Cấu trúc của một module có thể gồm nhiều tập tin khác nhau nhưng phải có ít
nhất một tập tin
<tenmodule>.info
và một tập tin
<tenmodule>.module
trong đó
<tenmodule>
là tên của thư mục chứa module được tạo, tên này không được trùng với
các module đã tồn tại trong hệ thống.
2.1.1 File .info
Trước khi thực sự đi vào viết mã cho một module, chúng ta phải tạo ra một file
văn bản chứa các thông tin cơ bản về module đó. Một số thành phần của Drupal sẽ sử
dụng các thông tin trong file này cho việc quản lý module.
File
.info
được viết theo kiểu của file PHP INI, một định dạng file dùng cho
việc xác định các thiết lập. Nội dung một file
.info
có dạng như sau:
name = “Google Maps”
description = “Displays a map using Google Maps API”
core = 6.x
php = 5.1
Trường
name
khai báo tên của module, tên này sẽ hiển thị trong danh sách các
module có ở khu vực cho người quản trị. Ví dụ:
18
Hình 2.1.1. Minh họa giao diện hiển thị tên module
Trong hình trên, Aggregrator và Blog được lấy từ giá trị của trường name trong
file
.info
của các module tương ứng.
Tiếp theo là phần
description
chứa thông tin thêm về module, mô tả chức năng,
nhiệm vụ mà module sẽ thực hiện.
Name
và
description
là hai trường bắt buộc phải có trong file
.info.
Trường thông tin thứ ba là
core
. Mục này chỉ rõ module sẽ hoạt động tốt trên
phiên bản nào của Drupal. Giá trị 6.x cho biết module này yêu cầu phiên bản Drupal 6,
bao gồm các phiên bản nâng cấp từ bản 6. Trong nhiều trường hợp, Drupal sẽ tự động
đặt giá trị này một cách hợp lý, nhưng những người phát triển làm việc với CVS
(Concurrent Version System - hệ thống quản lý phiên bản ứng dụng) được khuyến cáo
nên tự mình đặt giá trị cho trường
core
.
Chỉ dẫn cuối cùng trong file
.info
trên là
php
, cho biết phiên bản tối thiểu của
PHP mà module yêu cầu.
Ngoài ra, các module phức tạp hơn còn có thêm một số trường thông tin trong
file
.info
như:
-
Package
: nhóm các chức năng của module, nếu không khai báo package thì module
được đưa vào nhóm “other”.
-
Dependencies
: các module phụ thuộc, cách nhau bằng khoảng trống. Nếu module
được yêu cầu chưa được bật trên hệ thống thì module này không thể bật được.
Sau khi có file
.info
, chúng ta bắt đầu việc viết mã cho module trong file
.module.
19
2.1.2 File .module
File .
module
là file quan trọng nhất trong một module, chứa các đoạn mã PHP
thực hiện chức năng của module đó. File này thông thường sẽ mở rộng một số hàm
hook mà Drupal gọi tại các thời điểm nhất định đối với một yêu cầu.
Cũng giống như file .info, file .module được đặt tên theo quy tắc
<modulename>.module
, trong đó
<modulename>
là tên thư mục chứa module.
Nội dung file .module bắt đầu bằng thẻ
<?php
, sau đó là mã nguồn. Theo quy ước
của Drupal, file này sẽ không chứa dấu đóng
?>
. Việc này giúp tránh in những ký tự
trống trong đầu ra của mã kịch bản trong một số trường hợp. Ví dụ, nếu các ký tự
trống được xuất ra trước khi phần thông tin header của HTML gửi đi, ở trình duyệt
máy khách sẽ xuất hiện thông báo lỗi trên đầu của trang web.
Mã nguồn chi tiết của file này sẽ được đề cập trong những phần tiếp theo.
2.2 Chú thích trong mã nguồn
Như đã đề cập ở trên, Drupal tuân theo các tiêu chuẩn viết mã và tài liệu một
cách chặt chẽ. Xem chi tiết tại
/>. Một trong số
đó là chuẩn viết chú thích trong mã nguồn.
Mở đầu các module và hàm trong đó, lập trình viên phải chú thích rõ ràng và đầy
đủ chức năng của khối mã tiếp theo đó. Ví dụ, dưới đây là chú thích của module
GoogleMaps:
/**
* @file
* Module for displaying a map from Google Maps.
* This module provides block content retrieved from
* Google Maps data.
* @see
*/
Phần này chính là tài liệu cho API, chứa trong một khối chú thích đặc biệt bắt
đầu bằng
/**
và kết thúc với
*/
. Tất cả các dòng nằm trong cặp dấu này đều được coi
là tài liệu và sẽ không được trình biên dịch xử lý.