Vấn đề về hook

Events happening in the community are now at Drupal community events on www.drupal.org.
Mr.vantri's picture

Mình có điều này chưa hiểu. Trong site của chúng sẽ có rất nhiều module dùng 1 hook. hook_nodeapi chẳng hạn. Khi insert module A dùng hook_nodeapi để in ra 1 message1, module chúng ta lại dùng hook_nodeapi để in ra message2(giả sử là như vậy). Thế thì khi insert xong nó sẽ in ra message1 và message2 vì site sẽ lần lượt thực hiện tất cả các hook_nodeapi. Vấn đề ở đây là mình muốn chỉ in ra message2 thì phải làm sao? hay nói cách khác làm thế nào để ngăn hook_nodeapi ở module A không thực thi.(tất nhiên không phải là disable module đó).
Mong nhận được chia sẻ của mọi người!

Comments

anh thử dùng hàm drupal_get_messages()

tqnghiep's picture

http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/drupa..., em không rành drupal lắm nên có sai gì xin đc chỉ thêm

TQN

Nó chỉ là function in ra

Mr.vantri's picture

Nó chỉ là function in ra message thôi. :(. Cái mình cần không phải vậy. Mà cần là chặn 1 hook không cho nó thực thi.

Bạn debug xem

tqnghiep's picture

Bạn debug xem hook bạn cần làm việc được chạy sau hay chạy trước hook cần chặn.
Nếu chạy sau bạn có thể dùng drupal_get_messages() trong body code mà bạn đang làm việc. Vì hàm trên Return all messages that have been set. mình nghỉ bạn có thể unset các messages khác rồi sau đó set message của bạn.

TQN

antesla's picture

Theo tôi để giải quyết vấn đề của bạn thì trước tiên bạn phải làm được một việc: Đó là làm sao cho hook_nodeapi trong module của bạn được gọi đầu tiên. Khi được gọi đến đầu tiên thì bạn viết hết những code cần xử lí xong rồi thì cho nó redirect đi là xong.
* Làm sao để hook_nodeapi của bạn được gọi đầu tiên ?
- Bạn kéo trọng số (weight) module của bạn về giá trị nhỏ nhất thì dĩ nhiên module của bạn sẽ được gọi trước tiên.
* Làm sao tôi có thể kéo trọng số (weight) module của tôi về giá trị nhỏ nhất ?
_ Bạn có thể viết một hook_update_n() để update weight module của bạn
_ Hoặc bạn có thể cài module : http://drupal.org/project/weight này lên rồi kéo module của bạn lên.

Chúc bạn thành công!

Hi anh An.^_^.(Rất vui). Em

Mr.vantri's picture

Hi anh An.^_^.(Rất vui).
Em chưa rõ lắm về "redirect" anh nói. Nó hoạt động như thế nào ạ? Anh có thể nói rõ hơn được không? Còn về phần thứ tự thực hiện có nhiều cách. Em đề xuất 1 cách nữa đó là mình dùng hook_install (hoặc hook_enable cũng được)trong file my_module.install. Cũng rất tường minh và dễ hiểu.

redirect đi là xong

antesla's picture
  • Giải thích cụm từ "redirect đi là xong" : Có nghĩa khi bạn thực hiện xong các công việc ở phần code của bạn trong hook_nodeapi ở module của bạn rồi => Mình redirect đi sang một trang mới: trang trả về kết quả hoặc trang cần return lại chẳng hạn.
  • Làm sao tôi có thể redirect đi được ?
    Bạn có thể sử dụng hàm: drupal_goto()

  • Cám ơn về đề xuất hook_install, hook_enable để thực hiện công việc sắp xếp weight. Nhưng những hook này thường chỉ có tác dụng một lần một:
    ** hook_install : có tác dụng khi bạn install module
    ** hook_enable: chỉ có tác dụng khi module ở trạng thái disabled chuyển sang enable thôi
    ** hook_update_n: Nó có tác dụng n lần

Nói chung tùy vào trường hợp mình chọn sử dụng cách nào cho hợp lý là được. Không nhất thiết phải logic khoa học máy móc quá mà làm cho khả năng sáng tạo bị lu mờ :) .