Customizing Order Management
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

カスタム注文ルールの実装

特定の条件を満たす注文に対して、Liferay で注文ルールを設定できます。 最少注文金額のルールは、すぐに利用可能です。 特定の値以下の注文のチェックアウトを防ぐことができます。 新しい順序ルールを追加するには、 COREntryType インターフェイスを実装する必要があります。 詳細については、 順序ルール を参照してください。

カスタム注文ルールのデプロイと言語キーの追加

新しいLiferay DXPインスタンスを起動し、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/dxp:2025.q1.6-lts

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

次に、以下の手順に従います。

  1. 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
    
  2. サンプルをビルドしてデプロイします。

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

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

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

    STARTED com.acme.x9k1.impl_1.0.0
    
  4. 管理者としてログインし、 グローバル メニュー (Applications Menu icon) を開き、 コントロール パネル言語の上書きをクリックします。 追加 ボタン (Add icon) をクリックし、次のキーを追加します。

    言語キー
    x9k1-minimum-order-quantityX9K1 最小注文数
    minimum-quantity最小数
    重要

    Liferay DXP 7.4 U4以降、またはLiferay Portal 7.4 GA8以降の言語オーバーライドツールで言語キーを追加することができます。 以前のバージョンでは、ビルドとデプロイの前に、キーを含む Language.properties ファイルを /src/main/resources/content/ の下に追加する必要があります。

  5. グローバル メニュー (Applications Menu icon) を開き、 コマース注文ルールをクリックします。

  6. 追加 ボタン (Add icon) をクリックし、次の情報を入力します。

    名前: 最小注文数量 - 3

    説明: テストの最小注文数量は3個です

    タイプ: X9K1 最小注文数量

    カスタム注文ルールの名前、説明、タイプを入力します。

  7. [送信]をクリックします。

  8. 構成 セクションで、 最小数量3に設定します。

  9. [アクティブ] トグルをクリックして、新しい注文ルールを有効にします。

    最小数量を 3 に設定し、[アクティブ] トグルを使用して新しい注文ルールを有効にします。

  10. 公開をクリックします。

  11. グローバル メニュー (Applications Menu icon) を開き、 コントロール パネルサイトをクリックして、新しい Minium Demo サイトを追加します。

  12. バイヤーとしてログインし、商品をカートに追加します。 チェックアウトするには、 [送信] をクリックします。

注文数が3個以下の場合、警告メッセージが表示されます。 この条件を満たすまで、チェックアウトはできません。

注文数が3個以下の場合、警告メッセージが表示されます。

重要

注文ルールを有効にすると、すべてのアカウント、アカウント グループ、注文タイプ、チャネルに適用されます。 適格性を制御するには、注文ルールs 適格性 タブをクリックし、適切なオプションを選択します。

カスタム注文ルールの仕組み

この例では、主に9つの手順を示します。

  1. OSGi登録用に注文ルールに注釈を付ける
  2. COREntryTypeインターフェイスを確認する
  3. COREntryTypeの実装を完了する
  4. ディスプレイコンテキストを追加する
  5. 最小数値を取得するユーティリティクラスを追加する
  6. OSGi登録用のJSPコントリビュータに注釈を付ける
  7. COREntryTypeJSPContributorインターフェイスを確認する
  8. JSPコントリビューターの実装を完了する
  9. 注文ルールの設定をレンダリングする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("Order quantity is less than the minimum quantity ");

	Double minimumQuantity = _getMinimumQuantity(corEntry);

	sb.append(minimumQuantity);

	sb.append(". Add ");

	Double delta = BigDecimalUtil.subtract(
		BigDecimal.valueOf(minimumQuantity),
		_getOrderQuantity(commerceOrder));

	sb.append(delta);

	sb.append(" more item");

	if (delta > 1) {
		sb.append("s");
	}

	sb.append(" to continue.");

	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から変換された Stringを返します。 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コントリビューターを完了させるには、render() メソッドを実装する必要があります。 _corEntryLocalServicecorEntryIdを用いて、 COREntryを取得します。 次に、取得したcorEntryを使用して、 X9K1MinimumQuantityDisplayContext型の新しい表示コンテキストを作成します。 このコンテキストには、httpServletRequestが設定されます。 servletContextは、bnd.bndファイルから Bundle-Symbolic-Nameを参照します。 JSPRendererrenderJSP()メソッドでJSPファイルをレンダリングします。 引数として、JSPの相対パス、servletContexthttpServletRequesthttpServletResponseを許可します。

注文ルールの設定をレンダリングするJSPを追加する

<%@ taglib uri="http://liferay.com/tld/aui" prefix="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" %>

<%@ page import="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 に新しい注文ルールを追加しました。