This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

redmine act_as_activity_provider

a kool hack
Added by icy [G] about 3 years ago  »  Votes: 1/1

{{{}}}

Khi viết bài mới, tạo issue mới, sẽ phát sinh ra sự kiện event, và sự kiện này có thể được liệt kê ở trang activity của dự án hoặc không.

Mỗi activity sẽ được đăng ký ở trong lib/redmine.rb, thông qua Redmine::Activity.register. Việc đăng ký này có định dạng tương tự như sau đây

1 Redmine::Activity.map do |activity|
2   activity.register :issues, :class_name => %w(Issue Journal)
3 end

Ở đây,

  1. :issues chỉ lớp của provider, cũng là event_type (kiểu sự kiện). Sau này, kiểu của lớp được dùng để xác định quyền bên trong hàm Redmine:::Activity::Fetcher::event_types. Nhưng trong ví dụ ở trên, quyền dùng để xác nhận kiểu sự kiện có xem được với người dùng hiện tại hoặc không là view_issues. Như vậy, đối với các lớp thông thường thì điều này thật thuận tiện, nhưng với các lớp mới hoặc lớp bất thường, ta phải điều chỉnh hàm event_types nếu không muốn bổ sung thêm các quyền điều khiển vào hệ thống (rất phức tạp).
  2. :class_name xác định các lớp (đối tượng) sẽ phát sinh ra sự kiện (ví dụ, đối tượng issue khi tạo ra sẽ phát sinh sự kiện)

Theo thiết kế ở trên, nhiều lớp có thể cung cấp sự kiện cùng một kiểu. Nhưng hạn chế là, cùng một lớp không thể phát sinh ra các loại sự kiện khác nhau cho cùng một kiểu. Điều này liên quan tới bài toán: làm thế nào để liệt kê tất cả các bình chọn của người dùng trên các Tin mới hoặc bài blog, và làm thế nào để liệt kê các bình chọn trên chính issue hoặc phần chú thích của issue (cùng đối tượng vote, phát sinh ra nhiều sự kiện khác nhau cùng loại).

Để giải quyết vấn đề trên, ta phải hỗ trợ tính đa hình của act_as_activity_provider. Xem chi tiết trong

1 Redmine::Acts::ActivityProvider::ClassMethods::acts_as_activity_provider
2 Redmine::Activity::Fetcher::event_types

Nhờ tính đa hình (polymorphic), ta có thể thực hiện khai báo sự kiện như sau

1 Redmine::Activity.map do |activity|
2   activity.register :ping_issues, :class_name => %w(VoteOnIssue VoteOnIssueNote), :default => false
3 end

Như vậy, Vote có thể phát sinh ra hai loại sự kiện VoteOnIssueVoteOnIssueNote, và hai sự kiện này ta đều nhóm vào một chỗ ping_issues để có thể liệt kê. (So sánh với thiết kế nguyên gốc của Redmine, phải liệt kê độc lập, hoặc là VoteOnIssue, hoặc là VoteOnIssueNote.


Comments