新しい割引ルールタイプの追加
2つのインターフェースを実装することで、新しい割引ルールタイプを追加することができます。2つのインターフェイスは、 CommerceDiscountRuleType と CommerceDiscountRuleTypeJSPContributor です。
割引ルールタイプは、割引が注文に適用される時期を評価するための条件を定義します。 Liferay Commerce は、3つの割引ルールタイプをすぐに利用できます。 AddedAllCommerceDiscountRuleTypeImpl 、 AddedAnyCommerceDiscountRuleTypeImpl そして CartTotalCommerceDiscountRuleTypeImpl です。
概要
サンプルをデプロイする
新しい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 インスタンスに割引ルールタイプの例をデプロイします。
-
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
-
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.m6a8.web_1.0.0
-
サンプルの割引ルールタイプが追加されたことを確認します。 ブラウザで
https://localhost:8080
を開きます。 次に、アプリケーションメニュー()をクリックし、 [コマース] → [割引] に移動します。 任意の割引のメニュー内の [編集] をクリックします。 [ルール] セクションまでスクロールし、(+)アイコンをクリックして、新しい割引ルールを追加します。 [タイプ] ドロップダウンの下に、新しい割引ルールタイプ(「最小限の商品数を持つ」)が表示されます。
Liferay Commerce 2.1以前のバージョンでは、[コントロールパネル] → [コマース] → *[割引]に移動して割引を検索します。 任意の割引のメニュー内の[編集]をクリックし、画面上部の[ルール]*をクリックしてください。
これでCommerceDiscountRuleType
を実装する新しい割引ルールタイプのビルドとデプロイが完了しました。
さらに詳しく見ていきましょう。
サンプルの説明
次に、デプロイしたサンプルを確認します。 割引ルールタイプのクラスと、カスタムUI入力用のJSPコントリビューターの2つのクラスがあります。 次の手順を実行します:
- OSGi登録用の割引ルールタイプのクラスに注釈を付ける
CommerceDiscountRuleType
インターフェイスを確認する- OSGi登録用のJSPコントリビューターのクラスに注釈を付ける
CommerceDiscountRuleTypeJSPContributor
インターフェイスを確認する- 割引ルールタイプを完成する
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
を構成する。 CommerceDiscountRuleTypeJSPContributor
のレンダリング
方法を実装する。- 評価ロジックを追加して、
evaluate
する。 - JSPを追加して、カスタムUI入力をレンダリングする。
- 言語キーを
Language.properties
に追加する。
モジュールに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.java と CommerceOrderModel.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入力を用いた新しい割引ルールタイプを追加できました。