新しい商品タイプの追加
このチュートリアルでは、3つのインターフェースを実装することで、新しい商品タイプを追加する方法を紹介します。 CPType ,、 ScreenNavigationCategory 、 ScreenNavigationEntry です。
商品タイプを使用して、類似の特性を共有する商品をグループ化できます。 Liferay Commerceでは、3 種類の商品タイプがすぐに利用できます。 Simple , Grouped , Virtual の3種類です。
概要
サンプルをデプロイする
このセクションでは、商品タイプをLiferay Commerceのインスタンスで実行する例を示します。 新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 。
http://localhost:8080でLiferayへのサインインします。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順に従います。
-
Acme Commerce Product Type をダウンロードし、解凍してください。
curl https://resources.learn.liferay.com/commerce/latest/ja/developer-guide/catalog/liferay-c1n4.zip -O
unzip liferay-c1n4.zip
-
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.c1n4.web_1.0.0
-
サンプルの商品タイプが追加されたことを確認します。 ブラウザで
https://localhost:8080
を開きます。 アプリケーションメニュー()をクリックし、 [commerce] → [商品] に移動します。 次に、(+)アイコンをクリックして、新しい商品を追加します。 新しい商品タイプ(「サンプル」)が、選択するタイプのリストに表示されます。
Liferay Commerce 2.1以前のバージョンでは、[コントロールパネル] → [commerce] → [商品] に移動して商品ページを検索します。
これで、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);
これは、商品タイプを説明するテキストラベルを返します。 言語キーでラベルを取得する際のリファレンスについては、 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に表示される画面ナビゲーションエントリーのテキストラベルを返します。 言語キーでラベルを取得する際のリファレンスについては、 C1N4ScreenNavigationEntry.java の実装を参照してください。
public String getScreenNavigationKey();
これにより、Liferayで画面を表示する場所を示すキーが返されます。 商品の他の画面に正しく表示されるように、String値
"cp.definition.general"
を返します。
ScreenNavigationEntry
インターフェイスを確認する
次のメソッドを使用して、画面ナビゲーション・エントリークラスの構築を続けます。
String getCategoryKey();
これは、画面で使用される画面ナビゲーションカテゴリの一意な識別情報を返します。
String getEntryKey();
これは、画面ナビゲーションエントリの一意な識別情報を返します。
getCategoryKey
と同じ値を返します。
String getScreenNavigationKey();
これは、
ScreenNavigationCategory
インターフェイスのgetScreenNavigationKey
と同じメソッドです。 String値"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
に設定した値は、 bnd.bndファイル のBundle-SymbolicName
の値と一致します。 これらの値は、JSPを見つけるためにServletContext
と一致する必要があります。
ServletContext
が正しく生成されるように、bnd.bndファイルでWeb-ContextPath
の一意の値を宣言します。 この例では、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をレンダリングします(この例では 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 Action Command を参照してください。
言語キーをLanguage.properties
に追加する
モジュール内の Language.properties ファイルに言語キーとその値を追加します。
c1n4-commerce-product-type=C1N4 Commerce Product Type
c1n4-screen-navigation-entry=C1N4 Screen Navigation Entry
詳細は、 アプリケーションのローカライズ を参照してください。
まとめ
これで、 CPType
インターフェイスを実装するための基本を理解し、Liferay Commerceに新しい商品タイプとその独自のカスタム画面を追加しました。