Với
nhiều người khi bắt đầu theo học lập trình Drupal là lần đầu tiên nghe đến khái
niệm Hook trong Drupal thực ra Hook
trong drupal cũng giống như trong các ứng dụng khác, nó là 1 cơ chế cho phép
chúng ta (các developer) tương tác vào một quá trình xử lý khác mà chúng ta
không có quyền sửa đổi quá trình xử lý đó bằng cách sửa code.
Ý nghĩa về hook trong
drupal
Nguyên
tắc trong drupal là khi ta viết một module mà muốn "sửa" module đã có
trước đó thì không được phép "hack code" của module đó, nhưng đôi khi
chúng ta lại có nhu cầu sửa đổi module khác. Hook ra đời cho phép chúng ta thực
hiện điều này.
Ví
dụ khi ta viết module có chức năng notify cho user khi có 1 sự thay đổi trên
nội dung của 1 node, mà không phải sửa code trong module node. Lúc này module
node cho phép chúng ta tương tác với quá trình xử lý của nó thông qua hook mà
nó cung cấp (hook_node_update).
Các cách gọi thực thi
1 hook trong drupal
Nhìn
tổng quan về mặt kỹ thuật thì kỹ thuật gọi một hàm hooks trong drupal đi qua
hai bước cơ bản:
Bước
1: Xác định danh sách các module có hàm implements hooks xác định.
Bước
2: Gọi thực thi các hàm xác định được.
Với bước 1 chúng ta có
2 cách:
Cách
1: Sử dụng hàm get_function_defined().
Lấy
danh sách các hàm được khai báo trong drupal lên.
Lấy
danh sách các hàm do user khai báo.
Sử
dụng regular expression để lấy danh sách các hàm theo mẫu xác định.
Cách
2: Kiểm tra danh sách các module định nghĩa hook
Lấy
danh sách các module được bật lên (enable).
Ứng
với mỗi module xác định tên hàm hooks theo mẫu: modulename_hookname (với module
là tên modulename, hookname là tên hook)
Với bước 2 chúng ta có
2 cách:
Cách
1: Sử dụng các hàm call_function_array.
Phương
pháp này ứng dụng khi gọi một hàm mà không biết danh sách các tham số của nó,
và danh sách tham số khác.
Cách
2: Sử dụng phương pháp gọi tên hàm trực tiếp ($function($param1, $param2,
$param3).
Phương
pháp này được sử dụng khi gọi một hàm mà biết chắc chắn tham số của nó.
Về
performance và phân tích ưu nhược điểm của 2 phương pháp trên xem thêm
tại:http://www.garfieldtech.com/blog/magic-benchmarks.
hook_hook_info
Bình
thường các hooks sẽ được khai báo trong các file .install, .module, trong
trường hợp chúng ta định nghĩa ra một hooks mới hoặc muốn chuyển các hook sang
một file khác(khác với file .module, .install) để khai báo lúc đó chúng ta sẽ
sử dụng hàm này để khai báo cho drupal biết hooks này được định nghĩa ở đâu.
Ngoài
ra chúng ta còn có nhu cầu khi một số hooks ít khi được gọi, và nó khai báo
nhiều (nhiều code), nếu chúng ta khai báo trong các file .module, .install thì
sẽ không hợp lý, nhằm nhu cầu tăng performance cho ứng dụng drupal của drupal
chúng nên khai báo các hàm implements hook này trong một file khác nhằm tăng
tốc độ cho chương trình. (vì các hàm này ít khi sử dụng tới).
Ví dụ
<?php
function
mymodule_hook_info() {
$hooks['myhook'] = array(
'group' => 'myhook',
);
return $hooks;
}
?>
-
Từ nay trở về sau chúng ta có thể implement hook myhook trong module của chúng
ta ở trong file .mymodule.inc trong module của chúng ta.
Không có nhận xét nào:
Đăng nhận xét