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ó.
7 comments
Sao cái theme xấu quá :(
Sao cái theme xấu quá :(
Đ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à. :">
Vậy làm nhanh nhanh đi anh
Vậy làm nhanh nhanh đi anh :">
Làm sơ bộ xong rầu đó :">
Làm sơ bộ xong rầu đó :">
Em thấy avatar của a đep
Em thấy avatar của a đep
Hook form alter form đăng ký
Dear Anh,
Anh có thể hướng dẫn hook_form_alter cho form đăng ký thành viên được không. em muốn thêm một vài trường vào form đăng ký như địa chỉ, số điện thoại, giới tính, ...
Cảm ơn anh!
Ở D6 có module profile có thể
Ở D6 có module profile có thể dùng thêm một số trường vào form đăng kí được. D7 thì có profile2, nhưng bạn muốn tự viết thì chỉ cần dùng hook_form_alter để alter form đăng kí dễ dàng, có thể xem module logintoboggan để tham khảo.
Post new comment