アセットの有効化
Liferayの多くのアプリケーション(ブログ、ドキュメントとメディア、掲示板など)は、すぐに使用可能なアセットです。 アセットパブリッシャーウィジェットでアセットを公開したり、 アセットライブラリを作成することも可能です。 サービスビルダーを使用すると、カスタムアプリケーションをアセット対応にすることができます。 その方法は、以下のサンプルプロジェクトをご覧ください。
サンプルコードを取得する
新しいLiferay DXPインスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:7.4.13-u55。
メールアドレス[email protected]_とパスワード_test_を使用して、http://localhost:8080でLiferayにサインインしてください。 プロンプトが表示されたら、パスワードを _learn_に変更します。
次に、以下の手順を実行します。
アセットの有効化 をダウンロードし、解凍してください。
curl https://resources.learn.liferay.com/dxp/latest/ja/building-applications/data-frameworks/asset-framework/liferay-s5e6.zip -O
unzip liferay-s5e6.zip
モジュールのルートから、ビルドおよびデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.s5e6.api_1.0.0 [1433] STARTED com.acme.s5e6.service_1.0.0 [1434] STARTED com.acme.s5e6.web_1.0.0 [1435]
ブラウザで
https://localhost:8080
を開きます。S5E6ポートレットをページに追加します。 サンプルポートレットは、サンプルウィジェットの下にあります。
また、同じページにアセットパブリッシャーウィジェットを追加します。 ウィジェットは、コンテンツ管理の下にあります。
S5E6 Portletでエントリーを追加し(例:
s5e6_name1
ands5e6_description1
)[Submit]
をクリックして下さい。S5E6ポートレットはアセットに対応しているため、追加された項目は自動的にアセットパブリッシャーウィジェットに表示されます。
検索が有効になる前提条件
このチュートリアルでは、すでに検索が有効になっているサービスビルダーアプリケーションがあることを前提に説明します。 アプリケーションには最低限必要です。
*SearchRegistrar.java
- アプリケーションのエンティティに対して、サーチフレームワークにサーチサービスを登録する(例: com.acme.s5e6.search.S5E6SearchRegistrar.java
クラス)。
*ModelIndexerWriterContributor.java
- エントリーの再インデックス付けおよび一括再インデックス付けの動作を設定する(例: com.acme.s5e6.search.S5E6EntryModelIndexerWriterContributor.java
class)。
*ModelSummaryContributor.java
- エントリーの結果サマリーを構築する(例: com.acme.s5e6.search.S5E6EntryModelSummaryContributor.java
クラス)。
検索を有効にする方法については、検索の使用の 開発者ガイドを参照してください。
サービスモデルの定義の変更
アセットを有効にするには、次のようにエンティティを変更します。
以下のデータフィールドがまだ定義されていない場合は、追加してください。
<!-- Group instance --> <column name="groupId" type="long" /> <!-- Audit fields --> <column name="companyId" type="long" /> <column name="userId" type="long" /> <column name="userName" type="String" /> <column name="createDate" type="Date" /> <column name="modifiedDate" type="Date" />
アセットフレームワークは、アプリケーションのデータを追跡するために、これらのフィールドを必要とします。
</entity>
タグを閉じる直前に、アセットエントリーエンティティリファレンスを追加します。 後で、新しいアプリケーションのエントリーが追加されたとき、対応するエントリーがLiferayのAssetEntry
テーブルに追加されるように変更します。<reference entity="AssetEntry" package-path="com.liferay.portlet.asset" />
サービスビルダーを再実行します。
./gradlew s5e6-service:buildService
サービスレイヤーの更新
カスタムエンティティをLiferayアセットとして追加するには、プロジェクトの assetEntryLocalService
の updateEntry()
メソッドを -LocalServiceImpl
Javaクラスで呼び出す必要があります。 assetEntryLocalService.updateEntry()
を呼び出すと、 AssetEntry
テーブルに新しい行(アプリケーションのエントリに対応)が追加されます。 updateEntry()
メソッドは、アセットエントリーが存在するかどうかを確認し、適切な処理を行うため、アセットエントリーの追加と更新の両方が可能です。
サンプルプロジェクトでは、次のようになります。
assetEntryLocalService.updateEntry(
s5e6Entry.getUserId(), s5e6Entry.getGroupId(),
s5e6Entry.getCreateDate(), s5e6Entry.getModifiedDate(),
S5E6Entry.class.getName(), s5e6Entry.getS5E6EntryId(),
s5e6Entry.getUuid(), 0, null, null, true, true, null, null, null,
null, ContentTypes.TEXT, s5e6Entry.getName(),
s5e6Entry.getDescription(), s5e6Entry.getDescription(), null, null,
0, 0, 1.0);
return s5e6Entry;
AssetEntryLocalServiceImpl
クラス のJavadocsを確認すると、このメソッドはオーバーロードされていることが分かります。 updateEntry()
のバージョンで、title
パラメータを受け取り、アセットエントリーのタイトルを設定できるようにします。
変更後、サービスビルダーを再実行します。
アセットレンダラの作成
アセットとはエンティティの表示版なので、 title
, description
, summary
といったフィールドが含まれます。 Liferayはこれらのフィールドを使用して、アセットを表示します。 アセットレンダラは、これらのフィールドを介してエンティティをアセットに変換します。
アプリケーションで、Liferayの
BaseJSPAssetRenderer
クラスを拡張する-AssetRender
クラスを作成します。 例:public class S5E6EntryAssetRenderer extends BaseJSPAssetRenderer<S5E6Entry> { }
アセットレンダラクラスのコンストラクタを定義します。
public S5E6EntryAssetRenderer(S5E6Entry s5e6Entry) { _s5e6Entry = s5e6Entry; }
異なるゲッターメソッドを使用して、アセットレンダラをアセットに接続します。
@Override
public S5E6Entry getAssetObject() {
return _s5e6Entry;
}
@Override
public String getClassName() {
return S5E6Entry.class.getName();
}
@Override
public long getClassPK() {
return _s5e6Entry.getS5E6EntryId();
}
@Override
public long getGroupId() {
return _s5e6Entry.getGroupId();
}
@Override
public String getJspPath(
HttpServletRequest httpServletRequest, String template) {
return null;
}
@Override
public String getSummary(
PortletRequest portletRequest, PortletResponse portletResponse) {
return _s5e6Entry.getDescription();
}
@Override
public String getTitle(Locale locale) {
return _s5e6Entry.getName();
}
@Override
public long getUserId() {
return _s5e6Entry.getUserId();
}
@Override
public String getUserName() {
return _s5e6Entry.getUserName();
}
@Override
public String getUuid() {
return _s5e6Entry.getUuid();
}
この例では、getTitle()
メソッドにname
属性、getSummary()
メソッドにアプリケーションのdescription
属性が設定されていることに注意してください。
アセットレンダラファクトリーの作成
アセットレンダラを作成したら、各アセットインスタンスにアセットレンダラを生成するファクトリークラスを作成する必要があります。
上記と同じフォルダに、Liferayの
BaseAssetRendererFactory
クラスを拡張する-AssetRendererFactory
クラスを作成します。 例:public class S5E6EntryAssetRendererFactory extends BaseAssetRendererFactory<S5E6Entry> { }
クラス宣言の上に
@Component
アノテーションを作成します。 このアノテーションは、アセットのファクトリーインスタンスを登録します。service
要素は、AssetRenderFactory.class
インターフェイスを指す必要があります。@Component(service = AssetRendererFactory.class)
ファクトリーの属性をプリセットするファクトリークラスのコンストラクタを作成します。
public S5E6EntryAssetRendererFactory() {
setClassName(S5E6Entry.class.getName());
setLinkable(true);
setPortletId("com_acme_s5e6_web_internal_portlet_S5E6Portlet");
setSearchable(true);
}
setLinkable
をtrue
に設定して、他のアセットはアセットを関連アセットとして選択できるようにします。 setSearchable
をtrue
に設定すると、検索時にアセットを見つけることができるようになります。
getAssetRenderer
メソッドを実装し、新しいS5E6AssetRenderer
インスタンスを構築します。
@Override
public AssetRenderer<S5E6Entry> getAssetRenderer(long classPK, int type)
throws PortalException {
S5E6EntryAssetRenderer s5e6EntryAssetRenderer =
new S5E6EntryAssetRenderer(
_s5e6EntryLocalService.getS5E6Entry(classPK));
s5e6EntryAssetRenderer.setAssetRendererType(type);
s5e6EntryAssetRenderer.setServletContext(_servletContext);
return s5e6EntryAssetRenderer;
}
必ず
@Reference
アノテーションを使用して、モジュールのシンボル名を定義してください。@Reference( target = "(osgi.web.symbolicname=com.acme.s5e6.web)" )
ポートレットを変更する
S5E6Portlet
のaddS5E6Entry
メソッドは、S5E6Entry
インスタンスを追加する要求を処理します。
public void addS5E6Entry(
ActionRequest actionRequest, ActionResponse actionResponse)
throws PortalException {
ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
WebKeys.THEME_DISPLAY);
ServiceContext serviceContext = ServiceContextFactory.getInstance(
S5E6Entry.class.getName(), actionRequest);
_s5e6EntryLocalService.addS5E6Entry(
themeDisplay.getUserId(), themeDisplay.getSiteGroupId(),
ParamUtil.getString(actionRequest, "description"),
ParamUtil.getString(actionRequest, "name"), serviceContext);
}
addS5E6Entry
は、ポートレットのアクションメソッドなので、 ActionRequest
とActionResponse
のパラメータを受け取ります。 新しいエントリーを追加するサービス呼び出しを行うには、 title
とdescription
をリクエストから取得する必要があります。 serviceContext
もリクエストから取得し、サービス呼び出しの引数として渡す必要があります。
ポートレットのview.jsp
には、ポートレットのactionURL
メソッドを呼び出すaddS5E6Entry
フォームが含まれています。
<h5>Add S5E6 Entry</h5>
<portlet:actionURL name="addS5E6Entry" var="addS5E6EntryURL" />
<aui:form action="<%= addS5E6EntryURL %>">
<aui:input name="name" type="text" />
<aui:input name="description" type="text" />
<aui:button type="submit" value="submit" />
</aui:form>
ポートレットはアセットが有効です。 アプリケーションのエントリーを検索し、アセットとして表示することができるようになりました。