2010-01-19
Redmine¼«ÂΤ˼ê¤òÆþ¤ì¤º¤Ë¸«¤¿ÌܤòÊѹ¹¤¹¤ëÊýË¡
Redmine ¤Ï Rails À½¤Ê¤Î¤Ç¡¢¤Á¤ç¤Ã¤È¤·¤¿µ¤¤ËÆþ¤é¤Ê¤¤Éôʬ¤ÏľÀܼê¤òÆþ¤ì¤¿¤¯¤Ê¤ë¤Î¤À¤±¤ì¤É¤â¡¢ËܲȤΥ¢¥Ã¥×¥Ç¡¼¥È¤¬Áᤤ¤Î¤Ç¤ä¤Ï¤ê¥×¥é¥°¥¤¥ó·Á¼°¤Ë¤·¤Æ¤ª¤¤¤¿Êý¤¬¤¤¤¤¡£¤Ê¤Î¤Ç¡¢³ÈÄ¥¥Ý¥¤¥ó¥È¤È¤¤¤¦¤«¡¢¤Ç¤¤ë¤³¤È¤ò¥á¥â¤·¤Æ¤ª¤¤Þ¤¹¡£
°Ê²¼¤Î4¤Ä¤ÎÊýË¡¤È¤½¤ì¤¾¤ì¤ÎÎã¤ò¾Ò²ð¤·¤Þ¤¹¡£
- ¥Æ¡¼¥Þ
- ViewHook
- ¥×¥é¥°¥¤¥ó¤Ç¸À¸ì¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤
- ¥×¥é¥°¥¤¥ó¤Çrhtml¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤
¾¤ËÊýË¡¤¬¤¢¤ì¤Ð¥³¥á¥ó¥È¤¯¤À¤µ¤¤¡£¡Ê¤½¤ì¤¬ÌÜŪ
¥Æ¡¼¥Þ¤Ç¸«¤¿ÌܤòÊѤ¨¤ë
¤³¤ì¤¬°ìÈÖ´Êñ¡£
Î㤨¤Ð¡¢¥Á¥±¥Ã¥È¤ÎÍúÎò¤Ã¤Æ¡¢¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¡¢¥Ñ¥Ã¤È¸«¤Ç¤¤¤¯¤Ä¤¢¤ë¤Î¤«Ê¬¤«¤ê¤Å¤é¤¤¡£
¶èÀÚ¤êÀ褬¥æ¡¼¥¶Ì¾¤ÈÊѹ¹ÆâÍÆ¤Î´Ö¤ËÆþ¤Ã¤Æ¤¤¤ë¤³¤È¤¬¸¶°ø¤À¤È¹Í¤¨¤é¤ì¤Þ¤¹¡£
¤½¤³¤Ç¡¢¥Æ¡¼¥Þ¤òºî¤Ã¤Æ¸«¤ä¤¹¤¯¤¹¤ë¤³¤È¤ò¹Í¤¨¤Þ¤¹¡£
1.´û¸¥Æ¡¼¥Þ¤ò¥³¥Ô¡¼
¤Þ¤º¡¢theme ¥Ç¥£¥ì¥¯¥È¥ê°Ê²¼¤Î´û¸¤Î¥Æ¡¼¥Þ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¡£
$ cd Redmine¥¤¥ó¥¹¥È¡¼¥ë¥Ç¥£¥ì¥¯¥È¥ê/pulbic/themes/ $ cp -R alternate newtheme
2.¥¹¥¿¥¤¥ë¥·¡¼¥È¤ÎÊÔ½¸
newtheme/stylesheets/application.css ¤Ë¤Ï¤³¤ó¤Ê´¶¤¸¤ÇÄɵ¤·¤Þ¤¹¡£
/* history */ div#history { border: solid 1px #898989; background-color: #dedede; } div#history h3 { border-bottom: solid 1px #898989; } div#history .journal { border-bottom: solid 1px #898989; padding-left: 10px; }
3.¥Æ¡¼¥Þ¤ÎÊѹ¹
´ÉÍý¼Ô¸¢¸Â¤Ç ´ÉÍý>ÀßÄê>ɽ¼¨(¥¿¥Ö) ¤è¤ê¡¢¡Ö¥Æ¡¼¥Þ¡×¤ò ¡Önewtheme¡×¤Ë¤·¤Þ¤¹
4.·ë²Ì¤Î³Îǧ
¤³¤ó¤Ê´¶¤¸¤Ë¤Ê¤ê¤Þ¤¹¡£
¥×¥é¥°¥¤¥ó¤Çɽ¼¨¤òÄɲÃ(View Hooks)
Redmine ¤Ï¥×¥é¥°¥¤¥ó¤Ç³ÈÄ¥¤¹¤ë¤³¤È¤¬°Õ¼±¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
View Hook ¤Ï¤¢¤é¤«¤¸¤áÄê¤á¤é¤ì¤¿¾ì½ê¤Ë¥×¥é¥°¥¤¥ó¤«¤éɽ¼¨¹àÌܤÎÄɲäò²Äǽ¤È¤¹¤ëµ¡¹½¤Ç¤¹¡£
Hook¤Î°ìÍ÷¤Ï Redmine - Hooks - Redmine ¤Ë¤¢¤ê¤Þ¤¹¡£
¤Þ¤¿,
$ rake redmine:plugins:hook_list
¤Ç¤â³Îǧ¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤³¤Ç¤Ï :view_account_left_bottom ¤ò»È¤Ã¤Æ¡¢¥¢¥«¥¦¥ó¥È¾ðÊó¤Îº¸²¼¤ËôÅö¥Á¥±¥Ã¥È¿ô¤òɽ¼¨¤·¤Æ¤ß¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ï¤³¤ó¤Ê´¶¤¸¤Ç¤¹¡£
1.¥×¥é¥°¥¤¥ó¤ÎºîÀ®
¥×¥é¥°¥¤¥ó¤ÎºîÀ®ÊýË¡¤Î¾ÜºÙ¤Ï Redmine ¥×¥é¥°¥¤¥ó³«È¯ÆþÌç - mallowlabs¤ÎÈ÷˺Ͽ ¤ò»²¾È¡£
$ ruby script/generate redmine_plugin AccountTichets
2.¥ê¥¹¥Ê¤ÎºîÀ®
vendor/plugins/redmine_account_tichets/lib/account_listener.rb ¤È¤·¤Æ°Ê²¼¤Î¥ê¥¹¥Ê¤òºîÀ®¤·¤Þ¤¹¡£
class AccountListener < Redmine::Hook::ViewListener def view_account_left_bottom(context) user = context[:user] assigned_issues = Issue.visible.open.find(:all, :conditions => {:assigned_to_id => User.current.id}) reported_issues = Issue.visible.find(:all, :conditions => {:author_id => User.current.id }) html = '' html << '<h3>Tickets</h3><ul>' html << '<li>assigned: ' + assigned_issues.size.to_s + ' Tickets</li>' html << '<li>reported: ' + reported_issues.size.to_s + ' Tickets</li>' html << '</ul>' html end end
- ViewHook¤òÍøÍѤ¹¤ë¤Ë¤Ï Redmine::Hook::ViewListener ¤ò·Ñ¾µ¤·¤¿¥ê¥¹¥Ê¥¯¥é¥¹¤òºîÀ®¤·¤Þ¤¹¡£
- :view_account_left_bottom ¤Ë¥Õ¥Ã¥¯¤¹¤ë¾ì¹ç¤Ï view_account_left_bottom ¤È¤¤¤¦¥á¥½¥Ã¥É¤Ë¤·¤Þ¤¹¡£
- view_account_left_bottom ¤Î°ú¿ô¤Ï¥Ï¥Ã¥·¥å¤Ç¡¢Redmine - Hooks - Redmine ¤Î Context ¤ËÁêÅö¤·¤Þ¤¹¡£context[:user]¤Ç User¥ª¥Ö¥¸¥§¥¯¥È¤¬¼èÆÀ¤Ç¤¤Þ¤¹¡£¤³¤Î¾ì¹ç¤Ï¥í¥°¥¤¥ó¥æ¡¼¥¶ËܿͤǤ¹
- ViewListener ¤Î¥á¥½¥Ã¥É¤Ï HTML¤òÊÖ¤¹É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ÊÖ¤µ¤ì¤¿HTML¤Ï¤½¤Î¤Þ¤Þ³ºÅö²Õ½ê¤Ëɽ¼¨¤µ¤ì¤Þ¤¹¡£
3.¥ê¥¹¥Ê¤ÎÅÐÏ¿
plugin¥Ç¥£¥ì¥¯¥È¥êľ²¼¤Îinit.rb ¤Ç require ¤¹¤ë¤À¤±¤Ç¤¹¡£
require 'redmine' require 'account_listener' # ¤³¤³¤òÄɲà Redmine::Plugin.register :redmine_account_tichets do name 'Redmine Account Tichets plugin' author 'Author name' description 'This is a plugin for Redmine' version '0.0.1' end
4.Redmine ¤òºÆµ¯Æ°¤·¤Æ³Îǧ
¥×¥é¥°¥¤¥ó¤ÎÈ¿±Ç¤Ë¤ÏºÆµ¯Æ°¤¬É¬ÍפǤ¹¡£
º¸²¼¤ËôÅöÃæ¤Î¥Á¥±¥Ã¥È¿ô¤ÈÊó¹ð¤·¤¿¥Á¥±¥Ã¥È¿ô¤¬É½¼¨¤µ¤ì¤Þ¤¹¡£
¥×¥é¥°¥¤¥ó¤Ç¸À¸ì¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤
¸À¸ì¥Õ¥¡¥¤¥ë(config/locales/*.yml)¤ÎÆâÍÆ¤Ï¡¢¥×¥é¥°¥¤¥ó¤ÎÊý¤¬Í¥À褵¤ì¤Þ¤¹¡£
¤³¤ì¤òÍøÍѤ·¤ÆÊ¸¸À¤òÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
1. ¥×¥é¥°¥¤¥óºîÀ®
¾åµ¤ÈƱÍͤ˥³¥Þ¥ó¥É¤ÇºîÀ®¤·¤Þ¤¹¡£
$ ruby script/generate redmine_plugin LiteralOverwrite
2. ¸À¸ì¥Õ¥¡¥¤¥ë¤ÎºîÀ®
vendor/plugins/redmine_literal_overwrite/config/locales/ja.yml ¤òºîÀ®¤·¡¢°Ê²¼¤Î¤è¤¦¤Ë config/locales/ja.yml ¤Ë¤¢¤ë¹àÌܤò¾å½ñ¤¤·¤Þ¤¹¡£
ja: field_tracker: ¥Á¥±¥Ã¥È¼ïÊÌ field_tilte: ¥¿¥¤¥È¥ë field_description: ¾ÜºÙ field_status: ¾õÂÖ
3. Redmine ¤òºÆµ¯Æ°¤·¤Æ³Îǧ
¤³¤ó¤Ê´¶¤¸¤Çʸ¸À¤¬ÊѤï¤ê¤Þ¤¹¡£
¥×¥é¥°¥¤¥ó¤Çrhtml¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤
¤É¤¦¤·¤è¤¦¤â¤Ê¤¤¾ì¹ç¤Ï¤â¤È¤«¤é¤¢¤ërhtml¥Õ¥¡¥¤¥ë¤ò¾å½ñ¤¤·¤Æ¤·¤Þ¤¦¤³¤È¤â¤Ç¤¤Þ¤¹¡£
¤¿¤À¤·¡¢¤³¤ÎÊýË¡¤ÏËÜÂΤ¬¥¢¥Ã¥×¥Ç¡¼¥È¤·¤¿¤È¤¤Ë¡¢¤â¤È¤Î¥Õ¥¡¥¤¥ë¤¬Êѹ¹¤µ¤ì¤Æ¤¤¤ë¤³¤È¤Ëµ¤¤Å¤«¤Ê¤«¤Ã¤¿¤ê¡¢¤â¤È¤Î¥Õ¥¡¥¤¥ë¤¬¾Ã¤µ¤ì¤Æ¡¢¤â¤¦»È¤ï¤ì¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤¿¤ê¤¹¤ë²ÄǽÀ¤¬¤¢¤ë¤Î¤Çµ¤¤òÉÕ¤±¤Þ¤·¤ç¤¦¡£
¤³¤³¤Ç¤Ï¡¢¥Á¥±¥Ã¥È²èÌ̤ΠAtom ¤Î¥ê¥ó¥¯¤òºï½ü¤·¤Þ¤¹¡£
1. ¥×¥é¥°¥¤¥ó¤ÎºîÀ®
¾åµ¤ÈƱ¤¸¤Ç¤¹¡£
$ ruby script/generate redmine_plugin IssueViewOverwrite
2. ¤â¤È¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Ô¡¼¤¹¤ë
¥Á¥±¥Ã¥È²èÌÌ¤Ï app/views/issues/show.rhtml ¤Ç¤¹¡£
¤³¤ì¤ò¡¢¥×¥é¥°¥¤¥ó¥Ç¥£¥ì¥¯¥È¥ê¤Ë¡¢¤Þ¤Ã¤¿¤¯Æ±¤¸¹½Â¤¤ÇÇÛÃÖ¤·¤Þ¤¹¡£
°ì¤«¤é½ñ¤Ä¾¤¹¤è¤ê¤Ï¤â¤È¤Î¥Õ¥¡¥¤¥ë¤ò¥³¥Ô¡¼¤·¤ÆÊÔ½¸¤¹¤ë¤Û¤¦¤¬³Ú¤Ç¤¹¡£¡Ê¥é¥¤¥»¥ó¥¹¤ËÃí°Õ¡Ë
$ mkdir vendor/plugins/redmine_issue_view_overwrite/app/views/issues $ cp app/views/issues/show.rhtml vendor/plugins/redmine_issue_view_overwrite/app/views/issues
3. ¾å½ñ¤¤¹¤ë¥Õ¥¡¥¤¥ë¤ÎÊÔ½¸
vendor/plugins/redmine_issue_view_overwrite/app/views/issues/show.rhtml ¤òÊÔ½¸¤·¤Þ¤¹
¤â¤È¤Î¥Õ¥¡¥¤¥ë¤ÎºÇ¸å¤¢¤¿¤ê¡£
<% other_formats_links do |f| %> <%= f.link_to 'Atom', :url => {:key => User.current.rss_key} %> <%= f.link_to 'PDF' %> <% end %> <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> <% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> <% end %> <% content_for :header_tags do %> <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %> <%= stylesheet_link_tag 'scm' %> <% end %>
¤³¤³¤«¤é Atom ¤Î½ÐÎÏÉôʬ¤òºï½ü¤·¤Þ¤¹¡£
<% other_formats_links do |f| %> <%= f.link_to 'PDF' %> <% end %> <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %> <% content_for :sidebar do %> <%= render :partial => 'issues/sidebar' %> <% end %> <% content_for :header_tags do %> <%= stylesheet_link_tag 'scm' %> <% end %>
4. Redmine¤òºÆµ¯Æ°¤·¤Æ³Îǧ
¤³¤Î¤è¤¦¤Ë±¦²¼¤¬PDF¤À¤±¤Ë¤Ê¤ê¤Þ¤¹¡£
¤Þ¤È¤á
- ¥Æ¡¼¥Þ -> CSS¤À¤±¤ÇºÑ¤à(HTML¥¿¥°¤¬Áý¤¨¤¿¤ê¸º¤Ã¤¿¤ê¤·¤Ê¤¤)¾ì¹ç
- ViewHook -> ¥Õ¥Ã¥¯¥Ý¥¤¥ó¥È¤¬ÍѰդµ¤ì¤Æ¤¤¤ë¾ì¹ç
- ¸À¸ì¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤ -> ¸ÇÄê¤Îʸ¸À¤òÊѤ¨¤ë¾ì¹ç
- rhtml¥Õ¥¡¥¤¥ë¾å½ñ¤ -> ºÇ¸å¤Î¼êÃÊ
¤È¤¤¤¦´¶¤¸¤Ç¤¹¡£
¤â¤Ã¤È¥¨¥ì¥¬¥ó¥È¤ÊÊýË¡¤¬¤¢¤ì¤Ð¥³¥á¥ó¥È¤¯¤À¤µ¤¤¡£
- 59 http://pipes.yahoo.com/pipes/pipe.info?_id=242f50e5030d8e9e73ce52013bcbf820
- 28 http://reader.livedoor.com/reader/
- 20 http://pipes.yahoo.com/pipes/pipe.info?_id=faa858a20082ef6d25ad27557e37e011
- 9 http://www.google.co.jp/reader/view/?hl=ja&tab=wy
- 8 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Lgw&q=redmine¡¡blog+¥×¥é¥°¥¤¥ó&start=80&sa=N
- 8 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLF_jaJP286JP310&q=dhcpd+¾õ¶·
- 8 http://www.google.com/reader/view/
- 7 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=N1h&q=redmine+latex&btnG=¸¡º÷&lr=lang_ja&aq=f&oq=
- 5 http://www.google.co.jp/reader/view/
- 4 http://b.hatena.ne.jp/t/ruby