oo

カスタム注文バリデーターの実装

このチュートリアルでは、 CommerceOrderValidator インターフェイスを実装してカスタムオーダーバリデータを追加する方法を説明します。

注文バリデータは、チェックアウトを進めるときに顧客のカート内の商品を検証するクラスです。 Liferay は、 デフォルト を含む複数のすぐに使える注文バリデーターに加え、 アイテムのバージョン繰り返しのアイテム (サブスクリプション) をチェックするためのバリデーターを提供します。

オーダーバリデータには、商品をカートに追加するときと、新しいチェックアウトステップに進むときの両方のバリデーションロジックがあります。 3つのパートがある:

  1. 商品をカートに追加するためのバリデーションロジックです。
  2. チェックアウトに進むためのバリデーションロジック。
  3. 言語キーを Language.properties に追加した。

2つの validate メソッドでは、オーダーバリデータのカスタム検証ロジックを定義します。 この例では、一定価格以上の商品が10個以上ある注文を拒否するロジックを追加しています。

サンプルオーダーバリデータをデプロイする

新しい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 に変更します。

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

  1. Acme Commerce Order Validator をダウンロードして解凍します。

    curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/sales/liferay-n9b2.zip -O
    
    unzip liferay-n9b2.zip
    
  2. サンプルをビルドしてデプロイします。

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

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

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

    STARTED com.acme.n9b2.impl_1.0.0
    
  4. 失敗メッセージを表示して、サンプルオーダーバリデータの追加を確認する。 ブラウザをhttps://localhost:8080に開き、100ドル以上の商品が少なくとも1点あるカタログに移動する。 そのような商品がまだ存在しない場合は、自分で追加してください。詳細については、 シンプル商品を作成する を参照してください。

    カタログからこの価格の商品を探し、 カートに入れる をクリックします。 数量を11以上に増やし、矢印をクリックして続行します。 表示されるエラーメッセージは、カスタム注文バリデーターがアイテムの追加を正常に拒否したことを示しています。

    The custom order validator displays an error message.

おめでとうございます。 CommerceOrderValidator を実装した新しいオーダーバリデータをビルドしてデプロイできました。

オーダーバリデータの作成は、主に3つのステップで構成される。 まず、OSGi登録のためにクラスにアノテーションを付ける。 次に、CommerceOrderValidator インターフェースを実装する。 最後に、CommerceOrderValidator の実装を作成する。

OSGi登録用のクラスに注釈を付ける

@Component(
	property = {
		"commerce.order.validator.key=n9b2",
		"commerce.order.validator.priority:Integer=9"
	},
	service = CommerceOrderValidator.class
)

Liferay が新しいオーダーバリデータを オーダーバリデータレジストリ の他のものと区別できるように、 オーダーバリデータに個別のキーを指定することが重要です。 すでに使われているキーを再利用すると、関連する既存のバリデータが上書きされます。

commerce.order.validator.priorityの値は、オーダーバリデータが他のバリデータと順番にバリデーションを行うタイミングを示します。 たとえば、 デフォルトの注文バリデーター の値は10です。 オーダーバリデータに 9 を指定すると、デフォルトバリデータの直前でバリデーションを行うようになります。

CommerceOrderValidator インターフェイスのレビュー

このインターフェイスでは、3つのメソッドを実装する必要がある:

public String getKey();

このメソッドは、注文バリデーターレジストリに注文バリデーター用の一意の識別情報を提供します。 このキーはバリデータをレジストリから取得します。 すでに使われているキーを再利用すると、関連する既存のバリデータが上書きされます。

public CommerceOrderValidatorResult validate(Locale locale, CommerceOrder commerceOrder, CPInstance cpInstance, int quantity) throws PortalException;

これは2つのバリデーションメソッドのうちの1つで、カスタムのバリデーションロジックを追加します。 このメソッドは、顧客がカートにアイテムを追加するたびに呼び出されます。 これは CommerceOrderValidatorResult を返すことで行います。この CommerceOrderValidatorResult はブール値を使用して、結果がバリデーションに合格したかどうかを知らせます。 詳細は CommerceOrderValidatorResult.java を参照。

public CommerceOrderValidatorResult validate(Locale locale, CommerceOrderItem commerceOrderItem) throws PortalException;

これは2番目のバリデーションメソッドで、カスタムのバリデーションロジックを追加することができます。 このメソッドは、注文が 進行中 または 保留中 に遷移するたびに、すでにカートに入っているアイテムのために呼び出されます。

カートに商品を追加するためのバリデーション・ロジック

@Override
public CommerceOrderValidatorResult validate(
		Locale locale, CommerceOrder commerceOrder, CPInstance cpInstance,
		BigDecimal quantity)
	throws PortalException {

	if (cpInstance == null) {
		return new CommerceOrderValidatorResult(false);
	}

	BigDecimal price = cpInstance.getPrice();

	if ((price.doubleValue() > _MAX_ITEM_PRICE) &&
		BigDecimalUtil.gt(quantity, _MAX_ITEM_QUANTITY)) {

		ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
			"content.Language", locale, getClass());

		return new CommerceOrderValidatorResult(
			false,
			LanguageUtil.format(
				resourceBundle,
				"this-expensive-item-has-a-maximum-quantity-of-x",
				_MAX_ITEM_QUANTITY.toString()));
	}

	return new CommerceOrderValidatorResult(true);
}
private static final double _MAX_ITEM_PRICE = 100.0;

private static final int _MAX_ITEM_QUANTITY = 10;

この例の主な検証では、価格 (「BigDecimal」として保存) が $100 より大きいかどうか、および数量が 10 より大きいかどうかをチェックします。 この価格情報は、顧客の注文に関する情報が含まれる「CPInstance」から取得できます。 CPInstance で使用できるその他のメソッドについては、 CPInstance および CPInstanceModel を参照してください。

Note

主なバリデーションチェックには、なぜ失敗したかを説明するローカライズされたメッセージを含めるのがベストプラクティスです。

チェックアウトに進むためのバリデーション・ロジック

@Override
public CommerceOrderValidatorResult validate(
		Locale locale, CommerceOrderItem commerceOrderItem)
	throws PortalException {

	BigDecimal price = commerceOrderItem.getUnitPrice();

	if ((price.doubleValue() > _MAX_ITEM_PRICE) &&
		BigDecimalUtil.gt(
			commerceOrderItem.getQuantity(), _MAX_ITEM_QUANTITY)) {

		ResourceBundle resourceBundle = ResourceBundleUtil.getBundle(
			"content.Language", locale, getClass());

		return new CommerceOrderValidatorResult(
			false,
			LanguageUtil.format(
				resourceBundle,
				"expensive-items-have-a-maximum-order-quantity-of-x",
				_MAX_ITEM_QUANTITY.toString()));
	}

このメソッドは顧客のカート内の商品に対して呼び出されるので、同じ検証ロジックをこのメソッドに追加します。 ここでの主な違いは、情報を CommerceOrderItem オブジェクトから取得することです。 CommerceOrderItem で使用できるその他のメソッドについては、 CommerceOrderItem および CommerceOrderItemModel を参照してください。

Language.propertiesに言語キーが追加されました。

言語キーとその値を、モジュール内の Language.properties ファイルに追加します。 例えば、

expensive-items-have-a-maximum-order-quantity-of-x=Expensive items have a maximum order quantity of {0}.
this-expensive-item-has-a-maximum-quantity-of-x=This expensive item has a maximum order quantity of {0}.

詳細は、 アプリケーションのローカライズ を参照してください。

カスタムオーダーバリデータの変更

オーダーバリデータの動作を変更したい場合は、javaファイルを編集します。 _MAX_ITEM_PRICE の値を変更して、$200 以上の注文を拒否するようにする。 カスタムオーダーバリデータを再デプロイして、これらの変更をLiferayに送信します。

ブラウザに戻って、100ドルから200ドルの商品を10個追加してみる。 バリデータが100ドル以上の注文を拒否しなくなったので、これらの商品をカートに入れることができます。

今度は、200ドル以上の商品を10個追加してみよう。 これらの商品をカートに追加できない場合は、バリデータが機能しています!

さいごに

  これで CommerceOrderValidator インターフェイスの実装の基本がわかり、 Liferay に新しい注文バリデータが追加されました。

関連トピック](../../product-management/creating-and-managing-products/product-types/creating-a-simple-product.md)

Capability: