Asset Framework
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

アセットの有効化

Liferayの多くのアプリケーション(ブログ、ドキュメントとメディア、掲示板など)は、すぐに使用可能なアセットです。 アセット パブリッシャー ウィジェット を使用してアセットを公開したり、 アセット ライブラリを作成したりすることもできます。 サービス ビルダーを使用すると、カスタム アプリケーションをアセット対応にすることができます。 その方法は、以下のサンプルプロジェクトをご覧ください。

サンプルコードを取得する

新しいLiferay DXPインスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts

メールアドレス test@liferay.com とパスワード testを使用して、 http://localhost:8080 で Liferay にサインインします。 プロンプトが表示されたら、パスワードを learnに変更します。

次に、以下の手順に従います。

  1. Enabling Assetsをダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-s5e6.zip -O
    
    unzip liferay-s5e6.zip
    
  2. モジュールのルートから、ビルドおよびデプロイします。

    ./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    

    このコマンドは、デプロイされたjarをDockerコンテナ上の /opt/liferay/osgi/modules にコピーするのと同じです。

  3. 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]
    
  4. ブラウザでhttps://localhost:8080を開きます。

  5. S5E6ポートレットをページに追加します。 サンプルポートレットは、サンプルウィジェットの下にあります。

  6. また、同じページにアセットパブリッシャーウィジェットを追加します。 ウィジェットは、コンテンツ管理の下にあります。

  7. S5E6 Portletでエントリーを追加し(例: s5e6_name1 and s5e6_description1[Submit]をクリックして下さい。

  8. S5E6ポートレットはアセットに対応しているため、追加された項目は自動的にアセットパブリッシャーウィジェットに表示されます。

    追加されたエントリは、アセットパブリッシャーウィジェットに自動的に表示されます。

検索が有効になる前提条件

このチュートリアルでは、すでに検索が有効になっているサービスビルダーアプリケーションがあることを前提に説明します。 アプリケーションには最低限必要です。

*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 クラス)。

検索を有効にする方法の詳細については、「検索の使用」の 開発者ガイド を参照してください。

サービスモデルの定義の変更

アセットを有効にするには、次のようにエンティティを変更します。

  1. 以下のデータフィールドがまだ定義されていない場合は、追加してください。

    <!-- 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" />
    

    アセットフレームワークは、アプリケーションのデータを追跡するために、これらのフィールドを必要とします。

  2. </entity>タグを閉じる直前に、アセットエントリーエンティティリファレンスを追加します。 後で、新しいアプリケーションのエントリーが追加されたとき、対応するエントリーがLiferayのAssetEntryテーブルに追加されるように変更します。

    <reference entity="AssetEntry" package-path="com.liferay.portlet.asset" />
    
  3. サービスビルダーを再実行します。

    ./gradlew s5e6-service:buildService
    

サービスレイヤーの更新

カスタムエンティティをLiferayアセットとして追加するには、プロジェクトの assetEntryLocalServiceupdateEntry() メソッドを -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);

AssetEntryLocalServiceImpl クラスの Javadoc を確認すると、メソッドがオーバーロードされていることがわかります。 updateEntry()のバージョンで、titleパラメータを受け取り、アセットエントリーのタイトルを設定できるようにします。

変更後、サービスビルダーを再実行します。

アセットレンダラの作成

アセットとはエンティティの表示版なので、 title, description, summaryといったフィールドが含まれます。 Liferayはこれらのフィールドを使用して、アセットを表示します。 アセットレンダラは、これらのフィールドを介してエンティティをアセットに変換します。

  1. アプリケーションで、LiferayのBaseJSPAssetRendererクラスを拡張する-AssetRenderクラスを作成します。 例えば、

    public class S5E6EntryAssetRenderer extends BaseJSPAssetRenderer<S5E6Entry> {
    
    }
    
  2. アセットレンダラクラスのコンストラクタを定義します。

    public S5E6EntryAssetRenderer(S5E6Entry s5e6Entry) {
       _s5e6Entry = s5e6Entry;
    	}
    
  3. 異なるゲッターメソッドを使用して、アセットレンダラをアセットに接続します。

@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属性が設定されていることに注意してください。

アセットレンダラファクトリーの作成

アセットレンダラを作成したら、各アセットインスタンスにアセットレンダラを生成するファクトリークラスを作成する必要があります。

  1. 上記と同じフォルダに、LiferayのBaseAssetRendererFactoryクラスを拡張する-AssetRendererFactoryクラスを作成します。 例えば、

    public class S5E6EntryAssetRendererFactory extends BaseAssetRendererFactory<S5E6Entry> {
    
    }
    
  2. クラス宣言の上に@Componentアノテーションを作成します。 このアノテーションは、アセットのファクトリーインスタンスを登録します。 service要素は、AssetRenderFactory.classインターフェイスを指す必要があります。

    @Component(service = AssetRendererFactory.class)
    
  3. ファクトリーの属性をプリセットするファクトリークラスのコンストラクタを作成します。

public S5E6EntryAssetRendererFactory() {
	setClassName(S5E6Entry.class.getName());
	setLinkable(true);
	setPortletId("com_acme_s5e6_web_internal_portlet_S5E6Portlet");
	setSearchable(true);
}

setLinkabletrueに設定して、他のアセットはアセットを関連アセットとして選択できるようにします。 setSearchabletrueに設定すると、検索時にアセットを見つけることができるようになります。

  1. 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;
}
  1. 必ず@Referenceアノテーションを使用して、モジュールのシンボル名を定義してください。

    @Reference(
    	target = "(osgi.web.symbolicname=com.acme.s5e6.web)"
    )
    

ポートレットを変更する

S5E6PortletaddS5E6Entryメソッドは、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は、ポートレットのアクションメソッドなので、 ActionRequestActionResponseのパラメータを受け取ります。 新しいエントリーを追加するサービス呼び出しを行うには、 titledescriptionをリクエストから取得する必要があります。 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>

ポートレットはアセットが有効です。 アプリケーションのエントリーを検索し、アセットとして表示することができるようになりました。