新しい商品タイプの追加
このチュートリアルでは、3 つのインターフェース CPType、 ScreenNavigationCategory、 ScreenNavigationEntryを実装して、新しい製品タイプを追加する方法を説明します。
商品タイプを使用して、類似の特性を共有する商品をグループ化できます。 Liferay Commerce には、 シンプル、 グループ化、 仮想の 3 つの製品タイプがすぐに使用できます。

概要
サンプルをデプロイする
このセクションでは、Liferay Commerce のインスタンスでサンプルの製品タイプを起動して実行します。
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、以下の手順に従います。
-
Acme Commerce Product Typeをダウンロードして解凍します。
curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/catalog/liferay-c1n4.zip -Ounzip liferay-c1n4.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.c1n4.web_1.0.0 -
サンプルの商品タイプが追加されたことを確認します。 ブラウザで
https://localhost:8080を開きます。 アプリケーション メニュー (
) をクリックし、 コマース → 製品に移動します。 次に、(+)アイコンをクリックして、新しい商品を追加します。 新しい製品タイプ (「例」) が、選択できるタイプのリストに表示されます。
Liferay Commerce 2.1 以前では、 コントロールパネル → コマース → 製品に移動して製品ページを見つけます。

これで、CPTypeを実装する新しい商品タイプのビルドとデプロイが完了しました。
次に、詳細をさらに詳しく見ていきましょう。
サンプルの説明
このセクションでは、デプロイした例を確認し、製品タイプ クラスとカスタム スクリーンの画面ナビゲーション エントリ クラスの 2 つのクラスを作成します。 次の手順を実行します。
- OSGi登録用の商品タイプのクラスに注釈を付ける
CPTypeインターフェイスを確認する- OSGi登録用の画面ナビゲーションエントリークラスに注釈を付ける
ScreenNavigationCategoryインターフェイスを確認するScreenNavigationEntryインターフェイスを確認する- 商品タイプを完成させる
OSGi登録用の商品タイプのクラスに注釈を付ける
商品タイプのクラスは、CPTypeインターフェイスを実装します。
@Component(
property = {
"commerce.product.type.display.order:Integer=16",
"commerce.product.type.name=c1n4"
},
service = CPType.class
)
public class C1N4CPType implements CPType {
Liferay Commerceがこの商品タイプを既存の商品タイプと区別できるように、商品タイプ名は一意の値である必要があります。
commerce.product.type.display.order 値は、製品タイプが UI で製品タイプのリストのどの位置に表示されるかを示します。 たとえば、 仮想製品タイプ の値は 15 です。 製品タイプに 16 の値を与えると、それが仮想タイプの直後に表示されるようになります。
CPTypeインターフェイスを確認する
商品タイプクラスでCPTypeの以下のメソッドを実装します。
public void deleteCPDefinition(long cpDefinitionId) throws PortalException;
このメソッドでは、製品タイプに対するカスタム削除ロジックが追加されます。
public String getLabel(Locale locale);
これは、商品タイプを説明するテキストラベルを返します。 言語キーを使用してラベルを取得する際の参考として、 liferay-c1n4.zip/c1n4-web/src/main/java/com/acme/c1n4/web/internal/commerce/product/type の C1N4CPType.java クラスを参照してください。
public String getName();
これは、商品タイプの名前を返します。 この名前は、UIに表示される名前に対応する言語キーの場合があります。
OSGi登録用の画面ナビゲーションエントリークラスに注釈を付ける
画面ナビゲーション・エントリークラスでは、ScreenNavigationCategoryとScreenNavigationEntryの両方のインターフェイスを実装しています。
@Component(
property = {
"screen.navigation.category.order:Integer=11",
"screen.navigation.entry.order:Integer=11"
},
service = {ScreenNavigationCategory.class, ScreenNavigationEntry.class}
)
public class C1N4ScreenNavigationEntry
implements ScreenNavigationCategory, ScreenNavigationEntry<CPDefinition> {
Liferay Commerceがこの画面を既存の画面とは別の画面として区別できるように、ナビゲーション画面クラスに個別のキーを提供することが重要です。 すでに使用されているキーを再利用すると、既存の関連付けられているナビゲーション画面が上書きされます。
screen.navigation.category.order と screen.navigation.entry.order の値により、この画面が製品タイプ画面のどの位置に表示されるかが決まります。 たとえば、 詳細画面クラス ではこれらの値が 10 に設定されています。これを 11 に設定すると、カスタム画面がリスト内でその後に表示されるようになります。
ScreenNavigationCategoryインターフェイスを確認する
画面ナビゲーション・エントリークラスに次のメソッドを実装します。
public String getCategoryKey();
画面ナビゲーション エントリに関連付けられたカテゴリの一意の識別子を返します。
public String getLabel(Locale locale);
UI に表示される画面ナビゲーション エントリのテキスト ラベルを返します。 ラベルを取得するために言語キーを使用する例については、liferay-c1n4.zip/c1n4-web/src/main/java/com/acme/c1n4/web/internal/frontend/taglib/servlet/taglibにあるC1N4ScreenNavigationEntry.javaクラスを参照してください。
public String getScreenNavigationKey();
Liferay で画面が表示される場所を示すキーを返します。 文字列 "cp.definition.general" を使用して、画面が他の製品画面の中に表示されるようにします。
ScreenNavigationEntryインターフェイスを確認する
次のメソッドを使用して、画面ナビゲーション・エントリークラスの構築を続けます。
String getCategoryKey();
画面に関連付けられた画面ナビゲーション カテゴリの一意の識別子を返します。
String getEntryKey();
画面ナビゲーション エントリの一意の識別子を返します。 getCategoryKeyと同じ値を返します。
String getScreenNavigationKey();
このメソッドは、 ScreenNavigationCategory インターフェースの getScreenNavigationKey と同じです。 このメソッドは、文字列値 "cp.definition.general"を返すことで実装しました。
public void render(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse)
throws IOException;
このメソッドでは、製品タイプに合わせてカスタマイズされた画面をレンダリングするためのコードを追加します。
商品タイプを完成させる
商品タイプは、商品を削除するためのバックエンドロジック、ナビゲーションメニューで画面をレンダリングするロジック、およびカスタム画面自体で構成されます。 以下を行います。
- モジュールに
ServletContextを構成する。 ScreenNavigationEntryのrenderメソッドを実行します。ScreenNavigationEntryのisVisibleメソッドを上書きします。- 商品タイプ削除ロジックを
deleteCPDefinitionに追加する。 - JSPを追加して、カスタム画面をレンダリングする。
- 言語キーを
Language.propertiesに追加する。
モジュールにServletContextを構成する
バンドルのシンボリックネームを使用してServletContextをScreenNavigationEntryクラスで定義し、モジュール内のJSPを見つけられるようにします。
@Reference(target = "(osgi.web.symbolicname=com.acme.c1n4.web)")
private ServletContext _servletContext
osgi.web.symbolicname に設定した値は、 liferay-c1n4.zip/c1n4-web内の bnd.bnd ファイル内の Bundle-SymbolicName の値と一致します。 これらの値は、JSPを見つけるためにServletContextと一致する必要があります。
bnd.bnd ファイル内の Web-ContextPath に一意の値を宣言して、 ServletContext が正しく生成されるようにします。 この例では、Web-ContextPathは/c1n4-webに設定されています。 これらの値のリファレンスについては、 bnd.bnd ファイルを参照してください。
ScreenNavigationEntryのrenderメソッドを実行します。
@Override
public void render(
HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse)
throws IOException {
_jspRenderer.renderJSP(
_servletContext, httpServletRequest, httpServletResponse,
"/c1n4.jsp");
}
JSPRenderer を使用して、製品タイプのカスタム スクリーンの JSP をレンダリングします (例では、 liferay-c1n4.zip/c1n4-web/src/main/resources/META-INF/resources内の c1n4.jsp )。 作成したJSPを見つけるためのパラメーターとしてServletContextを提供します。
ScreenNavigationEntryのisVisibleメソッドを上書きします。
@Override
public boolean isVisible(User user, CPDefinition cpDefinition) {
if (cpDefinition == null) {
return false;
}
return Objects.equals(
cpDefinition.getProductTypeName(), getCategoryKey());
}
カスタム画面を表示するタイミングを決定するロジックをここに実装します。 この例では、CPDefinitionの商品タイプがサンプルの商品タイプと一致するかどうかのみを確認します。
商品タイプ削除ロジックをdeleteCPDefinitionに追加する
この例では、 deleteCPDefinitionに追加するロジックは必要ありません。
JSPを追加して、カスタム画面をレンダリングする
今回の例では、「Hello C1N4.」と表示するJSPを追加しています。
<h1>Hello C1N4.</h1>
フォームやMVCアクションコマンドなど、カスタム画面で必要な他の入力またはアクションをここに実装します。 JSP からアクセスできる MVC アクション コマンドを追加する方法の詳細については、 MVC アクション コマンド を参照してください。
言語キーをLanguage.propertiesに追加する
モジュール内の liferay-c1n4.zip/c1n4-web/src/main/resources/content にある Language.properties ファイルに言語キーとその値を追加します。
c1n4-commerce-product-type=C1N4 Commerce Product Type
c1n4-screen-navigation-entry=C1N4 Screen Navigation Entry
詳細については、「 アプリケーションのローカライズ 」を参照してください。
さいごに
これで、 これで、 CPTypeインターフェイスを実装するための基本を理解し、Liferay Commerceに新しい商品タイプとその独自のカスタム画面を追加しました。