• Redmine it!


    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" 
    
    1
    cd $REDMINE_ROOT 
    

    #需要在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
    
  • 相关阅读:
    Python、Lua和Ruby比较——脚本语言大P.K.
    vim 设置默认显示行号
    C语言
    How To Add Swap on Ubuntu 14.04
    How To Install Apache Kafka on Ubuntu 14.04
    php的错误和异常处理
    md5sum
    大牛的博客
    【转】4G手机打电话为什么会断网 4G上网和通话不能并存原因分析
    【转】女人最想要的是什么
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12014379.html
Copyright © 2020-2023  润新知