Documentation

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

以下、2つのインターフェースを実装して、新しい割引ルールタイプを追加できます: CommerceDiscountRuleType および CommerceDiscountRuleTypeJSPContributor

割引ルールタイプは、割引が注文に適用される時期を評価するための条件を定義します。 Liferay Commerceには、以下3つの割引ルールタイプが標準で組み込まれています: AddedAllCommerceDiscountRuleTypeImplAddedAnyCommerceDiscountRuleTypeImpl および CartTotalCommerceDiscountRuleTypeImpl

標準の割引ルールタイプ

サンプルをデプロイする

まず、Liferay Commerceのインスタンスに割引ルールタイプの例を展開する必要があります。

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

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

次に、以下の手順を実行します。

  1. Acme Commerce Discount Rule Type をダウンロードして解凍します。

    curl https://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)
    

    注釈

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

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

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

注釈

Liferay Commerce 2.1以前のバージョンでは、コントロールパネルCommerceDiscountsに移動して割引を検索します。 メニュー内のEditをクリックして割引を適用し、画面上部のRulesに移動します。

新しい割引ルールタイプ

これで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を提供します。

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

@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 内に文字列として保存されます)を使用して、注文に少なくとも最小数のアイテムが含まれていることを確認します。

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入力を用いた新しい割引ルールタイプを追加できました。