Documentation

アセットの有効化

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

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

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

docker run -it -m 8g -p 8080:8080 liferay/dxp:7.4.13-u29。

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

次に、以下の手順を実行します。

  1. Enabling Assets をダウンロードし、解凍してください。

    curl https://learn.liferay.com/dxp/latest/ja/building-applications/data-frameworks/asset-framework/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ポートレットはアセットに対応しているため、追加された項目は自動的にアセットパブリッシャーウィジェットに表示されます。

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

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

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

*SearchRegistrar.java - アプリケーションのエンティティに対して検索サービスを検索フレームワークに登録します(例: com.acme.s5e6.search.S5E6SearchRegistrar.java Javaクラス )。

*ModelIndexerWriterContributor.java - エントリの再インデックスおよびバッチ再インデックスの動作を設定します(例: com.acme.s5e6.search.S5E6EntryModelIndexerWriterContributor.java Javaクラス )。

*ModelSummaryContributor.java - エントリーの結果サマリーを構築します(例: com.acme.s5e6.search.S5E6EntryModelSummaryContributor.java 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);

	return s5e6Entry;

AssetEntryLocalServiceImplクラス のJavadocsを確認すると、このメソッドはオーバーロードされていることが分かります。 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に設定すると、検索時にアセットを見つけることができるようになります。

  4. 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;
    }
    
  5. 必ず@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>

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