2008-11-26 11 views

Trả lời

9

Bạn cũng có thể làm điều này bằng cách thêm cột khi chạy. Điều này sẽ thêm cột giờ đã dành mà không sửa đổi lõi Redmine. Chỉ cần thả đoạn mã sau vào một tập tin trong thư mục lib/

Phỏng theo:

require_dependency 'query' 

module QueryPatch 
    def self.included(base) # :nodoc: 
    base.extend(ClassMethods) 

    # Same as typing in the class 
    base.class_eval do 
     unloadable # Send unloadable so it will not be unloaded in development 
     base.add_available_column(QueryColumn.new(:spent_hours)) 
    end 

    end 

    module ClassMethods 

    unless Query.respond_to?(:available_columns=) 
     # Setter for +available_columns+ that isn't provided by the core. 
     def available_columns=(v) 
     self.available_columns = (v) 
     end 
    end 

    unless Query.respond_to?(:add_available_column) 
     # Method to add a column to the +available_columns+ that isn't provided by the core. 
     def add_available_column(column) 
     self.available_columns
+1

Tôi đã sử dụng thành công phương pháp này tối qua để đảm bảo dự án hiển thị dưới dạng cột có thể sắp xếp. Mã nguồn đầy đủ không có trong câu trả lời này, chỉ cần truy cập: http://github.com/edavis10/redmine-question-plugin/tree/master/lib/question_query_patch.rb Cảm ơn Eric và Joel. – banderson623

+2

Vì câu trả lời này ngày càng lớn nên tôi nghĩ tôi nên hỏi trước khi thử: Bạn có biết liệu điều này có hiệu quả với Redmine 0.9.3 không? – Oskar

+0

@Osker: Tôi không nghĩ rằng API đã thay đổi nhiều. –

11

Củng cố Eric và Joel của câu trả lời, đây là những gì tôi cần làm để có được cột 'Thời gian đã' được thêm vào Redmine 1.0.3. Bạn không chắc chắn liệu có cách nào tốt hơn để thêm văn bản dịch hay không.

Để cung cấp cho các lĩnh vực mới một tên cục bộ, thêm vào config/miền địa phương/en.yml xung quanh dòng 299 ở phần cuối của các định nghĩa lĩnh vực:

field_spent_hours: Spent time 

Để thêm các cột mới, tạo lib/spent_time_query_patch rb với nội dung:

# Based on http://github.com/edavis10/question_plugin/blob/master/lib/question_query_patch.rb 
require_dependency 'query' 

module QueryPatch 
    def self.included(base) # :nodoc: 
    base.extend(ClassMethods) 

    # Same as typing in the class 
    base.class_eval do 
     unloadable # Send unloadable so it will not be unloaded in development 
     base.add_available_column(QueryColumn.new(:spent_hours)) 
    end 

    end 

    module ClassMethods 
    unless Query.respond_to?(:available_columns=) 
     # Setter for +available_columns+ that isn't provided by the core. 
     def available_columns=(v) 
     self.available_columns = (v) 
     end 
    end 

    unless Query.respond_to?(:add_available_column) 
     # Method to add a column to the +available_columns+ that isn't provided by the core. 
     def add_available_column(column) 
     self.available_columns << (column) 
     end 
    end 
    end 
end 

để có được spent_time_query_patch trên để thực sự tải, tạo config/initializers/spent_time_query_patch.rb với nội dung:

require 'spent_time_query_patch' 

Query.class_eval do 
    include QueryPatch 
end 
+1

Cảm ơn bạn đã viết thư này cho người khác. :) –

+0

Điều này dường như không hiệu quả đối với tôi - có bất kỳ lệnh nào để chạy để lấy redmine để xem các thay đổi không? – Toby

+0

Tôi cần dừng và khởi động lại máy chủ web của mình. (Tôi không phải là chuyên gia Rails/Ruby, nhưng nếu vì lý do nào đó, thiết lập của bạn không được cấu hình để tự động tải các tệp .rb trong config/initializers/sau đó đoạn mã Query.class_eval sẽ không bao giờ chạy và bản vá không Có thể kiểm tra xem bạn đã có quyền sở hữu/quyền của tệp trên các tệp mới được đặt chính xác sao cho máy chủ web có thể đọc chúng. Có lẽ ai đó có nhiều chuyên gia về Ruby có thể nhận xét về cách kiểm tra tính năng tự động tải của đường dẫn cho ...) – user2067021

2

Ngoài ra, sẽ rất tuyệt nếu cột "Thời gian đã tiêu" có thể được sắp xếp.

Sau khi nhìn lên SQL sản xuất, tôi chỉ triển khai tính năng sắp xếp được này theo cách này:

base.add_available_column(QueryColumn.new(:spent_hours, 
:sortable => "(select sum(hours) from time_entries where time_entries.issue_id = t0_r0)") 
) 

Thay thế dòng tương ứng. Tôi chỉ hy vọng tên cột ISSUE_ID luôn là "t0_r0" ...

PS: Bạn có thể tìm thấy rất nhiều ví dụ trong dòng ứng dụng/mô hình/query.rb 122 ++

Vấn đề 2-Digits: Thật không may, tôi đã phải hack một trong các tập tin cốt lõi: app/giúp đỡ/queries_helper.rb

Khoảng dòng 44, thay đổi này:

when 'Fixnum', 'Float'        
    if column.name == :done_ratio 
    progress_bar(value, :width => '80px') 
    else 
    value.to_s 
    end 

thành:

when 'Fixnum', 'Float' 
    if column.name == :done_ratio 
    progress_bar(value, :width => '80px') 
    elsif column.name == :spent_hours 
    sprintf "%.2f", value 
    else 
    value.to_s 
    end 

CHỈNH SỬA: Sử dụng miếng vá thay vì thao tác nguồn Gần đây, chúng tôi đã cập nhật hệ thống redmine, vì vậy sửa chữa đã đề cập ở trên cũng đã bị xóa. Lần này, chúng tôi quyết định thực hiện điều đó dưới dạng bản vá.

Mở bất kỳ plugin nào (Chúng tôi đã tạo plugin cho các thay đổi về bản vá khỉ của chúng tôi trên lõi). mở ra vendor/plugins/redmine_YOURPLUGIN/app/giúp đỡ/queries_helper.rb

module QueriesHelper 
    def new_column_content(column, issue) 
    value = column.value(issue) 
    if value.class.name == "Float" and column.name == :spent_hours 
     sprintf "%.2f", value 
    else 
     __column_content(column, issue) 
    end 
    end 
    alias_method :__column_content, :column_content 
    alias_method :column_content, :new_column_content 
end 
1

bằng cách sử dụng AgileDwarf plugin. Bạn có thể đã dành thời gian & bạn có thể nói cho những gì bạn đã dành thời gian này (phát triển - thiết kế -...)

Các vấn đề liên quan