Đề tài Tìm hiểu cách xây dựng module cho Drupal và các vấn đề liên quan

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

pdf57 trang | Chia sẻ: oanh_nt | Lượt xem: 2632 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Tìm hiểu cách xây dựng module cho Drupal và các vấn đề liên quan, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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 .info và một tập tin .module trong đó 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 .module, trong đó 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ý. 20 Trong ví dụ trên có hai định danh là @file và @see. Đị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. Đị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. Trong ví dụ, nguồn dẫn là một địa chỉ URL. Các hàm, hằng số và biến cũng được tham chiếu bởi định danh @see. Trong các trường hợp này, 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. Khi chú thích cho một hàm, các định danh khác sẽ được sử dụng. Ví dụ: /** * Retrieve information from the Goodreads bookshelp XML API. * * This makes an HTTP connection to the given URL, and * retrieves XML data, which it then attempts to format * for display. * * @param $url * URL to the goodreads bookshelf. * @param $num_items * Number of items to include in results. * @return * String containing the bookshelf. */ 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, theo sau là các dòng chú thích chi tiết hơn. Từ khoá định danh @param được dùng để mô tả về các tham số mà hàm này sử dụng, bao gồm thông tin về loại dữ liệu. Từ khoá này được khai báo theo theo định dạng: @param . 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ề. Từ những chú thích này, 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. 2.3 Một số hook cơ bản - Hook block: 21 Hook này được sử dụng để tạo một block hiển thị thông tin. Khi hook_block được gọi, Drupal sẽ truyền 3 tham số vào hàm: $op, $delta và $edit. Tham số $op chứa thông tin về loại thao tác mà module sẽ thực hiện. 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ó. Ví dụ, ở danh sách các module hiển thị trong khu vực quản trị, tham số $op sẽ được đặt là list. 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. configure: Dùng để điều chỉnh các thiết lập cho block. 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. Tham số $delta được đặt phụ thuộc vào các thao tác nhất định của module. Khi $op có giá trị là view thì $delta sẽ được đặt. Tham số này chứa các thông tin thêm về nội dung sẽ hiển thị trong block. Bằng cách sử dụng $delta, một hàm hook_block() có thể hiển thị nhiều block khác nhau. 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. Cuối cùng là tham số $edit, đượ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). $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. Giá trị trả về của hàm này phụ thuộc vào thao tác mà nó thực hiện. Thông thường, hàm sẽ trả về một mảng chứa thông tin của block (info), tiêu đề (subject) và nội dung (content). - 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. 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, và tham số $arg chứa một số thông tin thêm. Với các trường hợp phức tạp, 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. Giá trị này tuân theo định dạng admin/help# , trong đó được thay bằng tên của module tương ứng. Kết quả của hàm này được hiển thị tại mục Administer | Help page: 22 Hình 2.3.a. Minh họa nội dung sử dụng hook_help(). - Hook user: Mặc định, 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ọ. Địa chỉ URL của trang này có dạng: Người dùng sẽ thấy những thông tin sau: Hình 2.3.b. 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. Phần lớn nội dung của trang này được tạo ra bởi hook_user(). 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. Thực ra, 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. Trong Drupal 6 có 13 thao tác mà hook này thực thi, bao gồm việc thêm, sửa chữa hoặc xoá bộ ghi nhớ đăng nhập. 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. Tham số này nhận 1 trong 13 giá trị tương ứng với 13 thao tác (view, login, delete...). $edit: Một mảng chứa các giá trị được gửi lên từ một form. 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. 23 $account: Dùng để chứa đối tượng tài khoản cho một người dùng nhất định. Tham số này cũng được truyền qua tham chiếu &$account. $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. Chi tiết về hook này xem tại địa chỉ - 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, tuỳ theo yêu cầu, người phát triển có thể tuỳ chỉnh định dạng của thông điệp, và việc này được thực hiện thông qua hook_mail(). 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. Khi hàm triển khai hook mail được thực thi, nó sẽ truyền 3 tham số sau: $key: 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. $message: Là cấu trúc dữ liệu thể hiện thông điệp mà Drupal đã khởi tạo trước đó. 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ị. $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. - Hook view: Trước khi một node được hiển thị đến người dùng, thông tin của nó có thể được cập nhật bằng cách sử dụng hook_view(). Hook này được gọi khi hệ thông nạp một đối tượng $node, nhưng vào thời điểm trước khi node được hiển thị. 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. Đồng thời, 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. 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ị. 24 $teaser 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. Tham số này nhận giá trị Logic, TRUE hoặc FALSE. $page cho biết node này sẽ hiển thị ở trang riêng hay không. Nếu $page có giá trị TRUE, tiêu đề của node sẽ không được hiển thị. Giá trị trả về của hàm khai triển hook_view() chính là $node. 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. 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, thay cho việc thao tác với từng thành phần riêng $node->body và $node->teaser. Chi tiết của hook này xem thêm tại địa chỉ - 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ý. Hook này thường được dùng để tạo các thực đơn cho trang quản lý của module. Giống như các hook khác, một bản triển khai của hook_menu() trả về một mảng, 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á). Dựa vào những tham số cấu hình này, 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ý. Việc này được thực hiện bằng cách ánh xạ các hàm callback. 2.4 Định nghĩa một hook mới Trong phần này, 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. 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. 25 2.4.1 Cách tạo một hook Việc định nghĩa một hook mới rất đơn giản, thậm chí chỉ cần một dòng mã. Nhưng để thuận tiện hơn cho những người phát triển sử dụng sau này, hook nên được định nghĩa một cách chi tiết. Có một số cách để làm cho hook trở nên dễ sử dụng và triển khai. 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ã. Cách thứ hai là tạo ra một hàm hook trong mã nguồn, hàm này sẽ không được gọi đến mà chỉ đóng vai trò làm mẫu. Ví dụ: /** * Use this hook to build content for a sitenews message. * * This should return an array of items: * array('item_name' => $item) * An item is an associative array with the following * fields set: * * - #weight: An integer from -10 to 10 * - #content: Text content * - #title: A title for the text content * * Weight and content are required. If #title * is set, then it will be added as a title. * * @return * A content array. */ function hook_sitenews() { $content['report'] = array( '#weight' => 0, '#title' => t('Sample Title'), '#body' => t('Sample content') 26 ); $content['another report'] = array( '#weight' => 0, '#title' => t('Another Sample Title'), '#body' => t('More sample content') ); return $content; } 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(). Nó sẽ không được gọi trong mọi trường hợp, kể cả khi hệ thống nhận lời gọi hàm module_invoke() hay module_invoke_all() vì tên hàm không tuân theo quy tắc _. 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. 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. 2.4.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. Bản triển khai của một hook phải được đặt theo quy tắc _() và có các tham số trùng với phần khai báo của hook. 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. 2.5 Một số hàm quan trọng trong thư viện hàm của Drupal - Hàm chuyển đổi ngôn ngữ t(): Đây là hàm chuyển đổi ngôn ngữ trong Drupal, được sử dụng để hỗ trợ chức năng đa ngôn ngữ, đồ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, Drupal sẽ kiểm tra xem ngôn ngữ mà người dùng lựa chọn 27 có khác với ngôn ngữ mặc định (Anh-Mỹ) hay không. 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. Để Drupal hỗ trợ đa ngôn ngữ, module Content translation phải được bật. Trong những trường hợp đơn giản, 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. Khi đó, toàn bộ xâu sẽ được dịch nghĩa. Nhưng trong một số trường hợp khác, hàm sẽ nhận các dữ liệu thêm vào. Ví dụ, khi cần thêm một địa chỉ URL vào trong một xâu: ‘Trying to access !url.’ v

Các file đính kèm theo tài liệu này:

  • pdfTìm hiểu cách xây dựng module cho Drupal và các vấn đề liên quan.pdf