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

i

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 đồ...

ii

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 
iii

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 
iv

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 

v

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 vi .

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. Với mục đích đó. • Cuối cùng là phần kết luận và hướng phát triển trong tương lai.. các dịch vụ và ứng dụng web ngày càng phát triển. chúng tôi đã chọn Drupal. Do đó. website cá nhân. website thương mại. 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. 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. thư viện hình ảnh. 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. một trong các CMS phổ biến nhất. 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.. 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. người dùng có nhiều lựa chọn. Ngoài phần mở đầu. • Chương 2: Tìm hiểu cách viết một module trong Drupal. Việc một cá nhân hay tổ chức sở hữu một website. • Chương 3: Đưa lý thuyết đã trình bày vào thực tế để thiết kế một module cụ thể. đượ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. báo điện tử. Sở dĩ chúng tôi chọn CMS này vì đây là một hệ mã nguồn mở miễn phí. để thực hiện nghiên cứu. 1 . tổ chức. 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.Mở đầu Trong thời đại Công nghệ thông tin ngày nay.

tự động hóa các tác vụ điều hành và quản lý hệ thống. Hình 1. Tuy nhiên. Drupal có cấu trúc lập trình rất tinh vi. 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ó. tùy chỉnh cách trình bày. một hệ thống quản trị nội dung miễn phí và mã nguồn mở.Chương 1: Tổng quan về Drupal 1. thậm chí không cần. 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. dựa trên đó.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.3+) hoặc IIS (phiên bản 5+) có hỗ trợ ngôn ngữ PHP (phiên bản 4. 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. Đôi khi. Drupal cho phép người quản trị hệ thống tạo và tổ chức dữ liệu. OpenBSD và các môi trường hỗ trợ máy phục vụ web Apache (phiên bản 1. Cũng giống như các hệ thống quản trị nội dung hiện đại khác. FreeBSD. Mac OS X.3. Các dịch vụ được sử dụng trong Drupal. 1.3+). Linux.1. Drupal được chạy trên rất nhiều môi trường khác nhau.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). nhìn một cách tổng quát thì 2 . bao gồm Windows. 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ư viện trừu tượng phục vụ mail và hình ảnh. 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. 1.2.. kế thừa. Kiến trúc của Drupal có thể mô tả như biểu đồ dưới đây: Hình 1. Khi Drupal cần thông tin về module nào đó. quản lý bộ khung hook. 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. đa hình.2. nó sẽ tìm trong những thư mục này. 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. Mỗi module nằm ở một thư mục riêng và có ít nhất là 2 file .. 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.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.một file 3 . 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...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. hỗ trợ Unicode.

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. Để 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. Bằng cách sử dụng cơ chế hook. 4 . Những module này được gọi là module lõi. Hình 1. Những module này không thể gỡ bỏ hoặc vô hiệu hóa.2 Các module lõi Một số module có vai trò rất quan trọng trong hệ thống Drupal.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 đó.2. Trong số này có 5 module quan trọng nhất là Block. 1. 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. được mặc định phân phối theo mã nguồn Drupal. Node. System và User. Filter.2.2. Danh sách module lõi nằm ở Administer | Site building | Modules. 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 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. 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. Trong một thời điểm xác định trước. Khác với giao diện.2. 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. bản triển khai (bao gồm tên. phần lõi khởi động ứng dụng. Theo cách này. cơ chế hook được mở rộng để cung cấp các chức năng phức 5 . định nghĩa các các biến và các hàm thường 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. 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. 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. Khi tất cả các bước đã hoàn thành. Sau đó. Drupal thực thi các hook. Cơ chế hook cũng tương tự như thế. 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. hệ thống sẽ nạp các thư viện. Drupal sẽ dọn dẹp hệ thống và thoát ra. phản hồi được gửi lại người dùng. trong khi tạo nội dung cho một trang dạng View. tìm kiếm các hàm theo khuôn mẫu được định nghĩa trước. các tham số và giá trị trả về) phải khớp với phần khai báo của hook. 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. 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. 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.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. 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. 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. Module có thể định nghĩa các hook riêng và module khác có thể dùng chung các hook đó. Những module chứa các hàm trên bổ sung cho các hook hook_block() và hook_view(). Ví dụ. Giống như giao diện trong lập trình hướng đối tượng. Tiếp theo.1. Đầu tiên.

3. Nói tóm lại. 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. 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. Khi nói về nội dung trong trường hợp này. 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. Module có thể được sử dụng để giao tiếp với hệ thống giao diện phức tạp này.tạp. Những khuôn mẫu tùy biến. Javascript và hình ảnh. Drupal cung cấp một hệ thống giao diện mạnh mẽ để phục vụ mục đích này.2. Một giao diện cũng có thể phát triển để đáp ứng những nhu cầu cao hơn. Các cấu hình phức tạp của Javascript và các file CSS cũng được hỗ trợ. Bằng cách sử dụng mẫu có sẵn của Drupal. Giống như các module. 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. 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. 6 . Giao diện bao gồm một bộ tài nguyên bao gồm các mẫu PHP. một file thông tin về giao diện và một vài hình ảnh. hiểu theo cách của Drupal. có thể tái cấu trúc các chi tiết của HTML. Một node. 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.4 Giao diện Đối với một hệ quản trị nội dung (CMS) trên nền web. thường được viết bằng ngôn ngữ PHP dành cho mẫu. Một giao diện đơn giản có thể được tạo ra bởi một vài file .3 Các khái niệm cơ bản trong Drupal 1. 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. sức mạnh xử lý không phải là tất cả.một file định nghĩa cách trình bày. 1. 1. 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. CSS. Hệ thống giao diện của Drupal khá phức tạp. tạo nên bố cục và cách trình bày cho nội dung trong Drupal.1 Node Drupal là một framework quản lý nội dung. 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.

1.a. Chúng ta sẽ xem qua quá trình tạo một nội dung mới để hiểu thêm về node. Tại đây. 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 đó.Tuy nhiên. Các node được lưu trữ trong cơ sở dữ liệu và sẽ được lấy ra khi cần thiết.Ngày khởi tạo và thay đổi. 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. với khả năng tùy biến của Drupal. như hình ảnh.. Hình 1. Một node gồm có các thành phần: .Ít nhất một giá trị thể hiện phiên bản của node (vid . người dùng sẽ được yêu cầu chọn loại nội dung họ sẽ tạo ra. video hay các file âm thanh. 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.Version ID). 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ùng với thông tin xác định người dùng làm việc trực tiếp với node đó. Mặc định.Node ID). Các API của node sẽ được khai thác nhiều ở các phần sau của khóa luận. 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. hầu hết các node đều có phần tiêu đề và phần nội dung.Một định danh không trùng nhau đối với 2 node bất kỳ (nid . .Dữ liệu meta như trạng thái xuất bản. .3. 7 .

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.. 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ý. 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. 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. 1. 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. Giống như comment và 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ệ.3.b. 8 .. trang tin hay mẫu blog.1. 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. Khi tạo ra một trang nội dung mới.3. 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.Lưu ý rằng comments (các bài bình luận) không phải là node.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.

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. khung bầu chọn hay ô tìm kiếm thường được thể hiện dưới dạng các khối. 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.3. Ví dụ. Những việc này được thực hiện bởi API người dùng. 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. định nghĩa các thiết lập cá nhân và quyền hạn. menu điều hướng. 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: 9 . Drupal nạp một đối tượng người dùng. 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ò đó. khi kiểm tra truy cập đến tài nguyên. đoạn trích dẫn.Thông tin về người dùng được sử dụng trong việc xác thực. và tạo các bản log. 1. Drupal có cơ chế để có thể cấp quyền cho một tập hợp người dùng.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). Mặc định. 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 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. Vì thế.

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. 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.3.Hình 1. My account.3. Create content.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. Bằng cách sử dụng API thực đơn. Ví dụ.4 Thực đơn – Menu Một khái niệm liên quan chặt chẽ đến khối là Thực đơn. 1. hình trên thể hiện thực đơn chính với các mục Code review. 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. 10 . 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...

5 Form Cách chủ yếu để đưa thông tin. 1. Bằng cách sử dụng FAPI. 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. Ngoài ra.a.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. Drupal sẽ xây dựng và hiển thị form đó. API này có cơ chế bảo mật giúp kiểm soát và lọc các truy vấn. cấu trúc thư mục của Drupal được sắp xếp như sau: Hình 1.3. Tuy nhiê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. 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. một API mới được giới thiệu từ phiên bản Drupal 6 là API lược đồ.4. trong Drupal. 1. 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. 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. nội dung lên Web là thông qua các form HTML. form được hỗ trợ đầy đủ và mạnh mẽ. 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. có rất ít lựa chọn cho công cụ xử lý form trong việc viết mã.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. 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. API này giúp giải quyết vấn đề phát triển module có tính di động. Hệ thống tệp tin và thư mục của Drupal 11 . người phát triển chỉ cần cung cấp thông tin một form.

Thư mục này phải được đặt quyền đọc và ghi bởi web server phục vụ Drupal. Ở lần đầu tiên cài đặt. module và giao diện. Dưới đây là cấu trúc bên trong thư mục sites: 12 . 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. Drupal sẽ hỏi xem người dùng sử dụng profile nào. Thư mục Drupal. Thư mục includes chứa thư viện các hàm thường dùng. được ghi lại trong file settings.php. Trong thư chứa các thiết lập mặc định cho hệ thống Drupal. Những tập lệnh tiện ích này được viết chứa các công cụ tạo khuôn mẫu và giao diện mặc định cho Thư mục sites chứa các thay đổi đối với Drupal dưới dạng thiết lập. themes cron. Thư mục scripts chứa các tập lệnh dùng để phân tích cú pháp. Thư mục profiles chứa các profile khác nhau dùng cho cài đặt và thiết lập Drupal. 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 files sử dụng cho các logo tuỳ biến. dọn dẹp mã nguồn và xử lý các tác vụ đặc biệt với bằng ngôn ngữ shell và Perl. Các module được thêm vào sẽ nằm trong mục sites có thư mục được đặt tên là default sites/all/modules. 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.

Đối với các web server khác như Microsoft IIS.php.Hình 1. thường là Apache. 1.1 Vai trò của Web server Drupal hoạt động trên một web server. Những thao tác này gồm: Cấu hình 13 . 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.5.com/index.php?q=foo/bar sẽ được chuyển thành http://example.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. 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 được hỗ trợ trong các module interface (ISAPI – Windows Internet Server Application Programming Interface) như ISAPI_Rewrite.com/foo/bar. ví dụ URL http://example.5. nơi mà Drupal tiếp nhận hầu hết các yêu cầu. 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.b. Cây thư mục con của thư mục sites 1. Nếu web server hỗ trợ file .htaccess.5. 1. 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.4.

mã Unicode. 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. Trong bước này. Trong bước này. bộ phận giao diệ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.. 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 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.php được phân tích thông qua hàm và sử dụng các biến được nạp chồng trước đó. 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. File include_once() settings. nếu phải thì truy cập sẽ bị từ chối. Cuối cùng. 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ộ công cụ ảnh PHP. Xử lý đường dẫn Tại bước này. 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ộ nhớ đệm Trong những trường hợp yêu cầu khả năng mở rộng hệ thống cao. xử lý file. các phiên sẽ được khởi tạo hoặc thiết lập lại. 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. khởi tạo và xử lý form.. 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. 14 . Đến đây tất cả các module ở trạng thái bật cũng được nạp. đoạn mã dùng để xử lý đường dẫn và định danh được nạp. 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. 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.

module. Những công cụ này được cung cấp bởi 2 module chủ yếu. Ví dụ. 1. 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ý. được một yêu cầu về URL sẽ được ánh xạ đến hàm nội dung node_page_view() là ở trong node. 1. 1. phản hồi sẽ được gửi trả lại trình duyệt qua bộ phận giao diện. 1. Thông tin chi tiết về module này có ở: http://drupal.6. là module Devel và module Coder. gồm có quản lý bộ nhớ cache. nếu nhận http://example.com/q=node/3. có thể lấy từ trang web của Drupal. 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. công cụ dò lỗi SQL. dữ liệu thông qua xử lý hay dữ liệu tự tạo ra sang dạng HTML.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.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.Khi Drupal đã hoàn thành quá trình khởi động..5. Các module đăng ký hàm callback của mình bằng cách sử dụng hook menu.org/project/devel 15 . tất cả các thành phần của framework đều chuyển sang trạng thái sẵn sàng..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ông cụ thăm dò.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. 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. Cuối cùng. 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 đó. công cụ tham chiếu API. Lúc này.

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.2 Module Coder Cũng như một số framework khác. 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ủ. Ngoài ra. 16 . 1.Các công cụ trên được hiển thị dưới dạng các mục trong một Khối. 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ã. Thông tin chi tiết về module này có thể tìm tại trang: http://drupal.org/project/coder 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. 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. Vì thế.6. 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. 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. sau khi cài đặt module Devel. 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. Module này còn bao gồm các công cụ để xây dựng giao diện.

Chương này sẽ tập trung tìm hiểu cách viết một module cho Drupal. 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ị. 2.info được viết theo kiểu của file PHP INI. 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. Điều này dẫn đến việc mỗi khi có bản cập nhật.info có dạng như sau: name = “Google Maps” description = “Displays a map using Google Maps API” core = 6. một định dạng file dùng cho việc xác định các thiết lập.x php = 5.Xây dựng module cho Drupal Trong nhiều ứng dụng mã nguồn mở.1.Chương 2 .info Trước khi thực sự đi vào viết mã cho một 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. <tenmodule> 2. Mọi thay đổi và sự mở rộng được thực hiện thông qua các 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 đó. 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ã.info và một tập tin <tenmodule>.1 File .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>.1 Trường name khai báo tên của module. File . Nội dung một file .info và .1 File . Drupal hoạt động theo một cách khác. tên này không được trùng với các module đã tồn tại trong hệ thống. Ví dụ: 17 .module trong đó là tên của thư mục chứa module được tạo.

Giá trị 6. các module phức tạp hơn còn có thêm một số trường thông tin trong file . cho biết phiên bản tối thiểu của Ngoài ra. Drupal sẽ tự động đặt giá trị này một cách hợp lý.Hình 2. Sau khi có file . cách nhau bằng khoảng trống. . Trong nhiều trường hợp. bao gồm các phiên bản nâng cấp từ bản 6.Package: nhóm các chức năng của module. 18 . Minh họa giao diện hiển thị tên module Trong hình trên. 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. Trường thông tin thứ ba là core. chúng ta bắt đầu việc viết mã cho module trong file . nếu không khai báo package thì module được đưa vào nhóm “other”. Aggregrator và Blog được lấy từ giá trị của trường name trong file .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.module. Name và description là hai trường bắt buộc phải có trong file . mô tả chức năng.1. Mục này chỉ rõ module sẽ hoạt động tốt trên phiên bản nào của Drupal. Tiếp theo là phần description chứa thông tin thêm về module. . nhiệm vụ mà module sẽ thực hiện.info của các module tương ứng.info.x cho biết module này yêu cầu phiên bản Drupal 6.1.info như: .info trên là php. Chỉ dẫn cuối cùng trong file PHP mà module yêu cầu.Dependencies: các module phụ thuộc.info. nhưng những người phát triển làm việc với CVS (Concurrent Version System .

module được đặt tên theo quy tắc <modulename>.2.info.module là file quan trọng nhất trong một module. dưới đây là chú thích của module GoogleMaps: /** * @file * Module for displaying a map from Google Maps. Ví dụ. 2. file này sẽ không chứa dấu đóng ?>. 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. 19 .2 Chú thích trong mã nguồn Như đã đề cập ở trên.2 File . 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. Mã nguồn chi tiết của file này sẽ được đề cập trong những phần tiếp theo. 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ý. Theo quy ước của Drupal. 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ẽ. file .1.org/coding-standards. Mở đầu các module và hàm trong đó. Một trong số đó là chuẩn viết chú thích trong mã nguồn.module bắt đầu bằng thẻ <?php. ở 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. Ví dụ. sau đó là mã nguồn. Nội dung file .module File . 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. * @see http://map. 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 đó. trong đó <modulename> là tên thư mục chứa module.com */ Phần này chính là tài liệu cho API. Xem chi tiết tại http://drupal. chứa các đoạn mã PHP thực hiện chức năng của module đó.module. * This module provides block content retrieved from * Google Maps data.google. Cũng giống như file .

bao gồm thông tin về loại dữ liệu. theo sau là các dòng chú thích chi tiết hơn. Trong ví dụ. người phát triển có thể sử dụng những chương trình phân tích tài liệu như Doxygen để trích ra làm tài liệu dành cho người dùng. which it then attempts to format * for display. 2. Từ những chú thích này. nguồn dẫn là một địa chỉ URL. Một định danh khác được sử dụng cho chú thích hàm là @return cho biết giá trị mà hàm sẽ trả về. and * retrieves XML data.Hook block: 20 . * @param $num_items * Number of items to include in results. */ Khối này bắt đầu bằng một câu khái quát về chức năng của hàm. * @return * String containing the bookshelf. hằng số và biến cũng được tham chiếu bởi định danh @see. Từ khoá định danh @param được dùng để mô tả về các tham số mà hàm này sử dụng. Định danh @see chỉ dẫn bộ xử lý tài liệu liên kết file này đến thông tin ở các nguồn khác. * * @param $url * URL to the goodreads bookshelf. Các hàm. Khi chú thích cho một hàm. Từ khoá này được khai báo theo theo định dạng: @param <tên_biến> <mô tả>.3 Một số hook cơ bản . * * This makes an HTTP connection to the given URL. Trong các trường hợp này. Ví dụ: /** * Retrieve information from the Goodreads bookshelp XML API. Định danh @file cho biết khối này sẽ chú thích cho toàn bộ file. không phải cho riêng một hàm hay biến ở trong file. các định danh khác sẽ được sử dụng.Trong ví dụ trên có hai định danh là @file và @see. bộ xử lý tài liệu sẽ liên kết khối chú thích đến thông tin API của các đối tượng tương ứng.

Tham số $op chứa thông tin về loại thao tác mà module sẽ thực hiện. Bằng cách sử dụng $delta. hàm sẽ trả về một mảng chứa thông tin của block (info). và tham số $arg chứa một số thông tin thêm. Giá trị trả về của hàm này phụ thuộc vào thao tác mà nó thực hiện.Hook này được sử dụng để tạo một block hiển thị thông tin. view: Giá trị này được truyền vào khi Drupal muốn hook block cung cấp thông tin để hiển thị cho người dùng. Với các trường hợp phức tạp. Khi hook_block được gọi. configure: Dùng để điều chỉnh các thiết lập cho block. tiêu đề (subject) và nội dung (content). một hàm hook_block() có thể hiển thị nhiều block khác nhau. tham số $op sẽ được đặt là list. lập trình viên có thể sử dụng phát biểu switch đối với giá trị của $path để trả về các văn bản trợ giúp khác nhau đối với mỗi đường dẫn. Nội dung nào trong block sẽ được sử dụng tuỳ thuộc vào giá trị của $delta được truyền vào. Tham số này chứa các thông tin thêm về nội dung sẽ hiển thị trong block. trong đó <module name> được thay bằng tên của module tương ứng. $edit thực chất là một mảng chứa các thay đổi mà người quản trị thực hiện lên các thiết lập của block. Khi $op có giá trị là view thì $delta sẽ được đặt. save: Giá trị này được dùng khi thông tin về thiết lập của block lấy từ form dữ liệu sinh ra bởi configure cần được lưu lại. Giá trị này tuân theo định dạng admin/help#<module name> . Hàm hook_help() nhận hai tham số: $path chứa một đoạn URI cho biết trang trợ giúp nào được gọi. Tham số $delta được đặt phụ thuộc vào các thao tác nhất định của module. Cuối cùng là tham số $edit. Thông thường. $delta và $edit. . Tham số này có thể nhận một trong 4 giá trị sau: list: Giá trị này được dùng khi module cung cấp thông tin về chính nó.Hook help: Hook này được dùng để cung cấp các thông tin trợ giúp cho người sử dụng. Ví dụ. được sử dụng trong quá trình điều chỉnh các thiết lập của block (khi thao tác save được gọi). Kết quả của hàm này được hiển thị tại mục Administer | Help page: 21 . ở danh sách các module hiển thị trong khu vực quản trị. Drupal sẽ truyền 3 tham số vào hàm: $op.

Tham số này nhận 1 trong 13 giá trị tương ứng với 13 thao tác (view..3. Một bản triển khai của hook_user() sẽ nhận 4 tham số sau: $op: Tên của thao tác mà người dùng thực hiện. delete.com/drupal/?q=user/3. .b. mỗi người dùng đã đăng ký đều có thể truy cập trang My account để xem thông tin tài khoản của họ.Hook user: Mặc định. Giao diện thông tin tài khoản người dùng Trang thông tin người dùng cũng có thể được truy cập bởi một người quản trị có quyền tương ứng. sửa chữa hoặc xoá bộ ghi nhớ đăng nhập. Giá trị này được truyền vào qua tham chiếu &$edit và được sử dụng bởi các thao tác xử lý dữ liệu như insert.Hình 2. Bằng cách triển khai hook này trong module. người phát triển có thể liên kết với giao diện quản lý người dùng. Người dùng sẽ thấy những thông tin sau: Hình 2. 22 .). bao gồm việc thêm. hook người dùng làm được nhiều việc hơn là hiển thị trang tài khoản người dùng. Phần lớn nội dung của trang này được tạo ra bởi hook_user().3. Minh họa nội dung sử dụng hook_help(). Thực ra.. Trong Drupal 6 có 13 thao tác mà hook này thực thi. Địa chỉ URL của trang này có dạng: http://example. $edit: Một mảng chứa các giá trị được gửi lên từ một form.a. login.

nhưng vào thời điểm trước khi node được hiển thị. Việc triển khai hook này cho phép thiết lập các phần đầu và thân của thông điệp trước khi gửi đi. .org/api/function/hook_user/6. thông tin của nó có thể được cập nhật bằng cách sử dụng hook_view().drupal. Tham số này cũng được truyền qua tham chiếu &$account. người phát triển có thể tuỳ chỉnh định dạng của thông điệp.$account: Dùng để chứa đối tượng tài khoản cho một người dùng nhất định. hook này sẽ cung cấp thêm thông tin cho hệ thống giao diện để có thể biểu diễn nội dung như mong muốn của người dùng. Khi hàm triển khai hook mail được thực thi. Tham số này phải được truyền dưới dạng tham chiếu &$message nếu muốn thay đổi giá trị. Đồng thời. $category: Một vài thao tác sử dụng tham số này để xác định phần nào của thông tin người dùng sẽ được trích xuất cho yêu cầu.Hook mail: Phần lớn các yêu cầu về việc gửi email trong Drupal đều được hỗ trợ bởi các hàm có trong Mail API nên người phát triển không cần phải viết mã cho những thao tác này. Tuy nhiên. Hàm triển khai của hook này sẽ nhận 3 tham số: $node chứa đối tượng node cần hiển thị.Hook view: Trước khi một node được hiển thị đến người dùng. tuỳ theo yêu cầu. 23 . . $key: $message: Là cấu trúc dữ liệu thể hiện thông điệp mà Drupal đã khởi tạo trước đó. nó sẽ truyền 3 tham số sau: Một khoá dạng chuỗi dùng để xác định thông tin về việc thông điệp sẽ được định dạng như thế nào. $params: Một tập các tham số được truyền vào từ lời gọi hàm drupal_mail() của module. và việc này được thực hiện thông qua hook_mail(). Hook này được gọi khi hệ thông nạp một đối tượng $node. Hàm này sẽ cần thiết trong một số trường hợp mà nội dung của node có thêm một số trường thông tin Drupal chưa xử lý được. Chi tiết về hook này xem tại địa chỉ http://api.

thay cho việc thao tác với từng thành phần riêng $node->body và $node->teaser.drupal. $teaser cho biết node này sẽ hiển thị ở trang riêng hay không. Nếu $page có giá trị TRUE. Giống như các hook khác. tiêu đề của node sẽ không được hiển thị.Hook menu: Chức năng cơ bản của hook_menu() là cho phép người phát triển module đăng ký một URI nhất định (hoặc chi tiết hơn là một đường dẫn URL tương đối) và ánh xạ URI đó với một hàm xử lý. một bản triển khai của hook_menu() trả về một mảng. chúng tôi sẽ xem xét kỹ cơ chế hoạt động của hook bằng cách tạo một hook riêng và triển khai vào các module. Các node được chuẩn bị cho việc hiển thị bằng cách tập hợp một mảng có cấu trúc trong $node->content.org/api/function/hook_view/6.4 Định nghĩa một hook mới Trong phần này.là cờ đánh dấu cho biết bài viết sẽ được hiển thị đầy đủ hay chỉ có bản tóm tắt. 24 . trong trường hợp này là mảng các mục thực đơn sẽ được đăng ký với nhân của Drupal. Mảng liên kết này sẽ chứa một địa chỉ thực (giá trị) cho mỗi đường dẫn được đăng ký trước (khoá). $page Giá trị trả về của hàm khai triển hook_view() chính là $node. Tham số này nhận giá trị Logic. Việc này được thực hiện bằng cách ánh xạ các hàm callback. Drupal sẽ xác định cách chuyển một yêu cầu từ máy khách tới đường dẫn tương ứng để xử lý. . Dựa vào những tham số cấu hình này. Mục đích của việc định nghĩa hook riêng là giúp người phát triển module có thể chỉ định nội dung sẽ được đưa vào bản tin và cách hiển thị chúng. 2. TRUE hoặc FALSE. Chi tiết của hook này xem thêm tại địa chỉ http://api. Tham số này sẽ được thay đổi nếu cần thiết để có thể được biểu diễn một cách chính xác. Hook này thường được dùng để tạo các thực đơn cho trang quản lý của module.

If #title * is set. hàm này sẽ không được gọi đến mà chỉ đóng vai trò làm mẫu.4. Cách thứ hai là tạo ra một hàm hook trong mã nguồn.#title: A title for the text content * * Weight and content are required. Nhưng để thuận tiện hơn cho những người phát triển sử dụng sau này. * * This should return an array of items: * <code>array('item_name' => $item)</code> * An item is an associative array with the following * fields set: * * .2. Có một số cách để làm cho hook trở nên dễ sử dụng và triển khai. * * @return * A content array. '#title' => t('Sample Title'). '#body' => t('Sample content') 25 . thậm chí chỉ cần một dòng mã. */ function hook_sitenews() { $content['report'] = array( '#weight' => 0. Cách thứ nhất là thêm các thông tin chi tiết về hook vào trong khối tài liệu của đoạn mã. then it will be added as a title.#content: Text content * . Ví dụ: /** * Use this hook to build content for a sitenews message.1 Cách tạo một hook Việc định nghĩa một hook mới rất đơn giản. hook nên được định nghĩa một cách chi tiết.#weight: An integer from -10 to 10 * .

). Drupal sẽ kiểm tra xem ngôn ngữ mà người dùng lựa chọn 26 . Bản triển khai của một hook phải được đặt theo quy tắc <modulename>_<hook_name>() và có các tham số trùng với phần khai báo của hook. được sử dụng để hỗ trợ chức năng đa ngôn ngữ. } Nhiệm vụ chính của hàm này là làm mẫu để hướng dẫn người dùng sử dụng hook_sitenews(). nhận lời gọi hàm Nó sẽ không được gọi trong mọi trường hợp. $content['another report'] = array( '#weight' => 0. Phần mã nguồn được thiết kế để thể hiện cách tạo một bản triển khai mà người phát triển nên tuân theo.Hàm chuyển đổi ngôn ngữ t(): Đây là hàm chuyển đổi ngôn ngữ trong Drupal. '#body' => t('More sample content') ). 2. Ví dụ: function biography_sitenews() { //code goes here } Các hook được định nghĩa trong một module có thể được triển khai trong module khác và module chứa khai báo hook phải được bật. đồng thời cung cấp một cách thức chuẩn trong việc thay thế văn bản. Khi hàm t() được gọi. 2. return $content.4. '#title' => t('Another Sample Title'). kể cả khi hệ thống module_invoke() hay module_invoke_all() vì tên hàm không tuân theo quy tắc <modulename>_<hookname>.5 Một số hàm quan trọng trong thư viện hàm của Drupal .2 Sử dụng hook vào các module khác Việc sử dụng hàm hook tự định nghĩa vào trong module cũng giống như đối với các hook có sẵn của Drupal. Phần tài liệu trong khối chú thích mô tả một cách chi tiết chức năng của hàm hook cho người phát triển.

’ và muốn hàm t() dịch nghĩa xâu này.’. Xảy ra lỗi.có khác với ngôn ngữ mặc định (Anh-Mỹ) hay không. toàn bộ xâu sẽ được dịch nghĩa. Tham số đầu tiên xác định danh mục của bản ghi. module Content translation phải được bật. hàm t() nhận chỉ một tham số vào là xâu chứa thông điệp cần chuyển đổi. các module sẽ sử dụng tên của module làm danh mục để có thể dễ dàng tìm kiếm các bản ghi sau này. cung cấp cơ Hàm watchdog() nhận 4 tham số. Trong ví dụ trên. Khi đó. khi cần thêm một địa chỉ URL vào trong một xâu: ‘Trying to access !url. Thông thường. WATCHDOG_ALERT: Nhắc nhở người dùng cần thực hiện một việc nào đó ngay lập tức.com’)).Hàm watchdog(): Một hàm khác nằm trong bộ nhân của Drupal là hàm chế ghi biên bản cho Drupal. Để Drupal hỗ trợ đa ngôn ngữ. và một mảng liên hợp ánh xạ cờ giữ chỗ và giá trị thay thế. đồng thời thay thế URL tương ứng vào vị trí của !url. hàm sẽ nhận các dữ liệu thêm vào. Tham số thứ hai và thứ ba gồm có thông điệp dưới dạng văn bản. Tham số cuối cùng là một hàng số. và một mảng liên hợp có giá trị khoá sẽ được thay thế vào thông báo. Tham số này lấy 1 trong 8 giá trị sau: WATCHDOG_EMERG: Hệ thống lúc này đang trong tình trạng không ổn định. Nếu có thì Drupal sẽ cố gắng dịch xâu đầu vào sang ngôn ngữ người dùng chỉ định. watchdog(). Ví dụ. Trong những trường hợp đơn giản. hàm t() được sử dụng như sau: t(‘Trying to access !url. xác định quyền ưu tiên dành cho bản ghi đó. 27 .com. Nếu ngôn ngữ lựa chọn là tiếng Anh. t() nhận 2 tham số: xâu cần dịch nghĩa. Lúc đó. hàm trên sẽ cho ra kết quả: Trying to access http://example. . array(‘!url’=>’http:///example. WATCHDOG_CITICAL: WATCHDOG_ERROR: Thông báo tình trạng nguy cấp. Nhưng trong một số trường hợp khác.

WATCHDOG_NOTICE: WATCHDOG_INFO: Một sự kiện quan trọng (nhưng không ảnh hưởng xấu) xảy ra. không chỉ riêng truy vấn. Mặc định. Thông tin thêm về jQuery có tại địa chỉ 28 http://jquery. Mức độ ERROR và WARNING thường được sử dụng bởi các nhà phát triển module để ghi lại lỗi. Tuy nhiên. Đồng thời với việc ghi lại biên bản trong hệ thống. trang web nên hiển thị thông báo tới người dùng. CRITICAL và EMERG) không nên sử dụng trừ khi hệ thống đang trong tình trạng xấu.6 Sử dụng Javascript và AJAX/JSON 2. Điều này được thực hiện bằng cách trả về một chuỗi chứa thông báo: return t(“This page is not accessible”). Nó có một bộ công cụ AJAX. hiệu ứng ảo và một số hàm tiện ích khác.1 Giới thiệu về jQuery jQuery là một trong số các thư viện JavaScript mạnh mẽ hiện nay.com . Hầu hết các module không chứa các đoạn mã đủ để gây ra vấn đề nghiêm trọng cho Drupal. WATCHDOG_DEBUG: Thông tin về việc gỡ lỗi sẽ được ghi lại. jQuery được sử dụng trong nhiều trường hợp. thường là HTML hoặc XML. Sử dụng một mô hình thiết kế hướng đối tượng là Fluent Interface. Văn bản này sẽ được biểu diễn dưới dạng cây với thành phần đầu tiên là gốc. Một cây DOM (Document Object Model) là một cấu trúc dữ liệu định nghĩa nên cấu trúc của một văn bản. vì thế 3 mức độ trên cùng (ALERT. jQuery cho phép liên kết một chuỗi các lời gọi hàm với nhau để tạo nên các truy vấn phức tạp. công cụ xử lý sự kiện. DOM được biết đến là một mô hình đối tượng phức tạp. các bản ghi được lưu vào trong cơ sở dữ liệu. Bên cạnh việc ghi biên bản các sự kiện. Thông thường. 2.WATCHDOG_WARNING: Cảnh báo xảy ra sự cố không mong đợi nhưng không gây ra vấn đề nghiêm trọng. Người quản trị có thể xem lại bằng cách truy cập vào mục Administer | Logs. jQuery truy vấn tới cây DOM. jQuery cung cấp một API nhẹ hơn và dễ sử dụng hơn cho người lập trình. người phát triển có thể thực hiện các thao tác liên quan bằng cách triển khai hook_watchdog() mà Drupal cung cấp.6. Cho biết thông tin có thể được ghi lại.

đoạn mã jQuery sẽ là: $(". Trong trường hợp sử dụng lớp CSS. cách truy vấn trên sẽ không thực hiện được. "blue").6. XPath sử dụng trong văn bản XML.intro").fadeIn("slow"). 2. var jQuery = function(a.c) {. $("#intro"). #intro { background-color: blue.2. chúng ta sẽ sử dụng CSS để xác định đoạn văn bản thông qua ID #intro.6.1 Sử dụng bộ lọc ID của CSS Giả sử đoạn mã HTML cần thao tác là : <p id="#intro">Welcome to the World of Widgets</p> Nếu muốn đặt màu sắc cho nền của đoạn trong thẻ <p></p>.fadeIn("slow"). ví dụ: $("#intro").2. "blue").2 Sử dụng XPath Nếu một thành phần của trang HTML không được đánh dấu bằng ID hoặc bộ lọc lớp.2 jQuery hoạt động như thế nào Trong phần này.6. XPath là một giải pháp tốt để 29 .2.intro").css("background-color".css("background-color". giúp cho người phát triển không phải nhớ các ngôn ngữ khác nhau. jQuery triển khai cú pháp truy vấn sẵn có của CSS và XPath. 2. jQuery cũng có thể thực hiện một số hiệu ứng lên trang web. Lúc đó..css("background-color". ID này không được trùng với các ID khác trong cùng một trang.css("background-color".fadeIn("slow").} // Ánh xạ không gian tên jQuery đến ký hiệu “$” var $ = jQuery. hoặc: $("p. Thay cho việc tạo các cú pháp để tìm kiếm trong JavaScript. chúng tôi sẽ tìm hiểu cách jQuery tìm kiếm trong một văn bản có cấu trúc bằng cách sử dụng CSS và XPath. "blue"). "blue"). CSS được sử dụng cho một văn bản HTML hoặc XHTML.. } Việc này có thể được thử hiện bằng cách sử dụng jQuery như sau: // Định nghĩa biến jQuery như một hàm.

if(Drupal. Ngoài ra. }).jsEnabled) { // code goes here 30 . Tuy nhiên.fadeIn("slow").js nằm trong thư mục misc. XPath có phần linh hoạt hơn trong việc tạo các quy tắc để xác định thành phần trong HTML.Tìm các checkbox trong form: $(“input[@type=checkbox]”) Chi tiết về các biểu thức sử dụng trong XPath có thể xem thêm tại địa chỉ http://docs.jsEnabled() sẽ kiểm tra điều kiện này.thay thế. jQuery sẽ được cài đặt cùng với Drupal. Ví dụ: . ?> Tham số đầu tiên của hàm drupal_add_js() là đoạn mã JavaScript sẽ được thực thi.6.ready(function(){ $("p").com/DOM/Traversing/Selectors 2.Tìm các thẻ có thuộc tính target là _blank: $(“a[@target=_blank]”) .jquery. Hàm này có nhiệm vụ nhận mã JavaScript và thêm vào mã nguồn trang web. XPath còn hỗ trợ sử dụng biểu thức chính quy. Mã nguồn của jQuery được chứa trong file jquery.'. File này sẽ được nạp khi có lời gọi hàm drupal_add_js(). để đảm bảo rằng module hoạt động đúng như mong đợi. Tham số thứ hai (inline) cho biết Drupal sẽ ghi đoạn mã vào giữa hai thẻ <script></script> ở trong thẻ <head> của trang HTML. Nếu trình duyệt không hỗ trợ. vì thế việc sử dụng là khá dễ dàng.3 jQuery trong Drupal Mặc định. các thay đổi đối với HTML phía máy khách sẽ không được thực hiện. 'inline' ). Ví dụ: <?php drupal_add_js( '$(document). Thư viện JavaScript của Drupal có hàm Drupal. chúng ta cần phải đảm bảo các truy vấn jQuery chỉ chạy khi trình duyệt hỗ trợ JavaScript và AJAX.

• Không cần phải viết mã HTML mà chỉ cần khai báo các thuộc tính và giá trị của form. 31 . kiểm tra tính hợp lệ và trình bày form. xoá. • Mỗi thành phần trong một form có thể được liên kết với một hàm giao diện riêng.1 Quá trình thao tác với form Biều đồ dưới đây mô tả quá trình xây dựng. 2. Một số ưu điểm của bộ máy này: • Dễ sử dụng. Drupal cung cấp một API hỗ trợ việc tạo.} Giá trị trả về của hàm này là TRUE hoặc FALSE tương ứng với kết quả kiểm tra. Điều này thuận tiện khi muốn chỉnh sửa một form được tạo bởi module khác. • Các thao tác liên quan được bảo vệ tránh việc tấn công bằng cách thực hiện những thay đổi ảnh hưởng xấu đến hệ thống. Trong phần này.7 trở về sau. 2. • Dễ dàng thêm. • Có thể thêm các bước xác thực và xử lý riêng cho từng form. đảo thứ tự và thay đổi các form. chúng tôi sẽ tìm hiểu về Form API và ứng dụng vào một số ví dụ cụ thể.7 Form API Từ phiên bản 4.7. người phát triển phải biết được cách mà bộ máy phía sau API hoạt động. Để có thể sử dụng Form API một cách hiệu quả. API này biểu diễn các form bằng một mảng chứa các thuộc tính và giá trị. xác thực và xử lý form trong HTML.

1. Quá trình xử lý form 32 .Hình 2.7.

Một token giả ngẫu nhiên dựa vào khoá này để kiểm tra một form khi được gửi lên. Với mỗi node.. Hàm này sẽ thực thi hook_elements() trong tất cả các module có bản triển khai. Nếu không tìm thấy. duyệt qua mỗi cấp của cây biểu diễn form và xử lý từng node. • Thể hiện form trong HTML: Bộ xây dựng form sẽ gọi hàm drupal_render(). Các thành phần cơ bản như nút checkbox. • Tìm kiếm hàm kiếm tra giá trị: Một hàm kiểm tra giá trị có thể được gán bằng cách đặt thuộc tính #validate trong form vào một mảng với tên hàm là khoá và mảng khác làm giá trị. • Tìm kiếm hàm gửi form: Hệ thống sẽ tìm kiếm những hàm có thuộc tính #submit và thực thi. • Tập hợp thông tin các thành phần của form: Hàm element_info() sẽ được gọi. radio.module. 33 . Một module cũng có thể tự định nghĩa kiểu thành phần riêng bằng cách sử dụng hook_elements(). Khi khoá được tạo ra sẽ được lưu trong bảng variables với trường drupal_private_key. hàm drupal_render() sẽ phân tích thông tin của các thành phần có trong form và tạo ra mã HTML.Các bước trong quá trình xử lý: • Khởi tạo: hàm $form_values drupal_get_form() bắt đầu bằng việc khởi tạo giá trị (mảng chứa các giá trị được gửi lên) bằng rỗng và $form_submitted bằng FALSE. • Tìm hàm chuyển đổi giao diện cho form: Nếu giá trị $form[‘#theme’] được đặt trong một hàm. form sẽ được chuyển sang hàm form_builder() để xử lý thông qua một cây đệ quy và thêm các giá trị bắt buộc theo chuẩn. Drupal thực thi hàm có ID có. • Đặt ID: Một trường thông tin dạng ẩn chứa ID của form hiện tại sẽ được gửi đến trình duyệt. plus_submit nếu • Xây dựng form: Tại bước này. được định nghĩa trong system. Mỗi ID thường tương ứng với hàm định nghĩa của form và là tham số đầu tiên của drupal_get_form(). hàm theme_get_function() sẽ được gọi để xác định nếu có hàm giao diện cho form hiện tại. Đây là một hàm đệ quy. • Đặt một token: Drupal đặt giá trị khoá riêng cho mỗi bản cài đặt. Drupal sẽ sử dụng hàm đó. Nếu không..

2 Một số thao tác cơ bản 2.2. ?> Tạo một nút bấm gửi dữ liệu: <?php $form['submit'] = array( '#type' => 'submit'. Ví dụ: $form['account_settings']['username'] • Kiểu của thành phần form được khai báo qua thuộc tính #type.2.7. giá trị của khoá có kiểu xâu. '#value' => t('Save'). ).1 Tạo form Các thành phần của một form được khai báo trong một mảng có cấu trúc phân cấp và có thể ghép lồng nhau. ). Mỗi thành phần gồm có các cặp thuộc tính/giá trị. '#size' => 60. • Thứ tự khai báo các thuộc tính không quan trọng. '#maxlength' => 64. 34 . '#description' => t('baz'). '#default_value' => $object['foo']. '#title' => t('bar'). • Các khoá thuộc tính được khai báo trong dấu []. ?> Một vài điểm lưu ý: • Thuộc tính name của thành phần được khai báo trong mảng $form và nằm ở cuối mảng. Ví dụ sau định nghĩa một thành phần textfield: <?php $form['foo'] = array( '#type' => 'textfield'. Một số thuộc tính có giá trị mặc định.7.

tham số: là mảng chứa khai báo của form. Tên hàm phải được đặt theo quy tắc <formID>_validate. } } 35 . • Chèn thẻ đánh dấu trực tiếp vào form như một thành phần của form đó. thay vào đó. cho phép chỉ định hàm giao diện nào sẽ được áp dụng. '#prefix' => '<div class="foo">'.2. • Ghép các đoạn mã của từng thành phần trong form để hiển thị ra trang web. '#suffix' => '</div>'. Ví dụ: function test_form_validate($form. &$form_state) { if ($form_state['values']['name'] == '') { form_set_error(''.2. Ngoài các hàm có sẵn. nên sử dụng thuộc tính #default_value. t('You must select a name.')). Các thẻ đánh dấu có thể là #prefix. Ví dụ: $form['access'] = array( '#type' => 'fieldset'. '#title' => t('Access log settings'). $form $form_state[‘values’] Hàm này nhận hai chứa giá trị cần kiểm tra. Thẻ này dùng để chỉ định vị trí các đoạn mã thiết lập giao diện trong form. Ở bước này. thực hiện trên tất cả các form được gửi lên. hàm drupal_render() sẽ được gọi.• Không nên sử dụng thuộc tính #value cho các thành phần có thể được thay đổi bởi người dùng. 2. $form và $form_state.7.2 Giao diện hoá form Form API cho phép tuỳ chỉnh giao diện đối với từng form. thậm chí đối với riêng từng thành phần trong một form.7. ).3 Kiểm tra dữ liệu Form API có bước kiểm tra dữ liệu vào. Việc tuỳ chỉnh được thực hiện bằng cách nạp chồng các thành phần giao diện tại thời điểm tạo form: • Thêm thuộc tính #theme vào form chính hoặc các thành phần. #suffix hoặc #markup. 2. người phát triển cũng có thể tự tạo các hàm kiểm tra theo ý muốn.

hidden) VALUES ('%s'. $form_state['values']['hidden']). $form_state['values']['name'].7. Quá trình này được minh hoạ bởi hình dưới đây: 36 . 2. Drupal xác định file thiết lập CSDL sẽ tham chiếu tới và khởi động CSDL tương ứng. mysql hoặc pgsql phụ thuộc vào CSDL được Dựa vào đó.2.8 Làm việc với cơ sở dữ liệu Phần này sẽ giới thiệu sơ lược về cách kết nối và truy vấn CSDL trong Drupal. %d. log.')).php.4 Gửi form lên trang web Cách thức thông thường được sử dụng để gửi form lên là thông qua hàm.8. drupal_set_message(t('Your form has been saved. &$form_state) { db_query("INSERT INTO {table} (name. Một form được gửi lên bằng nút bấm có thuộc tính tới hàm tương ứng. Phương thức định nghĩa kết nối là sử dụng là MySQL hay PostgreSQL. 2. Ví dụ: type =&gt. 'submit' sẽ được truyền function test_form_submit($form.1 Định nghĩa các tham số trong CSDL Drupal xác định được CSDL.2. nằm trong thư mục Dòng thông tin định nghĩa kết nối tới CSDL có dạng: sites/default. $db_url = 'mysql://username:password@localhost/databasename'. '%s')". } Hàm gửi dữ liệu chỉ được gọi khi nhận lệnh từ nút bấm submit có phương thức POST và dữ liệu được kiểm tra hợp lệ. tài khoản và mật khẩu của người dùng khi thiết lập kết nối bằng cách phân tích file settings. $form_state['values']['access']['log'].

Quá trình thao tác với CSDL.inc’) drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE) sau đó gọi để tạo kết nối. sau đó thực hiện truy vấn bằng hàm db_query().8. có giá trị .2 Một số truy vấn đơn giản Drupal cung cấp hàm db_query() để thực thi một truy vấn tới kết nối đang hoạt động.8. Dưới đây là một số ví dụ. INSERT. UPDATE và DELETE.1. Lấy tất cả các hàng của một trường từ bảng bằng $node->vid: 37 joke có vid là số nguyên. Những truy vấn được hỗ trợ bao gồm SELECT. Một đoạn mã bên ngoài muốn truy cập vào CSDL của Drupal sẽ phải gọi include_once(‘includes/bootstrap.Hình 2. 2.

$node->nid).8. Xoá các hàng trong bảng joke punchline có cột nid = '%s' WHERE vid = chứa giá trị nguyên bằng với %d". punchline) VALUES (%d. 2.8. Lấy một giá trị: Nếu muốn kết quả trả về chỉ một giá trị thì có thể sử dụng hàm db_result().db_query('SELECT * FROM {joke} WHERE vid = %d'. Các hàng thoả mãn điều kiện này sẽ thay đổi bằng cách đặt trường punchline bằng giá trị của xâu chứa trong $node->punchline: db_query("UPDATE {joke} SET $node->punchline. Hàng mới chứa 2 giá trị nguyên và một xâu ký tự: db_query("INSERT INTO {joke} (nid. %d. tên bảng phải được đặt trong dấu {}. Dưới đây là bảng ký hiệu giữ chỗ và kiểu dữ liệu Hình 2. Quy ước này cho phép những người dùng bị giới hạn số lượng CSDL tạo ra có thể cài đặt Drupal trong một CSDL có sẵn mà không bị xung đột. '%s')".3 Lấy kết quả truy vấn Có nhiều cách khác nhau để lấy kết quả truy vấn.$node->nid. vid.2. $node->vid. Bảng ký hiệu giữ chỗ trong truy vấn CSDL.$node->vid). $node- >nid: db_query('DELETE FROM {joke} WHERE nid = %d'. Đầu tiên. 38 . Cập nhật tất cả các hàng trong bảng joke có trường vid là số nguyên có giá trị bằng $node->vid. Ở ví dụ trên. %d sẽ tự động được thay thế bằng giá trị thay thế: $node->nid tương ứng. Tiếp theo là cờ giữ chỗ trong truy vấn. Chèn một hàng mới vào bảng joke. Drupal đặt ra một số quy tắc về cú pháp trong phát biểu SQL. $node->vid). $node->punchline).

Trong trường hợp này. chúng ta có thể sử dụng hàm db_fetch_array() thay cho db_fetch_object().$sql = "SELECT COUNT(*) FROM {node} WHERE type = 'blog' AND 1". Trả về nhiều hàng: Với kết quả là một tập gồm nhiều hàm. 10). while ($data = db_fetch_object($result)) { //code goes here } Để nhận được kết quả là một mảng. Giới hạn phạm vi kết quả: Với những truy vấn cho ra rất nhiều hàng. 0. hàm db_query_range() được sử dụng thay cho điều kiện LIMIT vì không phải tất cả CSDL đều hỗ trợ cú pháp LIMIT. hàm db_fetch_object() giúp chọn ra từng hàng để xử lý. $sql = "SELECT * FROM {node} WHERE type = 'blog' AND status = 1". có thể giới hạn phạm số lượng như sau: $sql = "SELECT * FROM {node} n WHERE type = 'blog' AND status = 1 ORDER BY n. $result = db_query(db_rewrite_sql($sql)). 39 . $result = db_query_range(db_rewrite_sql($sql).created DESC". status = $total = db_result(db_query($sql)).

Mỗi khi muốn nhúng bản đồ của Google vào trang web. xyz được thay bằng khoá API. chúng tôi sẽ giới thiệu sơ lược về dịch vụ Google Maps.org) Địa chỉ chính thức của Google Maps: http://maps. 40 .google.1 Giới thiệu về Google Maps Google Maps (trước đây được gọi là Google Local) là một ứng dụng dịch vụ bản đồ web và công nghệ miễn phí được cung cấp bởi Google. và những địa điểm kinh doanh trong khu vực cũng như khắp nơi trên thế giới. 3.Chương 3: Xây dựng module tích hợp Google Maps vào Drupal Với lý thuyết đã nêu ra ở những phần trên của khoá luận. cho người đi bộ hoặc xe hơi. 3. Nó cho phép hiển thị bản đồ đường xá. trang web có thể sử dụng các hàm và đối tượng được cung cấp trong API của Google Maps.html. chúng tôi sẽ ứng dụng vào thực tế bằng cách xây dựng một module cho Drupal. (Theo wikipedia. Trước hết. Module này có tên là Google Maps. có thể dùng để nhúng vào các trang web của bên thứ ba thông qua Google Maps API.google. Google Maps cung cấp các cách thể hiện bản đồ khác nhau gồm có bản đồ ranh giới.com.com/apis/maps/signup. Google cung cấp một khoá API riêng. Khoá này có thể đăng ký miễn phí tại http://code. trong thẻ khai báo chèn file JavaScript: <head> phải <script src=http://maps. Với mỗi người phát triển. bản đồ vệ tinh và bản đồ dạng 3 chiều. Lúc này. Giao diện của chương trình rất thân thiện với người dùng. Người dùng không cần phải tìm kiếm và quản lý dữ liệu hay thiết lập máy chủ mà chỉ cần viết một ít đoạn mã JavaScript.google.com/maps?file=api&v=2&key=xyz type="text/javascript"></script> Trong đó. đường đi cho xe đạp.2 Nhúng bản đồ vào trang web Việc nhúng bản đồ vào trang web được thực hiện Google Maps API. có chức năng hiển thị bản đồ trên trang web.

Tài liệu chi tiết về các dịch vụ của Google Maps API cũng như tính năng cao cấp có thể tham khảo tại địa chỉ: http://code. 41 . -104. </script> Ví dụ trên sẽ cho kết quả như sau: Hình 3.754286. //zoom levels 0-17+.google.1. 0 == world map.getElementById("map")).2. 16).setCenter(new GLatLng(39. height: 400px"></div> <script type="text/javascript"> var map = new GMap2(document.com/apis/maps/documentation. việc nhúng bản đồ trên một trang web được thực hiện bằng cách sử dụng một thẻ <div> giữ chỗ và dùng JavaScript hiển thị bản đồ vào vị trí đó. Ví dụ: <div id="map" style="width: 500px.1 Tạo một bản đồ đơn giản Thông thường.2.3.994637). Phần bản đồ hiển thị được gán vào đối tượng map dựa vào toạ độ của điểm trung tâm. Minh họa trang web tích hợp bản đồ Google Maps.

• Tạo đối tượng chuyển đổi địa chỉ sang tọa độ GClientGeocoder. chúng ta tạo ra được một đối tượng điểm và hiển thị lên bản đồ. Cả hai module này đều được phấn phối miễn phí. Phần tiếp theo sẽ mô tả các đoạn mã mà tác giả khóa luận viết trong quá trình xây dựng module. • Truy vấn CSDL để lấy trường thông tin đã thêm vào.Chuyển đổi giữa địa chỉ và toạ độ Google Maps API cung cấp một dịch vụ rất hữu ích là Geocoder. Module Content cho phép người quản trị tạo các kiểu nội dung mới. Ý tưởng xây dựng module: • Lấy node id của bài viết hiện tại.1. giúp xác định toạ độ tương đối khi biết một địa chỉ trên trên thế giới và ngược lại. • Truyền tọa độ nhận được vào một hàm tạo điểm trên bản đồ.3. Toạ độ phân tích được gồm Kinh độ (longitude) và Vĩ độ (latitude).info Nội dung file . chúng tôi đã sử dụng lại 2 module do cộng đồng Drupal phát triển là module Content có trong gói CCK (Content Construction Kit) [5] và module Example fields [6]. • Sử dụng các giá trị ẩn trong form truyền dữ liệu vào JavaScript.info gồm có: .1 Module Google Maps 3.2 Dịch vụ Geocoder .3. Trong quá trình xây dựng module này. 3.2. • Sử dụng chức năng đánh dấu địa điểm marker để chú thích điểm trên bản đồ.3 Xây dựng module Google Maps cho Drupal Module mà chúng tôi xây dựng có chức năng hiển thị bản đồ số trong một khối đối với các bài viết dạng Blog.3. Module Example fields được dùng để thêm các trường thông tin cho bài viết.1 File . Từ đó.$Id$ 42 . Mỗi bài viết tương ứng với một mảnh bản đồ riêng dựa vào thông tin địa chỉ chứa trong bài đó. • Hiển thị bản đồ bằng cách đặt điểm vừa tạo làm trung tâm. 3. • Tạo đối tượng bản đồ GMap2 hiển thị vào trong thẻ <div> đã khai báo.

3. Thực hiện tạo một mục có dạng Blog entry sẽ xuất hiện thêm một trường như trong hình: 43 .3.1.3.x php = 5. Để bản đồ chỉ hiển thị trong các bài viết. $delta=0. Khi đó JavaScript có thể tìm kiếm thành phần HTML thông qua ID và thay thế nội dung: var map = new GMap2(document.1 dependencies[] = content Khai báo dependencies cho biết module Google Maps phụ thuộc vào module Content.module File này sẽ triển khai hook_block() có sẵn trong Drupal để hiển thị bản đồ trong một khối. chúng tôi sử dụng bộ xây dựng nội dung CCK để thêm một trường thông tin address vào kiểu nội dung Blog. $block['content'] = "<div id=\"map_canvas\" style=\"width:600px.name = "Google Maps" description = "Displays a Google Maps form in a block" core = 6. Nếu địa chỉ có chứa node/x thì đoạn mã hiển thị bản đồ sẽ được thực thi. } Giá trị trả về của hàm này là một mảng $block chứa tiêu đề (subject) và nội dung (content) của khối.2 File . 3. $hInfo. Để hiển thị bản đồ trong khối này. $hTitle . module thực hiện quá trình phân tích và kiểm tra địa chỉ URL của trang hiện tại.1. $hAddr . height:400px\"></div>" .3 Tạo thêm trường thông tin cho bài viết Để hiển thị các mảnh bản đồ khác nhau cho mỗi bài viết. Muốn module này hoạt động thì người quản trị phải bật module Content trong gói CCK. $edit=array()) { return $block. function googlemaps_block($op='list'.getElementById("map_canvas")). chúng tôi sẽ gán giá trị cho $block[‘content’] là một thẻ <div> có ID là map_canvas để xác định vị trí đặt bản đồ.

Giá trị này được lưu trong CSDL và có thể lấy ra thông qua node ID.Hình 3. $nid = (arg(0)=='node' && is_numeric(arg(1)))?arg(1):0. nid Khi lấy được giá trị của trường này.3.1. Giao diện tạo Block entry. $sql = "SELECT field_addr_value FROM content_type_blog WHERE = $nid".3.a. module sẽ truyền qua JavaScript và sử dụng dịch vụ Geocoder của Google Maps API để phân tích ra tọa độ và hiển thị ra khung bản đồ. 44 .

b.Hình 3.3.3.1. Giao diện bài viết cùng với Block hiển thị bản đồ. 45 .

. Tuy nhiên. chúng tôi đã tìm hiểu và trình bày một số vấn đề lý thuyết liên quan đến việc xây dựng module cho hệ quản trị nội dung Drupal. chúng tôi đã thiết kế thành công một module dùng để nhúng bản đồ từ Google Maps vào mỗi bài viết kết hợp với hai module miễn phí là CCK [5] và Example fields [6]. đây mới chỉ là bước đầu trong kế hoạch xây dựng một hệ thống tích hợp dịch vụ hướng vị trí vào website một cách hoàn thiện. chúng tôi có ý định tiếp tục nghiên cứu và phát triển module đã trình bày ở trên và thêm các tính năng nâng cao như kết hợp với cơ sở dữ liệu ảnh chụp để để hiển thị đường phố. Sau khi hoàn thành khoá luận.Kết luận Trong khoá luận này. đầy đủ tính năng. 46 . Chúng tôi hy vọng khoá luận đã đúc kết được một lượng kiến thức đủ để phục vụ cho việc tìm hiểu về Drupal cũng như xây dựng module một cách dễ dàng. phong cảnh hay sử dụng hình ảnh 3 chiều tạo ra không gian ảo cho từng địa điểm. Dựa vào đó. địa danh..

http://code. 47 .org/project/cck. Google Maps API v2 . Building powerful and robust websites with Drupal 6. PACKT Publishing. Learning Publishing. 2006. http://drupal. Drupal Community. [5] Module CCK. [3] Matt Butcher.com/articles/creatingcustom-cck-fields. Drupal 6 Module Development. [4] Scott Davis. Google Inc. 2008. 2007. VanDyk và Matt Westgate. [2] John K. http://www. The Pragmatic Bookshelf.google. Karen Stevenson. Pro Drupal Development.lullabot.com/apis/maps/documentation. Apress. PACKT [6] Module Example. [7]Google Maps API Documentation. 2008.Tài liệu tham khảo [1] David Mercer.Adding Where to your applications.

1. Vào Administer | Content management | Content types.a. Example fields và Google Maps trong trang quản trị. Trong mục Blog entry chọn manage fields. Bật các module trong trang quản trị. Hình A. Bước 3: Thêm trường thông tin Địa chỉ cho loại nội dung Blog entry.Phụ lục A A. Bước 2: Bật các module liên quan gồm Content. 48 . Thêm một trường mới với các thông tin sau: • Label: Địa chỉ. • Field name: field_addr.1 Cài đặt module Google Maps Bước 1: Copy thư mục googlemaps vào thư mục modules trong bộ cài đặt Drupal.

• Form element to edit the data: Example widget. cấu trúc một Blog entry sẽ có các trường sau: Hình A. module đã sẵn sàng để sử dụng. 49 .b. Đến đây.• Type of data to store: Example field. Các trường thông tin của Blog entry.1. Sau khi thêm trường mới vào.

Những thông số còn lại giữ nguyên.2 Chạy thử chương trình Môi trường mà chúng tôi dùng để chạy thử module đã viết như sau: • Hệ điều hành: Windows 7 Ultimate. 50 . Nhấn Save. Kết quả nhận được là bài viết cùng với bản đồ như hình dưới. • SQL server: MySQL. Tạo Blog entry mới để chạy thử chương trình. Tạo một Blog entry mới như sau: Hình A.A. • Server: localhost • Web server: Apache.3.6.a. • Trình duyệt: Mozilla Firefox 3.2.

b. Kết quả chạy thử chương trình.Hình A.2. 51 .

Sign up to vote on this title
UsefulNot useful