Liferay 7.1のアセットパブリッシャー用アプリケーション・ディスプレイ・テンプレート(ADT)サンプル 

この記事は、[Liferay 6.2のアセットパブリッシャー用アプリケーション・ディスプレイ・テンプレート(ADT)サンプル](https://qiita.com/drafts/024e45b85ff7e800a18d) から、7.1以降での差分を説明します。ADTやWebコンテンツでのテンプレート使用方法に関しては

* [Liferay 6.2のWebコンテンツ用アプリケーション・ディスプレイ・テンプレート(ADT)サンプル](https://qiita.com/yasuflatland-lf/items/024e45b85ff7e800a18d)
* [Liferay 6.2 のWebコンテンツテンプレートのサンプル](https://qiita.com/yasuflatland-lf/items/9a98f52397869ed1f8b2)

を参照ください。

##組み込みサービスの取得方法
Liferay 7.1から大きく変わったのはテンプレート周りで利用できる変数の権限管理です。以前は```portal-ext.properties```で設定していたのですが、7.1からシステム設定画面から設定するようになりました。

コントロールパネル -> 設定 -> システム設定 -> テンプレートエンジン -> FreeMarkerエンジンページへ行き、
で、リストにある```serviceLocator```や```staticUtil```を、制限付き変数のリストから削除してください。ユーザーがテンプレートを利用する際にこれらのオブジェクトのアクセス権限を渡すことはセキュリティのリスクにもなるので、テンプレートの編集権限は本当に必要なユーザーのみに公開するように、権限設定や運用を今一度確認、検討してください。

GUIからの設定以外にも、

```text
com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration.cfg
```
 という名前のファイルを

```shell
$LIFERAY_HOME/osgi/configs
```
に配置することで、同様の設定を行うこともできます。またGUIの設定をエクスポートすると、同様の設定が上記の場所に出力されます。例として中身を

```text
restrictedVariables=
```
のように設定すると、全てのテンプレート内部で使用可能オブジェクトにアクセスできるようになります。これら値のデフォルトは

```text
com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration
```

を参照してください。

## 画像データの表示方法
たとえば、Webコンテンツで```ddm-image```で、ドキュメントメディアのデータを取得するフィールドがあり、[この記事で説明している](https://qiita.com/yasuflatland-lf/items/024e45b85ff7e800a18d#web%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%96%E5%BE%97)自作関数で、```blog_catch```変数に、```ddm-image```内部に保存されているjsonデータを読み込んできているとします。

その場合、以下のような方法でドキュメントとメディア内に保存してあるアセットデータへのパスが取得できます。

```text
<#assign
	serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()
	themeDisplay = serviceContext.getThemeDisplay()
	dlAppLocalServiceUtil = staticUtil["com.liferay.document.library.kernel.service.DLAppLocalServiceUtil"]
	dlUtil = staticUtil["com.liferay.document.library.kernel.util.DLUtil"]	
    blog_catch = blog_catch?eval
    uuid = blog_catch.uuid
    groupId = blog_catch.groupId 
    dlFile = dlAppLocalServiceUtil.getFileEntryByUuidAndGroupId(uuid,groupId?number)
    imgUrl =  dlUtil.getPreviewURL(dlFile, dlFile.getFileVersion(),themeDisplay,'')
>
<a href="${imgUrl}">image url</a>
```

気をつけるのは

```text
blog_catch = blog_catch?eval
```
の部分で、Freemarkerテンプレート言語で、jsonを読み込んできた場合、```eval```メソッドで読み込むことでjsonオブジェクトとしてアクセスできるようになります。また、数値は

```text
groupId?number
```
のように、```number```メソッドをコールする必要があります。

## 編集リンクを、編集権限があるユーザーにのみ表示したい
以下のように、`editURL` を生成し、`Freemarker`だと`Taglib`が利用できるので、`icon`用タグリブを利用すると、以下のようにダイアログ表示での編集画面を組み込めます。`entry`はADTにデフォルトで入っている (`<#list entries as entry>`のような感じで）ので、そのまま使えるはずです。その他に呼び出しているライブラリも、システム設定から`Freemarker Template`のクラスコール制限を取り払ってしまえば、デフォルトでコールできます。

```text
<#assign
    portletId = themeDisplay.getPortletDisplay().getId()
    plid = getterUtil.getLong(themeDisplay.getPlid())
    portletURL = portletURLFactory.create(renderRequest, portletId, plid, "RENDER_PHASE")
    windowState = windowStateFactory.getWindowState("POP_UP")
    assetRenderer = entry.getAssetRenderer()
    editURL = assetRenderer.getURLEdit(renderRequest,renderResponse, windowState, currentPortletURL)
    VOID = editURL.setParameter("hideDefaultSuccessMessage", "true")
    VOID = editURL.setParameter("returnToFullPageURL", currentPortletURL)
>
<#if editURL?has_content && assetRenderer.hasEditPermission(permissionChecker)>
  <@liferay_ui["icon"] method="get" url="${editURL}" icon="pencil" useDialog=false />
</#if>
```