Implement Redmine Project Menu Item Customize Setting with Plugin
主要是想試試看Redmine這類有時代背景的產品 是否因為Rails與本身設計的彈性 讓開發者易於修改、以及使用者客製化的維度等等 找了不少關鍵字,沒看到我想要的,於是就記錄一下~ 實作目標:讓各個專案管理者自行決定某個專案標籤是否顯示,而 非關閉 此功能 實作範圍:Plugin。不含既有非模組化的Menu item,如:概觀(Overview)、活動(Activity) 示範模組: Redmine Hearts Plugin Redmine原始碼參考 Mirror site 精要結果:修改hearts模組的 init.rb 即可 修改後的程式碼如下 menu :project_menu , :hearts , { :controller => :hearts , :action => :index }, :param => :project_id , :caption => :hearts_link_label , # 如果hearts模組在project是enable的,才產生此menu item :if => proc { |project| project.module_enabled? :hearts } # 在Project新增此模組的設定檔,也有權限限制,只有專案管理員可設定。 project_module :hearts do permission :hearts , { hearts: [ :index ] }, require: :member end 只需修改這樣,就可以達到上述客製化的設定,相當精美而且直覺 細部說明: 由於所有Redmine模組的init.rb都是透過Redmine::Plugin實作 與此次案例有關的程式碼為 menu 裡頭也引用到Redmine::MenuManager.map,會將Menu Item的資訊 存入 很明顯的,在這個步驟並沒有觸發 :if 判斷的Proc程式碼區段 那麼是在哪裡被啟用呢? 在 layouts/base.html.rb ,如果目前是在Project頁面 那麼就會呼叫 MenuManager的 render_main_menu 方法 在往