カスタム注文ルールの実装
Liferayでは、特定の条件を満たす注文に対して注文ルールを設定できます。 最少注文金額のルールは、すぐに利用可能です。 特定の値以下の注文のチェックアウトを防ぐことができます。 新しい順序ルールを追加するには、 COREntryType インターフェースを実装する必要があります。 詳しくは 注文ルール を参照してください。
カスタム注文ルールの展開と言語キーの追加
Liferay DXP の新しいインスタンスを起動するには、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/dxp:2026.q1.9-lts
http://localhost:8080 に、メールアドレス test@liferay.com とパスワード test を使用して Liferay にサインインします。 プロンプトが表示されたら、パスワードを learn に変更してください。
次に、以下の手順に従ってください。
-
Acme Commerce Order Ruleをダウンロードして解凍してください。
curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/order-management/liferay-x9k1.zip -O unzip liferay-x9k1.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注記このコマンドは、デプロイされた jar ファイルを Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Dockerコンテナコンソールでデプロイを確認してください。
com.acme.x9k1.impl_1.0.0 を開始しました -
管理者としてログインし、 グローバルメニュー (
) を開き、 コントロールパネル → 言語オーバーライド をクリックします。 Add ボタン (
) をクリックして、次のキーを追加します。言語キー 価値 x9k1-最小注文数量 X9K1 最小注文数量 最小数量 最小注文数量 重要Liferay DXP 7.4 U4以降またはLiferay Portal 7.4 GA8以降では、言語オーバーライドツールを使用して言語キーを追加できます。 以前のバージョンでは、ビルドおよびデプロイする前に、キーを含む
Language.propertiesファイル (/src/main/resources/content/の下) を追加する必要があります。 -
グローバルメニュー (
) を開き、 コマース → 注文ルール をクリックします。 -
追加 ボタン (
) をクリックし、以下の情報を入力してください。名前: 最小注文数量 - 3
説明: テスト最小注文数量3個
タイプ: X9K1 最小注文数量

-
をクリックして を送信します。
-
構成 セクションで、 最小数量 を 3に設定します。
-
「有効」トグルをクリックして、新しい注文ルールを有効にしてください。

-
をクリックして公開 します。
-
グローバルメニュー (
を開き、 コントロールパネル → サイトをクリックして、新しい Minium デモサイトを追加します。 -
購入者としてログインし、商品をカートに追加してください。 チェックアウトするには、 をクリックして送信 をクリックしてください。
注文数量が3未満の場合は、警告メッセージが表示されます。 この条件を満たさない限り、チェックアウトはできません。

注文ルールを有効にすると、そのルールはすべてのアカウント、アカウントグループ、注文タイプ、およびチャネルに適用されます。 資格を制御するには、注文ルールの 資格 タブをクリックし、適切なオプションを選択します。
カスタムオーダールールの仕組み
この例には9つの主要なステップがあります。
- OSGi登録の順序ルールに注釈を付ける
COREntryTypeインターフェースを確認してください。COREntryTypeの実装を完了してください。- 表示コンテキストを追加する
- 最小数量値を取得するためのユーティリティクラスを追加します。
- OSGi登録のためにJSPコントリビューターに注釈を付ける
COREntryTypeJSPContributorインターフェースを確認してください。- JSPコントリビューターの実装を完了する
- 注文ルールの設定を表示するJSPを追加します。
OSGi登録の順序ルールに注釈を付ける
@Component(
property = {
"commerce.order.rule.entry.type.key=x9k1-minimum-quantity-order-rule",
"commerce.order.rule.entry.type.order:Integer=1"
},
service = COREntryType.class
)
public class X9K1MinimumQuantityCOREntryTypeImpl implements COREntryType {
注文ルールには固有のキーを指定する必要があります。そうすることで、Liferay Commerce は注文ルールレジストリ内の他の注文ルールと区別することができます。 既に使われているキーを指定すると、既存の関連付けられた型が上書きされます。 順序によって、ドロップダウンリストでの並び順が決まります。 この場合、順序は1であり、ドロップダウンリストの2番目の項目として表示されます。
COREntryType インターフェースを確認してください。
以下のメソッドを実装してください。
public boolean evaluate(COREntry corEntry, CommerceOrder commerceOrder) throws PortalException;
このメソッドは順序ルールを評価し、条件が満たされているかどうかに応じてtrueまたはfalseを返します。
public boolean evaluate(COREntry corEntry, List<COREntryTypeItem> corEntryTypeItems)
このメソッドは、複数の項目を評価して順序ルールに照らし合わせ、条件が満たされているかどうかに応じてtrueまたはfalseを返します。 このサンプルでは、この方法は必要ありません。
public String getErrorMessage(COREntry corEntry, CommerceOrder commerceOrder, Locale locale) throws PortalException;
評価されたメソッドがfalseを返した場合、このメソッドはユーザーに警告を表示するエラーメッセージを含む文字列を返します。
public String getKey();
このメソッドは、注文ルールの一意のキーを返します。 既存のキーを使用すると、その順序ルールは上書きされます。
public boolean isActive();
このメソッドは、順序ルールが有効であることを示すためにtrueを返します。
public String getLabel(Locale locale);
このメソッドは、UIに表示される注文ルールの名前を返します。 これは言語キーまたは文字列である可能性があります。
COREntryType の実装を完了してください。
@Override
public boolean evaluate(COREntry corEntry, CommerceOrder commerceOrder)
throws PortalException {
if (BigDecimalUtil.gt(
BigDecimal.valueOf(_getMinimumQuantity(corEntry)),
_getOrderQuantity(commerceOrder))) {
return false;
}
return true;
}
@Override
public boolean evaluate(
COREntry corEntry, List<COREntryTypeItem> corEntryTypeItems) {
throw new UnsupportedOperationException();
}
@Override
public String getErrorMessage(
COREntry corEntry, CommerceOrder commerceOrder, Locale locale)
throws PortalException {
StringBundler sb = new StringBundler();
sb.append("注文数量が最小数量より少ないです ");
Double minimumQuantity = _getMinimumQuantity(corEntry);
sb.append(minimumQuantity);
sb.append(". "を追加 );
Double delta = BigDecimalUtil.subtract(
BigDecimal.valueOf(minimumQuantity),
_getOrderQuantity(commerceOrder));
sb.append(delta);
sb.append(" more item");
if (delta > 1) {
sb.append("s");
}
sb.append(" 続ける。");
return sb.toString();
}
@Override
public String getKey() {
return "x9k1-minimum-quantity-order-rule";
}
@Override
public String getLabel(Locale locale) {
return LanguageUtil.get(locale, "x9k1-minimum-order-quantity");
}
@Override
public boolean isActive() {
return true;
}
順序ルールを完成させるには、上記の方法を実装する必要があります。 注文ルールで設定された注文数量と最小数量を取得するための2つのユーティリティメソッドが追加されました。 最初のオーバーライドされたメソッドは evaluate() で、現在の注文が注文ルールに合格するかどうかをチェックします。 条件を満たせばtrueを返し、そうでなければfalseを返します。
2番目の方法は、注文ルールを満たさない注文のエラーメッセージを取得します。 これは、すべての用語を含む StringBuilder から変換された文字列を返します。 3番目のメソッドは一意のキーを返し、最後のメソッドはUIに表示されるラベルを返します。
注文ルールの最小数量と総注文数量を取得するには、さらに2つの方法があります。 最初のメソッドはユーティリティクラス X9K1MinimumQuantityUtil に存在します。 2番目の方法は _getOrderQuantity(CommerceOrder commerceOrder) です。 注文に含まれる個々の商品の数量を合計した合計注文数量を返します。
表示コンテキストを追加する
public class X9K1MinimumQuantityDisplayContext {
public X9K1MinimumQuantityDisplayContext(COREntry corEntry) {
_corEntry = corEntry;
}
public Double getMinimumQuantity() {
return X9K1MinimumQuantityUtil.getMinimumQuantity(_corEntry);
}
private final COREntry _corEntry;
}
このコードは、注文ルール用に設定された最小数量の値を表示コンテキストから取得します。表示コンテキストには、タイプ COREntry の単一のフィールドが含まれており、作成された注文ルールを使用して設定されます。 表示コンテキストには、注文ルールに設定されている最小数量を取得するためのメソッドが1つあり、それは以下に詳述するユーティリティクラスを使用します。
最小数量値を取得するためのユーティリティクラスを追加します。
public class X9K1MinimumQuantityUtil {
public static Double getMinimumQuantity(COREntry corEntry) {
UnicodeProperties typeSettingsUnicodeProperties =
UnicodePropertiesBuilder.fastLoad(
corEntry.getTypeSettings()
).build();
return GetterUtil.getDouble(
typeSettingsUnicodeProperties.getProperty("minimum-quantity"));
}
}
X9K1MinimumQuantityUtil クラスは、注文ルールに設定されている最小数量を取得します。 JSPkeyで設定されたプロパティ名を使用して値を取得します。
OSGi登録のためにJSPコントリビューターに注釈を付ける
@Component(
property = "commerce.order.rule.entry.type.jsp.contributor.key=x9k1-minimum-quantity-order-rule",
service = COREntryTypeJSPContributor.class
)
public class X9K1MinimumQuantityCOREntryTypeJSPContributor
implements COREntryTypeJSPContributor {
commerce.order.rule.entry.type.jsp.contributor.key プロパティは、JSP コントリビューターが実装されているオーダー ルールを決定します。
COREntryTypeJSPContributor インターフェースを確認してください。
public void render(long corEntryId, HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws Exception;
COREntryTypeJSPContributor インターフェースには、JSP をレンダリングするメソッドが 1 つ含まれています。 このメソッドは、引数として、順序ルールのIDと、 HTTPServletRequest および HTTPServletResponse 型のオブジェクトを必要とします。
JSPコントリビューターの実装を完了する
@Override
public void render(
long corEntryId, HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse)
throws Exception {
COREntry corEntry = _corEntryLocalService.getCOREntry(corEntryId);
X9K1MinimumQuantityDisplayContext x9k1MinimumQuantityDisplayContext =
new X9K1MinimumQuantityDisplayContext(corEntry);
httpServletRequest.setAttribute(
WebKeys.PORTLET_DISPLAY_CONTEXT, x9k1MinimumQuantityDisplayContext);
_jspRenderer.renderJSP(
_servletContext, httpServletRequest, httpServletResponse,
"/minimum_quantity.jsp");
}
@Reference
private COREntryLocalService _corEntryLocalService;
@Reference
private JSPRenderer _jspRenderer;
@Reference(target = "(osgi.web.symbolicname=com.acme.x9k1.impl)")
private ServletContext _servletContext;
JSP Contributor を完了するには、 render() メソッドを実装する必要があります。 COREntry を _corEntryLocalService と corEntryId を使用して取得します。 次に、取得した corEntry を使用して、タイプ X9K1MinimumQuantityDisplayContext の新しい表示コンテキストを作成します。 このコンテキストは httpServletRequest に設定されます。 servletContext は、 bnd.bnd ファイルからの Bundle-Symbolic-Name を参照します。 JSPRenderer は renderJSP() メソッドを使用して JSP ファイルをレンダリングします。 引数として、JSP の相対パス、 servletContext、 httpServletRequest、および httpServletResponse を受け入れます。
注文ルールの設定を表示するJSPを追加します。
<%@ タグリブ uri="http://liferay.com/tld/aui" プレフィックス="aui" %><%@
taglib uri="http://liferay.com/tld/commerce-ui" prefix="commerce-ui" %>
<%@ page import="com.acme.x9k1.internal.commerce.order.rule.web.display.context.X9K1MinimumQuantityDisplayContext" %>
<%@ ページインポート="com.liferay.portal.kernel.util.WebKeys" %>
<%
X9K1MinimumQuantityDisplayContext x9k1MinimumQuantityDisplayContext = (X9K1MinimumQuantityDisplayContext)request.getAttribute(WebKeys.PORTLET_DISPLAY_CONTEXT);
%>
<div class="row">
<div class="col">
<commerce-ui:panel
bodyClasses="flex-fill"
title="Configuration"
>
<div class="row">
<div class="col">
<aui:input label="minimum-quantity" name="type--settings--minimum-quantity--" required="<%= true %>" type="text" value="<%= x9k1MinimumQuantityDisplayContext.getMinimumQuantity() %>">
<aui:validator name="number" />
</aui:input>
</div>
</div>
</commerce-ui:panel>
</div>
</div>
JSPには、注文ルールにおける最小数量を受け入れるための入力フィールドが1つ含まれています。 これは表示コンテキストを通じて取得され、カスタム注文ルール内で評価されます。 表示コンテキストはユーティリティクラスを使用し、タイプ設定構成から 最小数量 名前を使用してフィールドを取得します。 getMinimumQuantity() メソッドは、存在する値があればそれを取得します。
結論
これで、 COREntryType インターフェースを実装するための基本を理解し、Liferay Commerce に新しい注文ルールを追加しました。