oo

新しい商品タイプの追加

このチュートリアルでは、3つのインターフェースを実装することで、新しい商品タイプを追加する方法を紹介します。 CPType ,、 ScreenNavigationCategoryScreenNavigationEntry です。

商品タイプを使用して、類似の特性を共有する商品をグループ化できます。 Liferay Commerceでは、3 種類の商品タイプがすぐに利用できます。 Simple , Grouped , Virtual の3種類です。

標準の商品タイプ

概要

  1. サンプルをデプロイする
  2. サンプルの説明
  3. 追加情報

サンプルをデプロイする

このセクションでは、商品タイプをLiferay Commerceのインスタンスで実行する例を示します。 新しいLiferay インスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.112-ga112。

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

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

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

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

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

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

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

    STARTED com.acme.c1n4.web_1.0.0
    
  4. サンプルの商品タイプが追加されたことを確認します。 ブラウザでhttps://localhost:8080を開きます。 アプリケーションメニュー(Applications Menu)をクリックし、 [commerce] → [商品] に移動します。 次に、(+)アイコンをクリックして、新しい商品を追加します。 新しい商品タイプ(「サンプル」)が、選択するタイプのリストに表示されます。

note

Liferay Commerce 2.1以前のバージョンでは、[コントロールパネル] → [commerce] → [商品] に移動して商品ページを検索します。

新商品タイプ

これで、CPTypeを実装する新しい商品タイプのビルドとデプロイが完了しました。

さらに詳しく見ていきましょう。

サンプルの説明

このセクションでは、デプロイしたサンプルについて確認します。 カスタム画面用の商品タイプクラスと画面ナビゲーション・エントリークラスの2つのクラスを作成します。 次の手順を実行します。

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登録用の画面ナビゲーションエントリークラスに注釈を付ける

画面ナビゲーション・エントリークラスでは、ScreenNavigationCategoryScreenNavigationEntryの両方のインターフェイスを実装しています。

@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を構成する

バンドルのシンボリックネームを使用してServletContextScreenNavigationEntryクラスで定義し、モジュール内の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 を参照してください。

ScreenNavigationEntryrenderメソッドを実行します。

@Override
public void render(
        HttpServletRequest httpServletRequest,
        HttpServletResponse httpServletResponse)
    throws IOException {

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

JSPRendererを使用して、商品タイプのカスタム画面のJSPをレンダリングします(この例では c1n4.jsp )。 作成したJSPを見つけるためのパラメーターとしてServletContextを提供します。

ScreenNavigationEntryisVisibleメソッドを上書きします。

@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に新しい商品タイプとその独自のカスタム画面を追加しました。

関連トピック

Capability: