Documentation

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

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

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

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

サンプルをデプロイする

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

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

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.29-ga29。

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

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

  1. Acme Commerce Product Content Renderer をダウンロードし、解凍してください。

    curl https://learn.liferay.com/commerce/latest/ja/developer-guide/content/liferay-q4f7.zip -O
    
    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で商品を含む任意のカタログに移動します。 商品をクリックして[商品の詳細]ウィジェットを表示し、ウィジェットの [Configuration] をクリックします。

Custom Renderer] セクションで、 [Simple] を選択します。 [Simple Commerce Product Type Renderer Key] ドロップダウンで、新しいレンダラー(「Q4F7 Commerce Product Content Renderer」)を選択します。

![新しい商品コンテンツレンダラー](./implementing-a-custom-product-content-renderer/images/02.png "新しい商品コンテンツレンダラー")
  1. 商品を選択すると、新しいレンダラーでは、商品の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 では、このプロパティが最小整数値に設定されているため、シンプルタイプの商品の他のレンダラーはリスト内でこの後に表示されます。

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

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.29-ga29/modules/apps/commerce/commerce-cart-content-web/src/main/resources/META-INF/resources/dynamic include/add to cart button.jsp) を使用して、「カートへ追加」機能をビューに挿入します。

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

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

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

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

まとめ

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