新しい割引ルールタイプの追加
2 つのインターフェース CommerceDiscountRuleType と CommerceDiscountRuleTypeJSPContributorを実装することで、新しい割引ルール タイプを追加できます。
割引ルールタイプは、割引が注文に適用される時期を評価するための条件を定義します。 Liferay には、 AddedAllCommerceDiscountRuleTypeImpl、 AddedAnyCommerceDiscountRuleTypeImpl、 CartTotalCommerceDiscountRuleTypeImplの 3 つの割引ルール タイプがすぐに使用できます。

割引ルールタイプの例を展開する
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080でLiferayにサインインします。 メールアドレス test@liferay.com とパスワード testを使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
次に、次の手順に従って、Liferay インスタンスにサンプルの割引ルール タイプをデプロイします。
-
Acme Commerce 割引ルール タイプをダウンロードして解凍します。
curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/promotions/liferay-m6a8.zip -Ounzip liferay-m6a8.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.m6a8.web_1.0.0 -
サンプルの割引ルールタイプが追加されたことを確認します。 ブラウザで
https://localhost:8080を開きます。 次に、 グローバル メニュー (
) をクリックし、 コマース → 割引に移動します。 任意の割引のメニュー内の[編集]をクリックします。 ルール セクションまで下にスクロールし、 追加 (
) をクリックして新しい割引ルールを追加します。 新しい割引ルール タイプ (「製品の最小数がある」) は、 タイプ ドロップダウンの下に表示されます。
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.discount.rule.type.order値は、使用可能な割引ルールタイプのリストでこのタイプが表示される範囲を示します。 たとえば、 「すべて追加」割引ルール タイプ の値は 50 です。 作成した割引ルールタイプに値51を指定すると、「すべて追加済み」タイプの直後に表示されます。
CommerceDiscountRuleTypeインターフェイスを確認する
次のメソッドを実装します。
public boolean evaluate(
CommerceDiscountRule commerceDiscountRule,
CommerceContext commerceContext)
throws PortalException {
このメソッドでは、割引ルールが適用されるタイミングを評価するためのビジネスロジックを実装します。
public String getKey();
これにより、割引ルールタイプレジストリ内の割引ルールタイプに一意の識別情報が提供されます。 このキーを使用して、レジストリから新しいタイプを取得できます。
public String getLabel(Locale locale);
これは、割引ルールの適用方法を説明するテキストラベルを返します。 言語キーを使用してラベルを取得する際のリファレンスについては、 liferay-m6a8.zip/m6a8-web/src/main/java/com/acme/m6a8/web/internal/commerce/discount/rule/type の M6A8CommerceDiscountRuleTypeImpl.java クラスを参照してください。
OSGi登録用のJSPコントリビューターのクラスに注釈を付ける
@Component(
property = "commerce.discount.rule.type.jsp.contributor.key=m6a8",
service = CommerceDiscountRuleTypeJSPContributor.class
)
public class M6A8CommerceDiscountRuleTypeJSPContributor
implements CommerceDiscountRuleTypeJSPContributor {
Liferay が 割引ルール タイプ JSP コントリビューター レジストリ内のコントリビューターを他のコントリビューターと区別できるように、JSP コントリビューターに固有のキーを提供することが重要です。 すでに使用されているキーを宣言すると、既存の関連付けられているタイプが上書きされます。
CommerceDiscountRuleTypeJSPContributorインターフェイスを確認する
次のメソッドを実装します。
public void render(
long commerceDiscountId, long commerceDiscountRuleId,
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 に設定された値は、 liferay-m6a8.zip/m6a8-web内の bnd.bnd ファイル内の Bundle-SymbolicName の値と一致します。 これらの値は、JSPを見つけるためにServletContextと一致する必要があります。
ServletContextが正しく生成されるように、bnd.bndファイルでWeb-ContextPathの一意の値を宣言します。 この例では、Web-ContextPathを/m6a8-webに設定しています。 これらの値のリファレンスについては、 liferay-m6a8.zip/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 をレンダリングします (この例では、 liferay-m6a8.zip/m6a8-web/src/main/resources/META-INF/resources内の 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内に文字列として保存) で定義された最小値を使用して、注文に少なくとも最小数のアイテムが含まれていることを確認します。
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 入力の使用に関する詳細については、 AUI タグライブラリの使用 を参照してください。
言語キーをLanguage.propertiesに追加する
liferay-m6a8.zip/m6a8-web/src/main/resources/contentにあるLanguage.propertiesファイルに言語キーとその値を追加します:
has-a-minimum-number-of-items=Has a Minimum Number of Items
minimum-number-of-items=Minimum Number of Items
詳細については、「 アプリケーションのローカライズ 」を参照してください。
さいごに
これで、 これで、 CommerceDiscountRuleType インターフェースを実装するための基本を理解し、カスタム UI 入力を備えた新しい割引ルール タイプを Liferay に追加しました。