Documentation

カスタム商品コンテンツレンダラーの実装

このチュートリアルでは、 CPContentRenderer インターフェイスを実装して、カスタム商品コンテンツレンダラーを追加する方法を示します。

商品コンテンツレンダラーは、商品を表示できるさまざまなウィジェットで、特定の 商品タイプ の商品詳細を表示するスタイルを提供します。 Liferay Commerceは、シンプル商品用の SimpleCPContentRenderer など、すぐに使用できる商品タイプごとに商品コンテンツレンダラーを提供しています。

すぐに使える商品コンテンツレンダラー

サンプルをデプロイする

このセクションでは、商品コンテンツレンダラーをLiferay Commerceのインスタンスで実行する例を示します。

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

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

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

  1. Acme Commerce Product Content Renderer をダウンロードして解凍します。

    curl https://learn.liferay.com/commerce/latest/en/developer-guide/content/liferay-q4f7.zip -O
    
    unzip liferay-q4f7.zip
    
  2. サンプルをビルドしてデプロイします。

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

    注釈

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

  3. Dockerコンテナコンソールでデプロイを確認します。

    STARTED com.acme.q4f7.web_1.0.0
    
  4. サンプルの商品コンテンツレンダラーが追加されたことを確認します。 ブラウザでhttps://localhost:8080を開き、Liferay Commerceで商品を含む任意のカタログに移動します。 商品をクリックして[商品の詳細]ウィジェットを表示し、ウィジェットの [設定]をクリックします。

    カスタムレンダラー]セクションで、[Simple]を選択します。 [シンプルなコマース商品タイプのレンダラーのキー]ドロップダウンで、新しいレンダラー("Q4F7 Commerce Product Content Renderer")を選択します。

    新しい商品コンテンツレンダラー

  5. 商品を選択すると、新しいレンダラーでは、商品のSKU、価格、在庫状況、在庫数のみが表示されます。

    新しいレンダラーで表示された商品の詳細は以下の通りです。

これで、CPContentRendererを実装する新しいカスタム商品コンテンツレンダラーを正常に構築およびデプロイできました。

次に、詳細をさらに詳しく見ていきましょう。

例の説明

このセクションでは、デプロイした例について確認します。 最初に、OSGi登録用のクラスに注釈を付けます。 次に、 CPContentRendererインターフェイスを確認します。 最後に、CPContentRendererの実装を完了します。

OSGi登録用のクラスに注釈を付ける

@Component(
    immediate = true,
    property = {
        "commerce.product.content.renderer.key=q4f7",
        "commerce.product.content.renderer.order=1",
        "commerce.product.content.renderer.type=" + SimpleCPTypeConstants.NAME
    },
    service = CPContentRenderer.class
)
public class Q4F7CPContentRenderer implements CPContentRenderer {

Liferay Commerceが商品コンテンツレンダラーレジストリで新しいレンダラーを他のレンダラーと区別できるように、商品コンテンツレンダラーに個別のキーを提供することが重要です。 すでに使用されているキーを再利用すると、既存の関連付けられているレンダラーが上書きされます。

commerce.product.content.renderer.orderプロパティは、CommerceがUIにレンダラをリストアップするために使用する整数値です。 レンダラーは昇順で表示されます。 例えば、 SimpleCPContentRenderer では、このプロパティが最小整数値に設定されているため、Simpleタイプの商品の他のレンダラーはリスト内でこの後に表示されます。

commerce.product.content.renderer.typeプロパティは、このレンダラーを使用できる商品のタイプを決定します。 この例では、Simpleタイプを使用しているため、レンダラーはUIの[Simple]カテゴリの下に表示されます。

CPContentRendererインターフェイスを確認する

次のメソッドを実装します。

public String getKey();

このメソッドは、商品コンテンツレンダラーレジストリ内の商品コンテンツレンダラーに一意の識別子を提供します。 このキーを使用して、レジストリからレンダラーを取得できます。 すでに使用されているキーを再利用すると、既存の関連付けられているレンダラーが上書きされます。

public String getLabel(Locale locale);

これは、商品コンテンツレンダラーを説明するテキストラベルを返します。 言語キーでラベルを取得する際のリファレンスについては、Q4F7CPContentRenderer.javaの実装を参照してください。

public void render(
        CPCatalogEntry cpCatalogEntry,
        HttpServletRequest httpServletRequest,
        HttpServletResponse httpServletResponse)
    throws Exception;

ここで、商品コンテンツレンダラーのカスタマイズされたビューをレンダリングするコードを追加します。

ビューを定義するには、JSP、Freemarkerテンプレート、Soyテンプレートなど、いくつかの方法があります。 この例では、JSPを使用します。

商品コンテンツレンダラーを完成させる

商品コンテンツレンダラーは、定義およびレンダリングするカスタムビューで構成されます。 以下を行います。

モジュールにServletContextを構成する

バンドルのシンボル名を使用して ServletContext を定義し、モジュールでJSPを見つけられるようにします。

@Reference(target = "(osgi.web.symbolicname=com.acme.q4f7.web)")
private ServletContext _servletContext;

osgi.web.symbolicnameに設定した値は、bnd.bndファイルBundle-SymbolicNameの値と一致します。 これらの値は、JSPを見つけるためにServletContextと一致する必要があります。

また、 ServletContext が正しく生成されるように、bnd.bndファイルで Web-ContextPath 一意の値を宣言する必要があります。 この例では、Web-ContextPath/q4f7-webに設定しています。 これらの値のリファレンスについては、bnd.bndを参照してください。

renderメソッドを実装する

@Override
public void render(
        CPCatalogEntry cpCatalogEntry,
        HttpServletRequest httpServletRequest,
        HttpServletResponse httpServletResponse)
    throws Exception {

    _jspRenderer.renderJSP(
        _servletContext, httpServletRequest, httpServletResponse,
        "/view.jsp");
}

JSPRendererを使用して、商品コンテンツレンダラーのJSPをレンダリングします(この場合は、 view.jsp)。 作成したJSPを見つけるためのパラメーターとしてServletContextを提供します。

カスタムビューのJSPを追加する

<%
CPContentHelper cpContentHelper = (CPContentHelper)request.getAttribute(CPContentWebKeys.CP_CONTENT_HELPER);

CPSku cpSku = cpContentHelper.getDefaultCPSku(cpContentHelper.getCPCatalogEntry(request));
%>

CPContentHelper は、特定の商品に関する情報を取得するクラスです。

CPCatalogEntry は、表示された商品自体を表します。 CPSku オブジェクトに含まれるデフォルトのSKUを持つ商品に関する詳細情報を取得します。

<c:if test="<%= cpSku != null %>">
    SKU: <%= cpSku.getSku() %><br />
    Price: <%= cpSku.getPrice() %><br />
    Availability: <%= cpContentHelper.getAvailabilityLabel(request) %><br />
    Stock Quantity: <%= cpContentHelper.getStockQuantityLabel(request) %>
</c:if>

<liferay-util:dynamic-include key="com.liferay.commerce.product.content.web#/add_to_cart#" />

Liferay Commerceの [add_to_cart_button.jsp](https://github.com/liferay/liferay-portal/blob/7.4.3.22-ga22/modules/apps/commerce/commerce-cart-content-web/src/main/resources/META-INF/resources/dynamic include/add to cart button.jsp) を使用して、「カートへ追加t」機能をビューに挿入します。

言語キーをLanguage.propertiesに追加する

モジュール内のLanguage.propertiesファイルに言語キーとその値を追加します。

q4f7-commerce-product-content-renderer=Q4F7 Commerce Product Content Renderer

詳細は、 アプリケーションのローカライズ を参照してください。

まとめ

CPContentRendererインターフェイスを実装するための基本を理解し、Liferay Commerceに新しい商品コンテンツレンダラーを追加しました。