Thứ Ba, 6 tháng 8, 2013

Drupal nâng cao - 1. Cơ chế Hook


Cơ chế Hook của Drupal

Hook là gì?

Hook là một kỹ thuật mà ở đó cho phép chặn, bắt, theo dõi, xử lý các sự kiện (event) từ ứng dụng tới ứng dụng, ứng dụng tới hệ điều hành và hệ điều hành tới ứng dụng hay nói cách khác là có thể chặn, bắt, theo dõi, xử lý các sự kiện trước khi nó tới nơi tiếp nhận.

Ví dụ:

Cách làm việc của chương trình soạn thảo văn bản Unikey, và chương trình từ điển Lingoes. Cách làm việc của chúng là đón lấy các sự kiện về gỏ bàn phím, và các sự kiện từ con chuột để xử lý các thao tác riêng.

Xét về phạm vi hoạt động thì có hai loại Hook:

  • Hook toàn cục (có phạm vi ảnh hưởng tới toàn hệ thống).
  • Hook cục bộ (chỉ có tác dụng trên ứng dụng được cài Hook).

Cơ chế Hook của Drupal:

Trong Drupal các Hook được định nghĩa trong nhân của Drupal (có thể phát triển thêm các Hook mới), chúng được xem như là các sự kiện (event) và được gọi chung là các hàm callbacks. Các module dùng các Hook để tương tác với nhân Drupal mà không cần phải chỉnh sửa trực tiếp trong nhân.
Hook trong Drupal có dạng như sau: hook_user() -> mymodule_user() trong đó mymodule là tên module còn user là tên hook.

Ví dụ:

Khi user đăng nhập vào hệ thống Drupal, Drupal phát sinh ra hook_user(), có nghĩa là tất cả các module có dùng tới hàm hook_user() sẽ được gọi.

Các loại Hook trong Drupal:

Trong Drupal có nhiều loại Hook, mỗi Hook thực hiện nhiệm vụ khác nhau, các bạn có thể xem chi tiết về hook tại http://api.drupal.org/api/group/hooks/6.

Các hook bắt buộc khi tạo Field type mới cho Drupal (7+)

Trước khi tìm hiểu những hook bắt buộc phải biết một Field type gồm những thành phần nào, theo kiến trúc của Field API thì một Field type gồm 3 thành phần chính:
  1. Đinh nghĩa thông tin cho Field - Phần định nghĩa Field này khai báo thông tin như: Khai báo thông tin cho Field, định nghĩa cấu trúc CSDL cho Field, kiểm tra giá trị hợp lệ, kiểm tra Field rổng hay không.
  2. Định nghĩa Formatter cho Field - Khai báo kiểu hiển thị của Field.
  3. Định nghĩa Widget cho Field - Khai báo phần nhập liệu của Field.
Vậy khi viết một Field type mới cần bắt buộc các hook sau đây:
Ngoài các hook bắt buộc trên còn các hook khác như hook_field_widget_error, hook_field_settings_form,... khi đụng chạm thực tế thì cần tìm hiểu thêm ở những module thực tế.
Xét về phạm vi hoạt động thì có hai loại Hook:

* Hook toàn cục (có phạm vi ảnh hưởng tới toàn hệ thống).
* Hook cục bộ (chỉ có tác dụng trên ứng dụng được cài Hook).

Cơ chế Hook của Drupal:

Trong Drupal các Hook được định nghĩa trong nhân của Drupal (có thể phát triển thêm các Hook mới), chúng được xem như là các sự kiện (event) và được gọi chung là các hàm callbacks. Các module dùng các Hook để tương tác với nhân Drupal mà không cần phải chỉnh sửa trực tiếp trong nhân.

Hook trong Drupal có dạng như sau: hook_user() -> mymodule_user() trong đó mymodule là tên module còn user là tên hook.

Ví dụ:

Khi user đăng nhập vào hệ thống Drupal, Drupal phát sinh ra hook_user(), có nghĩa là tất cả các module có dùng tới hàm hook_user() sẽ được gọi.

Các loại Hook trong Drupal:

Trong Drupal có nhiều loại Hook, mỗi Hook thực hiện nhiệm vụ khác nhau, các bạn có thể xem chi tiết về hook tại http://api.drupal.org/api/group/hooks/6.

Hook trong Drupal

1.Giới thiệu

1.1 Mục tiêu bài viết

Bài viết này nhằm giới thiệu cơ chế hoạt động của hooks trong drupal từ đó rút ra phương pháp định nghĩa một hooks trong drupal.

1.2 Khái niệm hook trong drupal

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.

1.3 Ý 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).

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

2.1 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)

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

3. hook_hook_info

3.1 Giới thiệu

  • 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).

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

4. Kết luận:

  • Kỹ thuật định nghĩa hook
    • Định nghĩa ra một hooks mới dưới dạng format đặc biệt của drupal (viết sau)
    • Viết một hook để truyền 1 tham số xác định trong drupal. (viết sau)
    • Viết một hook có chức năng xử lý trong drupal.(viết sau)
    • Viết một hook với tham số truyền vào dưới dạng tham biến.(viết sau)

1 nhận xét:

  1. Ủa bài này của bác Nguyễn Tiến Sĩ mà, sao không có đề tên tác giả ta (:

    Trả lờiXóa