oo

新しい割引ルールタイプの追加

2つのインターフェースを実装することで、新しい割引ルールタイプを追加することができます。2つのインターフェイスは、 CommerceDiscountRuleTypeCommerceDiscountRuleTypeJSPContributor です。

割引ルールタイプは、割引が注文に適用される時期を評価するための条件を定義します。 Liferay Commerce は、3つの割引ルールタイプをすぐに利用できます。 AddedAllCommerceDiscountRuleTypeImplAddedAnyCommerceDiscountRuleTypeImpl そして CartTotalCommerceDiscountRuleTypeImpl です。

標準の割引ルールタイプ

概要

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

サンプルをデプロイする

新しい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 に変更します。

次に、以下の手順に従って、Liferay Commerce インスタンスに割引ルールタイプの例をデプロイします。

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

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

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

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

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

    STARTED com.acme.m6a8.web_1.0.0
    
  4. サンプルの割引ルールタイプが追加されたことを確認します。 ブラウザでhttps://localhost:8080を開きます。 次に、アプリケーションメニュー(Applications Menu)をクリックし、 [コマース] → [割引] に移動します。 任意の割引のメニュー内の [編集] をクリックします。 [ルール] セクションまでスクロールし、(+)アイコンをクリックして、新しい割引ルールを追加します。 [タイプ] ドロップダウンの下に、新しい割引ルールタイプ(「最小限の商品数を持つ」)が表示されます。

note

Liferay Commerce 2.1以前のバージョンでは、[コントロールパネル][コマース] → *[割引]に移動して割引を検索します。 任意の割引のメニュー内の[編集]をクリックし、画面上部の[ルール]*をクリックしてください。

新しい割引ルールタイプ

これでCommerceDiscountRuleTypeを実装する新しい割引ルールタイプのビルドとデプロイが完了しました。

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

サンプルの説明

次に、デプロイしたサンプルを確認します。 割引ルールタイプのクラスと、カスタムUI入力用のJSPコントリビューターの2つのクラスがあります。 次の手順を実行します:

OSGi登録用の割引ルールタイプのクラスに注釈を付ける

@Component(
    property = {
    "commerce.discount.rule.type.key=m6a8",
    "commerce.discount.rule.type.order:Integer=51"
    },
    service = CommerceDiscountRuleType.class
)
public class M6A8CommerceDiscountRuleTypeImpl
    implements CommerceDiscountRuleType {

Liferay Commerceが新しいタイプを 割引ルールタイプレジストリ の他のタイプと区別できるように、割引ルールタイプに個別のキーを提供することが重要です。 すでに使用されているキーを宣言すると、既存の関連付けられているタイプが上書きされます。

commerce.discount.rule.type.order値は、使用可能な割引ルールタイプのリストでこのタイプが表示される範囲を示します。 例えば、 "すべて追加済み"割引ルールタイプ の値は50です。 作成した割引ルールタイプに値51を指定すると、「すべて追加済み」タイプの直後に表示されます。

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

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

public boolean evaluate(
        CommerceDiscountRule commerceDiscountRule,
        CommerceContext commerceContext)
    throws PortalException;

このメソッドでは、割引ルールが適用されるタイミングを評価するためのビジネスロジックを実装します。

public String getKey();

これにより、割引ルールタイプレジストリ内の割引ルールタイプに一意の識別情報が提供されます。 このキーを使用して、レジストリから新しいタイプを取得できます。

public String getLabel(Locale locale);

これは、割引ルールの適用方法を説明するテキストラベルを返します。 言語キーでラベルを取得する際のリファレンスについては、 M6A8CommerceDiscountRuleTypeImpl.java の実装を参照してください。

OSGi登録用のJSPコントリビューターのクラスに注釈を付ける

@Component(
    property = "commerce.discount.rule.type.jsp.contributor.key=m6a8",
    service = CommerceDiscountRuleTypeJSPContributor.class
)
public class M6A8CommerceDiscountRuleTypeJSPContributor
    implements CommerceDiscountRuleTypeJSPContributor {

Liferay Commerceが 割引ルールタイプJSPコントリビューターレジストリ で他のコントリビューターと区別できるように、JSPコントリビューターに個別のキーを提供することが重要です。 すでに使用されているキーを宣言すると、既存の関連付けられているタイプが上書きされます。

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

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

public void render(
        long l, long l1, HttpServletRequest httpServletRequest,
        HttpServletResponse httpServletResponse)
    throws Exception;

ここで、割引ルールタイプのカスタムUI入力をレンダリングするコードを配置します。

割引ルールタイプを完成する

割引ルールタイプは、割引ルールを注文に適用するタイミングを評価するためのバックエンドロジック、割引ルールタイプのUI入力をレンダリングするロジック、およびカスタムUI入力自体で構成されています。 次の手順を実行します:

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

バンドルのシンボル名を使用してJSPコントリビュータークラスでServletContextを定義し、JSPを見つけられるようにします。

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

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

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

CommerceDiscountRuleTypeJSPContributorレンダリング方法を実装する

@Override
public void render(
        long commerceDiscountId, long commerceDiscountRuleId,
        HttpServletRequest httpServletRequest,
        HttpServletResponse httpServletResponse)
    throws Exception {

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

JSPRendererを使用して、割引ルールタイプのカスタムUI入力のJSPをレンダリングします(この例では view.jsp )。 JSPを見つけるためのパラメーターとしてServletContextを提供します。

評価ロジックを追加して、evaluateする。

@Override
public boolean evaluate(
        CommerceDiscountRule commerceDiscountRule,
        CommerceContext commerceContext)
    throws PortalException {

    CommerceOrder commerceOrder = commerceContext.getCommerceOrder();

    if (commerceOrder == null) {
        return false;
    }

    List<CommerceOrderItem> commerceOrderItems =
        commerceOrder.getCommerceOrderItems();

    int mininumNumberOfItems = GetterUtil.getInteger(
        commerceDiscountRule.getSettingsProperty(
            commerceDiscountRule.getType()));

    if (commerceOrderItems.size() >= mininumNumberOfItems) {
        return true;
    }

    return false;
}

ここでは、割引ルールを適用するためにTRUEでなければならない条件を設定します。 この例では、カスタムUI入力( CommerceDiscountRule 内のStringとして格納)で定義した最小値を使って、注文に最低限必要なアイテム数が含まれているかどうかをチェックします。

CommerceOrderオブジェクトは、評価される注文に関する情報を表します。 CommerceOrderから取得できる情報については、 CommerceOrder.javaCommerceOrderModel.java を参照してください。

JSPを追加して、カスタムUI入力をレンダリングする

この例では、view.jspと呼ばれるJSPを使用して、商品の最小数を入力しています。

<%@ taglib uri="http://liferay.com/tld/aui" prefix="aui" %>

<aui:input label="minimum-number-of-items" name="typeSettings" type="text">
    <aui:validator name="digits" />
    <aui:validator name="min">1</aui:validator>
</aui:input>

割引ルールを定義するときに表示するUI要素を実装します。 これらは、割引ルールタイプが選択されるとすぐに表示されます。 入力を定義すると、保存された値が割引ルールの設定プロパティに保存されます。

AUI入力の使用方法については、 Using AUI Taglibs を参照してください。

言語キーをLanguage.propertiesに追加します。

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

has-a-minimum-number-of-items=Has a Minimum Number of Items
minimum-number-of-items=Minimum Number of Items

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

まとめ

  これで、 CommerceDiscountRuleTypeインターフェイスを実装するための基本を理解し、Liferay CommerceにカスタムUI入力を用いた新しい割引ルールタイプを追加できました。

関連トピック

Capability: