Nguyen Tien Si

Sức mạnh của hook_form_alter() trong Drupal

Ví dụ với form đăng nhập của module user

Giả sử hệ thống Drupal có module mặt định là user, module này làm nhiệm vụ quản lý việc đăng nhập, đăng kí, phục hồi mật khẩu cho user.

Mặt định form đăng nhập của user như sau:

  • Username
  • Password

Yêu cầu:

Thay đổi form đăng nhập này bằng cách thay đổi các trường nhập liệu khác (elements) như sau:

  • Username or e-mail
  • Password

Mà không thay đổi code của module user (đảm bảo cho việc nâng cấp lên các phiên bản mới của nhân Drupal).

Với yêu cầu như trên Drupal cung cấp cho người phát triển một cơ chế để thực hiện các yêu cầu đó và được gọi chung là Form API (có nhiều tính năng khác).

Form API này có hook_form_alter() dùng để thay đổi bất cứ một form nào đó (phân biệt qua id của form gọi là form_id) trước khi form đó được validate và submit.

Để minh họa cách làm việc của hook_form_alter() ta lấy ví dụ là với module logintoboggan của cộng đồng phát triển Drupal (module này rất phổ biến).
Cơ chế làm việc của hook_form_alter() như sau:

Minh họa cơ chế làm việc của hook_form_alter() trong module logintoboggan:

Giải thích:

Ban đầu module user tạo ra form user_login (F1), nhưng khi module logintoboggan được cài vào hệ thống thì khi module user chạy thì form được thay đổi thành form user_login (đã được thay đổi F2). Quá trình thay đổi này được thực hiên qua hook_form_alter() (xem ở hook_form_alter trên trang http://api.drupal.org, xem hình minh họa phía trên).

Hook này có nhiệm vụ khi form được tạo ra, và trước khi được submit để xử lí thì ta có thể thay đổi các elements trong form và cách xử lí các dữ liệu khi form được thay đổi.

Xem thêm về Form API ở Forms API Quickstart Guide | Drupal API và sơ đồ hoạt động của Form API ở đây Form Workflow Illustration | drupal.org.

Vậy việc thông qua hook_form_alter() mà ta không cần sửa code trực tiếp trong module user nhưng vẫn có thể thay đổi được cấu trúc form và cách xử lí dữ liệu khi form được thay đổi.

Kết luận:

Với cơ chế làm việc này ta có thể mở rộng hệ thống một cách dễ dàng bằng cách viết các module mới có thể phủ định, mở rộng và điều hướng làm việc của các module có sẳn mà không trực tiếp thay đổi code trong module đã có.

4 comments

Anonymous's picture

Sao cái theme xấu quá :(

Sao cái theme xấu quá :(

mrsinguyen's picture

Đang làm theme mới

Đang làm cái theme lại, nhưng dùng theme galand một cột thấy cũng ok mà, để chỉnh typo và một số thứ nữa là được mà. :">

Anonymous's picture

Vậy làm nhanh nhanh đi anh

Vậy làm nhanh nhanh đi anh :">

mrsinguyen's picture

Làm sơ bộ xong rầu đó :">

Làm sơ bộ xong rầu đó :">

Add your comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • You can use Markdown syntax to format and style the text. Also see Markdown Extra for tables, footnotes, and more.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.

More information about formatting options