redmine插件开发简介
最稳妥的学习应该是先看官方文档,官方还给了一个具体的插件开发教程,不过如果一步不差按照教程敲代码,其实会发现还是有些问题的,需要稍稍改动。
这里,我自己编写了一个简单的插件,基于redmine-3.4.6-passenger版本。
####
插件名称:field_value_adaption
依赖插件:select_to_select2
插件作用:在issue的自定义字段中,根据某个自定义字段的值,自动填写其他自定义字段的值,这些值存在数据库中,如下数据库,当自定义字段1的值选择’便签’时,自动将686,626填写进入自定义子字段4,
数据库设计:
| Id | field_selector | value | field_selector_by | value_by |
| —— | —— | —— | —— | —— |
| 1 | #issue_custom_field_values_1 | 便签 | #issue_custom_field_values_4 | 686,626 |
| 2 | #issue_custom_field_values_1 | 天气 | #issue_custom_field_values_4 | 691 |
####
控制器 adaption
模型 field_value_relation
#设置开发环境变量
1 | export RAILS_ENV="production"
|
#需要在redmine根目录下执行以下代码,默认是/usr/src/redmine
#新建插件
1 | bundle exec ruby bin/rails generate redmine_plugin field_value_adaption
|
#新建数据库
1 | bundle exec ruby bin/rails generate redmine_plugin_model field_value_adaption field_value_relation field_selector:string value:string field_selector_by:string value_by:string
|
#迁移数据库
1 | bundle exec rake redmine:plugins:migrate
|
#将数据库编码设置成utf-8,如果没有中文输入,则没必要修改
1 2 | alter table field_value_relations default character set utf8;
alter table field_value_relations change field_selector field_selector varchar(255) character set utf8;
|
#插入数据,可以直接在数据库中插入
1 2 3 4 5 6 7 | bundle exec ruby bin/rails console
[rails 3] rails console
>> FieldValueRelation.create(:field_selector => "#issue_custom_field_values_2", :value =>"便签", :field_selector_by => "#issue_custom_field_values_4", :value_by => "686,626")
>> FieldValueRelation.create(:field_selector => "#issue_custom_field_values_2", :value =>"便签", :field_selector_by => "#issue_custom_field_values_5", :value_by => "691")
>> FieldValueRelation.create(:field_selector => "#issue_custom_field_values_2", :value =>"便签", :field_selector_by => "#issue_custom_field_values_8", :value_by => "686,606")
>> FieldValueRelation.create(:field_selector => "#issue_custom_field_values_2", :value =>"天气", :field_selector_by => "#issue_custom_field_values_4", :value_by => "626")
>> exit
|
#创建控制器
1 | bundle exec ruby bin/rails generate redmine_plugin_controller field_value_adaption adaption get
|
修改控制器代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class AdaptionController < ApplicationController
def get
@allinfo = FieldValueRelation.all.to_a
@fieldsinfo = Hash.new
#这里使用三层嵌套的hash,比如{2=>{"天气"=>{4=>"691,626"}, "浏览器"=>{4=>"686"}}}
@allinfo.each { |x|
unless @fieldsinfo.has_key?(x.field_selector)
@fieldsinfo[x.field_selector] = {}
end
unless @fieldsinfo[x.field_selector].has_key?(x.value)
@fieldsinfo[x.field_selector][x.value] = {}
end
unless @fieldsinfo[x.field_selector][x.value].has_key?(x.field_selector_by)
@fieldsinfo[x.field_selector][x.value 大专栏 Redmine it!][x.field_selector_by] = x.value_by
end
}
respond_to do |format|
format.js
end
end
end
|
编写plugins/field_value_adaption/app/views/adaption/get.js.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | var module_value = {}
<% @fieldsinfo.each { |key1,value1| %>
module_value['<%= key1 %>'] = {}
<% value1.each { |key2,value2| %>
module_value['<%= key1 %>']['<%= key2 %>']={}
<% value2.each { |key3,value3| %>
module_value['<%= key1 %>']['<%= key2 %>']['<%= key3 %>'] = ('<%= value3 %>').split(",")
<% }%>
<% }%>
<% } %>
$(window).load(function() {
for(var key1 in module_value){
$(document).on("select2-selecting",key1,function(e){
for ( var key2 in module_value[key1]) {
if(e.val == key2){
for(var key3 in module_value[key1][key2]){
$(key3).select2("val",module_value[key1][key2][key3]);
}
}
}
})
}
})
|
配置路由
1 2 3 | RedmineApp::Application.routes.draw do
get 'field_adaption_js',:to => 'adaption#get'
end
|
配置issue页面发送请求的js plugins/field_value_adaption/assets/javascripts/fields_adaption_get.js
1 2 3 4 5 6 7 8 9 10 11 12 | $.ajax({
url:"/redmine/field_adaption_js",
dataType:"script",
method:"GET",
beforeSend: function(xhr) {
xhr.withCredentials = true;
},
success: function(data) {
},
error: function(xhr) {
}
})
|
使用hook机制,在所有载入的url包含issue的请求中调用上述js
plugins/field_value_adaption/lib/fields_adaption_hook_listener.rb
1 2 3 4 5 6 7 8 9 10 11 | class FieldsAdaptionHookListener < Redmine::Hook::ViewListener
def current_is_detail_page(context)
ret = context[:controller] && context[:controller].is_a?(IssuesController) && context[:request].original_url.rindex(//issues/S+/)
end
def view_layouts_base_html_head(context)
if current_is_detail_page(context)
javascript_include_tag('fields_adaption_get.js',:plugin => :field_value_adaption)
end
end
end
|
在init.rb中应用该hook
1 2 3 4 5 6 7 8 9 10 11 | require 'redmine'
require_dependency 'fields_adaption_hook_listener.rb'
Redmine::Plugin.register :field_value_adaption do
name 'Field Value Adaption plugin'
author 'tuobashao'
description 'This is a plugin for Redmine'
version '0.0.1'
url 'http://example.com/path/to/plugin'
author_url 'http://example.com/about'
end
|