読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

ConfluenceのVelocityテンプレートで使えるカスタムタグについて

confluence

ConfluenceのVelocityテンプレートは、Sitemeshというデコレータによりパワーアップされているらしい。ちなみに、SiteMeshはOpenSymphonyというJavaの結構すごい大規模なプロジェクトの1つだったのだが全体としてのOpenSymphonyは既に4年くらい前に終了し、その中のWebWorkやSitemeshというサブプロジェクトのみが生き残っているらしい。


ただ、正直なところこれとかを見ても良く分からないので、Confluenceのソースコードを見ながらちょくちょくとここにそのタグを調べていくことにする。
Velocity Decorators - SiteMesh 2 - Confluence
Apache Velocity - Velocity

Sitemeshの設定ファイル

このぺーじによると、Sitemeshの設定ファイルweb.xml
confluence-project/confluence-core/confluence-webapp/src/main/webapp/WEB-INF/web.xml
これっぽい。

ただ、大量に書かれてて、これが何をどうするっていうのかはよくわからない・・・。

Velocityテンプレートのカスタムタグ

下記にあるJavaファイルがカスタムタグを作っているようだ。
./confluence-project/confluence-core/confluence/src/java/com/atlassian/confluence/setup/velocity/

DecoratorParamは、
./confluence-project/confluence-core/confluence/src/java/com/atlassian/confluence/setup/velocity/ParamDirective.java
で定義されているっぽい。

#parse(テンプレートファイル)

PHPでいうinclude。確認できているPATHは、

  • プラグインの src/main/resources
  • confluence-project/confluence-core/confluence-webapp/src/main/webapp

#applyDecorator("タグ")

囲うことで

ブロックや
ブロックを作ってくれる。#decoratorParamにより、そのDIVやFORMの属性値を設定できる。

#applyDecorator("root")
#decoratorParam("helper" "hogehoge")
#decoratorParam("context" "space-administration")
#decoratorParam("mode" "view-space-administration")
... そのほかいろいろと ...
#end

#applyDecorator("form-aui")
#decoratorParam("submitAction" "livesearch_conf.action")
#decoratorParam("method" "post")
#decoratorParam("formName" "docreatemailserver")
... そのほかいろいろと ...
#end

このタグとして使えるのは
./confluence-project/confluence-core/confluence-webapp/src/main/webapp/WEB-INF/decorators.xml
要素として列挙されている。

たとえば、rootタグであれば、
./confluence-project/confluence-core/confluence-webapp/src/main/webapp/decorators/root.vmd
が使われる。このファイルはVelocityテンプレートであり要はパーツ化されているということになる。例として、

  • root:普通に、
    となる。その下の#decoratorParamに何を入れるとどうなるっていうのは良く分からない・・・。contextとmodeにセットした値はこの#contentのclass値に設定される。また、#decoratorParam("context" "$action.page.getType()")という子要素は必須なようで、これが無いとエラーになる。
  • form-aui:フォームを作成する。auiというのは、おそらくAtlassian-UIでそれっぽいインターフェースをもったフォームを与えてくれるようになる。

#form_xsrfToken()

CSRF対策のワンタイムチケットの発行・・・と思う。

#tag(タグ種類)

#tag( "TextField" "label='Forename'" "name='namae'" "size='50'" )

というようにパラメータを与えることでフォームエレメントを出力する。name引数に入っているものは、JavaのActionクラスと連携している。

今のところタグ種類として確認してるのは、

  • Submit:サブミットボタン(&キャンセルリンク)
  • TextField:1行入力ボックス
  • Component:不明
  • Password:パスワード入力ボックス
  • Select:プルダウン。list引数でオプション値。
  • Radio:ラジオボックス。valueで単独値?list引数でオプション値一覧?
  • Hidden:隠し要素
  • Textarea:複数行テキストエリア

theme引数を与えるとこで全く違う表示を行う。というのは、
confluence-core/confluence-webapp/src/main/webapp/template
にあるどのファイルを読み込むかの指定をしているためである。

随時追加予定