Thứ Năm, 11 tháng 9, 2014

Hook trong Drupal

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