この記事は、Liferay 6.2のアセットパブリッシャー用アプリケーション・ディスプレイ・テンプレート(ADT)サンプル から、7.1以降での差分を説明します。ADTやWebコンテンツでのテンプレート使用方法に関しては
を参照ください。
##組み込みサービスの取得方法
Liferay 7.1から大きく変わったのはテンプレート周りで利用できる変数の権限管理です。以前はportal-ext.properties
で設定していたのですが、7.1からシステム設定画面から設定するようになりました。
コントロールパネル -> 設定 -> システム設定 -> テンプレートエンジン -> FreeMarkerエンジンページへ行き、
で、リストにあるserviceLocator
やstaticUtil
を、制限付き変数のリストから削除してください。ユーザーがテンプレートを利用する際にこれらのオブジェクトのアクセス権限を渡すことはセキュリティのリスクにもなるので、テンプレートの編集権限は本当に必要なユーザーのみに公開するように、権限設定や運用を今一度確認、検討してください。
GUIからの設定以外にも、
com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration.cfg
という名前のファイルを
$LIFERAY_HOME/osgi/configs
に配置することで、同様の設定を行うこともできます。またGUIの設定をエクスポートすると、同様の設定が上記の場所に出力されます。例として中身を
restrictedVariables=
のように設定すると、全てのテンプレート内部で使用可能オブジェクトにアクセスできるようになります。これら値のデフォルトは
com.liferay.portal.template.freemarker.configuration.FreeMarkerEngineConfiguration
を参照してください。
画像データの表示方法
たとえば、Webコンテンツでddm-image
で、ドキュメントメディアのデータを取得するフィールドがあり、この記事で説明している自作関数で、blog_catch
変数に、ddm-image
内部に保存されているjsonデータを読み込んできているとします。
その場合、以下のような方法でドキュメントとメディア内に保存してあるアセットデータへのパスが取得できます。
<#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>
気をつけるのは
blog_catch = blog_catch?eval
の部分で、Freemarkerテンプレート言語で、jsonを読み込んできた場合、eval
メソッドで読み込むことでjsonオブジェクトとしてアクセスできるようになります。また、数値は
groupId?number
のように、number
メソッドをコールする必要があります。
編集リンクを、編集権限があるユーザーにのみ表示したい
以下のように、editURL
を生成し、Freemarker
だとTaglib
が利用できるので、icon
用タグリブを利用すると、以下のようにダイアログ表示での編集画面を組み込めます。entry
はADTにデフォルトで入っている (<#list entries as entry>
のような感じで)ので、そのまま使えるはずです。その他に呼び出しているライブラリも、システム設定からFreemarker Template
のクラスコール制限を取り払ってしまえば、デフォルトでコールできます。
<#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>