プラグイン Tips » 履歴 » バージョン 11
Haru Iida, 2011/05/24 23:29
1 | 1 | Toshiyuki Ando | h1. プラグイン Tips |
---|---|---|---|
2 | |||
3 | 5 | Toshiyuki Ando | {{>toc}} |
4 | |||
5 | 1 | Toshiyuki Ando | チュートリアルの域を超えそうなものはこちらに? |
6 | |||
7 | h2. 活動ページにプラグインの履歴を表示する |
||
8 | |||
9 | Hudson プラグインを例にとり、プラグインの履歴を表示する方法を紹介します。 |
||
10 | |||
11 | 2 | Toshiyuki Ando | h3. 準備するもの |
12 | 1 | Toshiyuki Ando | |
13 | 2 | Toshiyuki Ando | * 履歴の名前 |
14 | 3 | Toshiyuki Ando | * 履歴を管理するクラス |
15 | 2 | Toshiyuki Ando | |
16 | Hudson の場合は、 |
||
17 | |||
18 | * 履歴の名前: hudson |
||
19 | 3 | Toshiyuki Ando | * 履歴を管理するクラス: HudsonBuild (ビルドを活動の履歴としたいので) |
20 | 2 | Toshiyuki Ando | |
21 | としました。 |
||
22 | |||
23 | h3. サイドバーに表示される履歴の名前に、自分のプラグインを追加する |
||
24 | |||
25 | 1 | Toshiyuki Ando | h4. 1. init.rb で活動ページに参加することを宣言する |
26 | |||
27 | 以下のコードを Redmine::Plugin.register の中に追加します。 |
||
28 | |||
29 | <pre><code class="ruby"> |
||
30 | 2 | Toshiyuki Ando | activity_provider :[履歴の名前], :class_name => '[履歴を管理するクラス]', :default => false |
31 | 1 | Toshiyuki Ando | </code></pre> |
32 | |||
33 | Hudson の場合は以下のようになります。 |
||
34 | 2 | Toshiyuki Ando | default => false は、サイドバーのチェックボックスの状態で、最初表示した時にはチェックされないことを意味します。 |
35 | 1 | Toshiyuki Ando | |
36 | <pre><code class="ruby"> |
||
37 | activity_provider :hudson, :class_name => 'HudsonBuild', :default => false |
||
38 | </code></pre> |
||
39 | |||
40 | 2 | Toshiyuki Ando | h4. 2. 権限に view_[履歴の名前] を追加する |
41 | 1 | Toshiyuki Ando | |
42 | 活動の履歴では権限をチェックします。 |
||
43 | 2 | Toshiyuki Ando | 現在ログインしているユーザが履歴を閲覧してよいかどうかは、 *view_[履歴の名前]権限が許されているかどうか* に依存します。 |
44 | 1 | Toshiyuki Ando | |
45 | 2 | Toshiyuki Ando | Hudsonプラグインで言うと、履歴の種類が hudson なので、 *view_hudson* 権限が必要です。 |
46 | *init.rb に記述する権限に view_hudson がないと、権限なしとみなされてサイドバーに履歴の名前が表示されません。* |
||
47 | 1 | Toshiyuki Ando | |
48 | <pre><code class="ruby"> |
||
49 | project_module :hudson do |
||
50 | # パーミッション設定。 |
||
51 | permission :view_hudson, {:hudson => [:index, :history]} # !!ここ大事!! |
||
52 | permission :build_hudson, {:hudson => [:build]}, :require => :member |
||
53 | permission :edit_hudson_settings, {:hudson_settings => [:edit, :joblist]} |
||
54 | end |
||
55 | </code></pre> |
||
56 | |||
57 | 6 | Toshiyuki Ando | h4. 3. 言語ファイルに label_[履歴の名前]_plural というエントリを追加する |
58 | 1 | Toshiyuki Ando | |
59 | 6 | Toshiyuki Ando | サイドバーに表示する用語は、 label_[履歴の名前]_plural に統一されています。 |
60 | 1 | Toshiyuki Ando | Hudsonだと label_hudson_plural ですね。 |
61 | 言語ファイルに登録しておかないと label_hudson_plural が表示されるという、格好悪いことになります。 |
||
62 | 3 | Toshiyuki Ando | |
63 | h3. 履歴を表示する |
||
64 | |||
65 | 4 | Toshiyuki Ando | h4. 1. 履歴を管理するクラスに、 project, author のプロパティを用意する |
66 | 1 | Toshiyuki Ando | |
67 | 4 | Toshiyuki Ando | 履歴を表示する際に、 project, author のプロパティが必要となります。 |
68 | HudsonBuild には project, author がなかったので、 |
||
69 | |||
70 | * project => 親のjobから借りてくる |
||
71 | * author => でっちあげる(caused_by という列を用意して、Redmine Admin(user_id=1)が起動したことにする) |
||
72 | |||
73 | ことにしました。 |
||
74 | |||
75 | h4. 2. 履歴を管理するクラスに、acts_as_event を追加する |
||
76 | |||
77 | コードを参考に追加してみてください。 |
||
78 | |||
79 | 3 | Toshiyuki Ando | <pre><code class="ruby"> |
80 | acts_as_event :title => Proc.new {|o| "#{l(:label_build)} #{o.job.name} #{o.number}: #{o.result}"}, |
||
81 | :description => "", |
||
82 | :datetime => :finished_at |
||
83 | </code></pre> |
||
84 | 1 | Toshiyuki Ando | |
85 | 4 | Toshiyuki Ando | |:title |表題に利用されます | |
86 | |:description|詳細…斜体で表示されている部分に利用されます| |
||
87 | |:datetime |発生した日時に利用されます | |
||
88 | |||
89 | Proc.new は自分的にはおまじない…(^^; o が表示対象のオブジェクトと考えれば大丈夫なはず。 |
||
90 | |||
91 | h4. 3. 履歴を管理するクラスに、acts_as_activity_provider を追加する |
||
92 | |||
93 | 同じくコードを参考に…。 |
||
94 | |||
95 | 3 | Toshiyuki Ando | <pre><code class="ruby"> |
96 | 1 | Toshiyuki Ando | acts_as_activity_provider :type => 'hudson', |
97 | 3 | Toshiyuki Ando | :timestamp => "#{HudsonBuild.table_name}.finished_at", |
98 | 4 | Toshiyuki Ando | :author_key => "#{HudsonBuild.table_name}.caused_by", |
99 | 1 | Toshiyuki Ando | :find_options => {:include => {:job => :project}} |
100 | </code></pre> |
||
101 | |||
102 | 4 | Toshiyuki Ando | |:type |履歴の名前にあわせましょう | |
103 | |:timestamp |発生した日時を表す列 | |
||
104 | |:find_options|多分ですが、プロジェクトを探す方法| |
||
105 | 3 | Toshiyuki Ando | |
106 | 4 | Toshiyuki Ando | :find_options ですが、例で言うと、HudsonBuild から job(HudsonJob)をたどって、project(Project)を探してくださいという意味になります。 |
107 | 7 | Mitsuyoshi Yoshida | |
108 | |||
109 | 8 | Mitsuyoshi Yoshida | h2. wiki マクロを追加する |
110 | 7 | Mitsuyoshi Yoshida | |
111 | Redmine では <notextile>{{foo(arg1, arg2)}}</notextile> のような形式で wiki のマクロを記述します。これはプラグインで自由に追加することができます。 |
||
112 | |||
113 | |||
114 | サンプルコード |
||
115 | * "表示":http://code.google.com/p/myoshida-rp/source/browse/#svn%2Ftrunk%2FTips%2Falias%2Fwikimacro%2Fredmine_wikipedia_link%253Fstate%253Dclosed |
||
116 | * "ダウンロード":http://code.google.com/p/myoshida-rp/downloads/detail?name=sample-wikimacro.zip |
||
117 | |||
118 | サンプルとしてウィキペディアへのリンクをはるマクロを考えてみます。 |
||
119 | ウィキペディアで例えば _Redmine_ や _日本語_ を表示してみると次のようなアドレスになっています。 |
||
120 | <pre> |
||
121 | http://ja.wikipedia.org/wiki/Redmine |
||
122 | http://ja.wikipedia.org/wiki/日本語 |
||
123 | </pre> |
||
124 | これを見ると <notextile>http://ja.wikipedia.org/wiki</notextile>の後に単語を追加すればいいみたいです。そこで単語をマクロの引数で指定して、それを wiki/ の後に追加するマクロにしましょう。 |
||
125 | ちなみに最近のブラウザはかしこいので、アドレスには日本語が表示されていますが、実際には日本語はアドレスとしては使えない文字なので、%E6... といった感じでエスケープされています。 |
||
126 | |||
127 | マクロのプラグインの場合も通常のプラグインのように最初にスケルトンを生成します。ただし、今回は簡単なので init.rb しか使用しません。その後 init.rb のプラグインの register 内を適当に記述します。 |
||
128 | |||
129 | wiki マクロを登録するには Plugin のように register 関数で登録します。この関数は実行されればどこに書いてもいいと思いますが、通常 *init.rb* に記述します。 |
||
130 | <pre><code class="ruby"> |
||
131 | Redmine::WikiFormatting::Macros.register do |
||
132 | desc "Wikipedia link macro" |
||
133 | macro :wikipedia do |obj, args| |
||
134 | if (args.size != 1) |
||
135 | raise "Wikipedia macro is given only one argument." |
||
136 | else |
||
137 | word = args.first.strip |
||
138 | addr = "http://ja.wikipedia.org/wiki/" + CGI.escape(word) |
||
139 | 10 | Mitsuyoshi Yoshida | return link_to(word, addr, :class => "external") |
140 | 7 | Mitsuyoshi Yoshida | end |
141 | end |
||
142 | end |
||
143 | </pre> |
||
144 | |||
145 | まず、Plugin の register のように desc でマクロの説明を記述します。 |
||
146 | 11 | Haru Iida | この説明は{{@macro_list@}}で表示されるマクロ一覧に使用されます。 |
147 | 7 | Mitsuyoshi Yoshida | |
148 | 3 行目の macro からマクロの処理を記述します。 |
||
149 | 引数でマクロのキーワードを指定します。今回 wikipedia が引数になるようにしています。 |
||
150 | ブロック引数の @args@ にマクロの引数が配列で入っていて、これを元にリンクを作成していきます。 |
||
151 | |||
152 | 4, 5 行目でマクロの引数のチェックをしています。 |
||
153 | マクロの作成中に @raise@ するとそれがエラーとしてページに挿入されます。 |
||
154 | |||
155 | 7 行目で空白をとっています。 |
||
156 | wikipedia( Redmine ) というように空白を入れていると引数には空白込みで値がわたってきているためです。 |
||
157 | |||
158 | 8 行目でリンク先のアドレスを作成しています。 |
||
159 | 10 | Mitsuyoshi Yoshida | *CGI.escape* は ruby の標準の添付ライブラリである cgi に含まれる関数で日本語や = のようなアドレスとして使えない文字を % 形式のものに変換します。 |
160 | 1 | Toshiyuki Ando | |
161 | 9 行でリンクの文字列を返しています。この戻り値がそのまま html のページに挿入されます。 |
||
162 | 10 | Mitsuyoshi Yoshida | *link_to* は rails の関数で <a src = " _addr_ " class=>"external"> _word_ </a> といった html のリンクタグの文字列を返します。 |
163 | 第一引数が表示名で、今回リンクの表示文字はマクロの引数のままにしています。表示文字の場合も <, >, & といった使えない文字がありますが、これは link_to 内で勝手に直してくれます。 |
||
164 | 第二引数にはリンク先のアドレスを文字列で渡しています。 |
||
165 | 第三引数はハッシュでオプションを渡します。ここではタグのクラスを指定しています。Redmine 外部へのリンクの場合先頭に外部リンクをあらわすアイコンが付きますが、この wikipedia へのリンクも外部リンクなのでアイコンをつけた方がいいです。スタイルシートで定義されているので、クラスを @external@ とするだけでアイコンが表示されるようになります。 |
||
166 | 7 | Mitsuyoshi Yoshida | |
167 | 出来たプラグインを使ってみると、以下のような感じになります。 |
||
168 | <pre> |
||
169 | * {{wikipedia(Redmine)}} |
||
170 | * {{wikipedia(日本語)}} |
||
171 | * {{wikipedia(two, argument)}} |
||
172 | </pre> |
||
173 | 9 | Mitsuyoshi Yoshida | |
174 | 7 | Mitsuyoshi Yoshida | !wikimacro_view.png! |