メモ: プラグイン用のフォルダの名前は、通常は「プラグイン名.作成者のドメイン名」を逆にしたものになります。例えば「ABC」という名前のプラグインを「traction.co.jp」が作成する場合、フォルダ名は「jp.co.traction.abc」になります。しかし、必ずしもこのルールに従う必要はありません。 (参照: FAQ1683.08: TeamPage プラグイン概要)
メモ: TeamPage の開発の歴史的な理由により、「プロジェクト」は、SDL プログラムの世界では「goal」と呼ばれています。そこで、今回、プラグインのフォルダを「com.traction.projectfaqtab」ではなく「com.traction.goalfaqtab」とします。
display_name=Project FAQ Tab
description=Inserts the "FAQ" tab next to the Dashboard tab.
name=com.traction.goalfaqtab
version=1.0
<sdl.function name="bodytabs">
<gwt.rpc.view name="BodyTabs" key="heading">
{ tabs: [
{ t: "#{gwtrpc_tab_dashboard}", l: "<shared#addentry href='#/project/dashboard' />"<compare.equals "<config.view.value name='viewtype' />" "single" "goal_dashboard">, x: true</compare.equals> },
{ t: "#{gwtrpc_subtab_tasks_overview}", l: "<shared#addentry href='#/project/tasks' />" },
{ t: "#{gwtrpc_subtab_tasks_milestones}", l: "<shared#addentry href='#/project/milestones' />" },
{ t: "#{gwtrpc_tab_activity}", l: "<shared#addentry href='#/project/activity' />" },
{ t: "#{gwtrpc_tab_status}", l: "<shared#addentry href='#/project/status' />" },
{ t: "#{gwtrpc_tab_calendar}", l: "<shared#addentry href='#/project/cal' />&edate=month" },
{ t: "#{gwtrpc_tab_documents}", l: "<shared#addentry href='#/project/docs' />"<scope.hasfile>, x: true</scope.hasfile> },
{ t: "#{gwtrpc_subtab_goal_discussion}", l: "<shared#addentry href='#/project/discussion' />" },
{ t: "#{related_entries}", l: "<shared#addentry href='#/project/related' />" },
{ t: "#{entrytabs_history}", l: "<shared#addentry href='#/history' />" }
] }
</gwt.rpc.view>
</sdl.function>
メモ: 上書きされる「前者」と上書きする「後者」は、インストール済みプラグイン一覧に表示されるプラグインの順序で決まります。
<sdl.function name="bodytabs-inner">
<foreach list="<config.project.value name='custompmentrytabs_goal_tabs' />">
<switch value="__foreach.current__">
<case value="dashboard">
<#bodytabs-dashboard />
</case>
<case value="tasks" value="task" value="tasks_overview">
<#bodytabs-tasks />
</case>
<case value="milestones" value="milestone">
<#bodytabs-milestones />
</case>
<case value="activity" value="activities">
<#bodytabs-activity />
</case>
<case value="status">
<#bodytabs-status />
</case>
<case value="calencar" value="cal">
<#bodytabs-calendar />
</case>
<case value="documents" value="sharefolder">
<#bodytabs-documents />
</case>
<case value="comments" value="discussion">
<#bodytabs-discussion />
</case>
<case value="related">
<#bodytabs-related />
</case>
<case value="history">
<#bodytabs-history />
</case>
</switch>
</foreach>
</sdl.function>
<sdl.function name="bodytabs-tasks">
{ t: "#{gwtrpc_subtab_tasks_overview}", l: "<shared#addentry href='#/project/tasks' />" },
</sdl.function>
{ t: "#{gwtrpc_subtab_tasks_overview}", l: "<shared#addentry href='#/project/tasks' />" },
<sdl.function name="bodytabs-faq">
{ t: "FAQ", l: "<shared#addentry href='#/project/faq' />" },
</sdl.function>
<sdl.function name="bodytabs-dashboard">
<##bodytabs-dashboard />
<#bodytabs-faq />
</sdl.function>
{ t: "#{gwtrpc_tab_dashboard}", l: "<shared#addentry href='#/project/dashboard' />", x: true },
{ t: "FAQ", l: "<shared#addentry href='#/project/faq' />" },
# 「project_tasks.properties」の設定を引き継ぐ
__inherits=project_tasks
# 「viewtype」という属性の値を「goal_faq」とする
viewtype=goal_faq
sdl=
行で、次のように画面表示に使う .sdl ファイルが指定されています。
sdl=com.traction.sdl.gwtrpc.goal
<switch>〜</switch>
の部分(下記)を確認します。
<switch value="<config.view.value name='viewtype' />">
<case value="goal_dashboard" value="single">
<#dashboard />
</case>
<case value="goal_tasks">
<#tasks />
</case>
<case value="goal_milestones">
<#milestones />
</case>
<case value="goal_activity">
<com.traction.sdl.tasks.actfeed#entry-activity />
</case>
<!--- This view configuration still exists, so we still handle it,
but isn't exposed in the UI. [shep 28.Mar.2011] -->
<case value="goal_desc">
<shared#entry-desc />
</case>
<case value="goal_cal">
<#calendar />
</case>
<case value="goal_docs">
<shared#entry-docs />
</case>
<case value="goal_discussion">
<shared#entry-discussion />
</case>
<case value="goal_related">
<shared#entry-related />
</case>
<case value="goal_status">
<shared#entry-status />
</case>
</switch>
<switch>
タグは、value 属性の値に対応した <case>
タグに条件分岐を行います。<config.view.value name='viewtype' />
は、ビューの定義ファイル(config/gwt/views の中の .properties ファイル)で定義された「viewtype」という名前の属性の値を得るタグです。「project_faq」ビューを表示するとき、ビューの定義ファイルである config/gwt/views/project_faq.properties ファイルの中の viewtype=
行の右辺である「goal_faq」という値になります。<switch>〜</switch>
内に「goal_faq」の条件分岐のための <case value="goal_faq">〜</case>
を挿入すれば良いわけです。<switch>〜</switch>
部分を次のように書き換えます。(2行目から4行目に、「viewtype の値が "goal_faq" だったら」の分岐(<case>〜</case>
)を挿入します。)
<switch value="<config.view.value name='viewtype' />">
<case value="goal_faq">
<#faq />
</case>
<case value="goal_dashboard" value="single">
<#dashboard />
</case>
<case value="goal_tasks">
<#tasks />
</case>
<case value="goal_milestones">
<#milestones />
</case>
<case value="goal_activity">
<com.traction.sdl.tasks.actfeed#entry-activity />
</case>
<!--- This view configuration still exists, so we still handle it,
but isn't exposed in the UI. [shep 28.Mar.2011] -->
<case value="goal_desc">
<shared#entry-desc />
</case>
<case value="goal_cal">
<#calendar />
</case>
<case value="goal_docs">
<shared#entry-docs />
</case>
<case value="goal_discussion">
<shared#entry-discussion />
</case>
<case value="goal_related">
<shared#entry-related />
</case>
<case value="goal_status">
<shared#entry-status />
</case>
</switch>
<case>〜</case>
内の <#faq />
は、「『faq』という名前の関数を呼び出せ」という意味です。それでは、その「faq」関数を作成します。<entries>〜</entries>
という SDL タグを使います。パラメーターを使って記事一覧の範囲を限定できます。ここでは type=
パラメーターで cat (タグが付いた記事)を、cat=
パラメーターでプロジェクトとの関連性タグ(Entry Label)を、search=
パラメーターで「FAQ」タグを指定することで、「プロジェクトに関連付けられており、なおかつ『faq』というタグが付いている記事」を取得します。
<sdl.function name="faq">
<gwt.rpc.view name="HTML" region="entries">
<#faq-entries />
</gwt.rpc.view>
<shared#chunkmore-custom />
</sdl.function>
<sdl.function name="faq-entries">
<div class="entries faq-entries">
<div class="feed">
<entries type="cat" cat=":-e:goal:__entry.tractionid.entry__" search='x(::*:FAQ)' proj="*" volume="feed">
__entry.content__
</entries>
</div>
</div>
</sdl.function>
メモ: この「25件ずつ」の件数は、ユーザー毎に、パーソナルセットアップの 1画面に表示する記事の数 で変更できます。または、サーバーセットアップ > 既定値で、すべてのユーザーの既定の件数を変更できます。
new_plugin_dir.png
standard_project_tabs.png
plugin_enabled.png
goal_faq_tab_showup.png
new_goal_sdl.png
error.png
views_properties_dir.png
faq_entries.png
com.traction.goalfaqtab-1.0.zip