アセットの有効化
Liferayの多くのアプリケーション(ブログ、ドキュメントとメディア、掲示板など)は、すぐに使用可能なアセットです。 アセットパブリッシャーウィジェット を使用してアセットを公開したり、 アセットライブラリを作成したりできます。 Service Builderを使用すると、カスタムアプリケーションをアセット対応にすることができます。 その方法は、以下のサンプルプロジェクトをご覧ください。
サンプルコードを取得する
Liferay DXP の新しいインスタンスを起動するには、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2026.q1.9-lts
http://localhost:8080 に、メールアドレス test@liferay.com とパスワード test を使用して Liferay にサインインします。 プロンプトが表示されたら、パスワードを learn に変更してください。
次に、以下の手順に従ってください。
-
ダウンロードして解凍します アセットを有効にします。
curl https://resources.learn.liferay.com/examples/liferay-s5e6.zip -Ounzip liferay-s5e6.zip -
モジュールのルートディレクトリから、ビルドとデプロイを実行します。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注記このコマンドは、デプロイされた jar ファイルを Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Liferay Dockerコンテナコンソールでデプロイメントを確認してください。
com.acme.s5e6.api_1.0.0 [1433] 開始 com.acme.s5e6.service_1.0.0 [1434] 開始 com.acme.s5e6.web_1.0.0 [1435] -
ブラウザで
https://localhost:8080を開いてください。 -
S5E6ポートレットをページに追加します。 サンプルポートレットは「サンプルウィジェット」の項目にあります。
-
同じページにアセットパブリッシャーウィジェットも追加してください。 ウィジェットはコンテンツ管理の中にあります。
-
S5E6 ポートレットを使用してエントリを追加します (例:
s5e6_name1およびs5e6_description1)。そして送信をクリックします。 -
S5E6ポートレットはアセット対応であるため、追加されたエントリはアセットパブリッシャーウィジェットに自動的に表示されます。

検索機能が有効になっている前提条件
このチュートリアルは、検索機能が既に有効になっているService Builderアプリケーションが存在することを前提としています。 最低限、申請には以下のものが必要です。
*ModelSearchConfigurator.java - アプリケーションのエンティティ(例: com.acme.s5e6.search.S5E6EntryModelSearchConfigurator.java クラス)の検索サービスを検索フレームワークに登録します。
ModelSearchConfigurator パターンは、Liferay DXP 2023.Q4+ および GA/Update 100+ に適用されます。 以前のバージョンでは SearchRegistrar が使用されていました。 Liferay 7.2 ドキュメント を参照して SearchRegistrar を実装してください。
*ModelIndexerWriterContributor.java - エントリの再インデックスおよびバッチ再インデックスの動作を設定します (例: com.acme.s5e6.search.S5E6EntryModelIndexerWriterContributor.java クラス)。
*ModelSummaryContributor.java - エントリの結果サマリーを構築します (例: com.acme.s5e6.search.S5E6EntryModelSummaryContributor.java クラス)。
検索を有効にする方法の詳細については、 開発者ガイド を参照してください。
サービスモデル定義を変更する
アセットを有効にするには、エンティティに以下の変更を加えてください。
-
まだ定義されていない場合は、以下のデータフィールドを追加してください。
<!-- グループインスタンス --> <column name="groupId" type="long" /> <!-- 監査フィールド --> <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 アセットとして追加するには、プロジェクトの -LocalServiceImpl Java クラスで assetEntryLocalServiceの updateEntry() メソッドを呼び出す必要があります。 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);
AssetEntryLocalServiceImpl クラスの Javadoc を確認すると、メソッドがオーバーロードされていることがわかります。 アセットエントリのタイトルを設定できるように、 updateEntry() のバージョンを使用します。 title パラメータを受け取ります。
変更後、Service Builderを再度実行してください。
アセットレンダラーを作成する
アセットはエンティティの表示バージョンなので、 タイトル、 説明、および 要約 などのフィールドが含まれます。 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アノテーションを作成します。 このアノテーションは、アセットのファクトリインスタンスを登録します。サービス要素は、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 パラメータを受け取ります。 新しいエントリを追加するためのサービス呼び出しを行うには、リクエストからタイトルと説明を取得する必要があります。 serviceContext もリクエストから取得し、サービス呼び出しの引数として渡す必要があります。
ポートレットの view.jsp には、ポートレットの addS5E6Entry メソッドを呼び出す actionURL を持つフォームが含まれています。
<h5>S5E6 エントリを追加</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>
このポートレットはアセット対応です。 アプリケーションに登録された項目が、アセットとして検索・表示できるようになりました。