カスタム注文バリデーターの実装
このチュートリアルでは、 CommerceOrderValidator インターフェイスを実装して、カスタムオーダーバリデーターを追加する方法を示します。
注文バリデーターは、チェックアウトを行う際に顧客のカート内のアイテムを検証するクラスです。 Liferay Commerceでは、 デフォルト をはじめ、 アイテムバージョン や 定期的なアイテム(サブスクリプション) を確認するバリデーターなど複数の注文バリデーターをすぐに使うことができます。
概要
サンプルをデプロイする
このセクションでは、注文バリデーターをLiferay Commerceのインスタンスで実行する例を示します。 新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.55-ga55。
http://localhost:8080でLiferayへのサインインします。 メールアドレス [email protected] とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learn に変更します。
次に、以下の手順に従います。
Acme Commerce Order Validator をダウンロードし、解凍してください。
curl https://resources.learn.liferay.com/commerce/latest/ja/developer-guide/sales/liferay-n9b2.zip -O
unzip liferay-n9b2.zip
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
noteこのコマンドは、デプロイされたjarをDockerコンテナの
/opt/liferay/osgi/modules
にコピーするのと同じです。Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.n9b2.impl_1.0.0
失敗メッセージを表示して、サンプルの注文バリデーターが追加されたことを確認します。 ブラウザで
https://localhost:8080
を開き、100ドル以上の価格のアイテムが少なくとも1つあるカタログに移動します。 そのような商品がまだ存在しない場合は、自分で追加してください。詳細については、 シンプル商品を作成する を参照してください。カタログからこの価格の商品を見つけて、[Add to Cart]をクリックします。 数量を11以上に増やし、矢印をクリックして続行します。 表示されるエラーメッセージは、カスタム注文バリデーターがアイテムの追加を正常に拒否したことを示しています。
これで、CommerceOrderValidator
を実装する新しい注文バリデーターを正常に構築およびデプロイできました。
さらに詳しく見ていきましょう。
サンプルの説明
このセクションでは、デプロイしたサンプルについて確認します。 最初に、OSGi登録用のクラスに注釈を付けます。 次に、CommerceOrderValidator
インターフェイスを確認します。 最後に、CommerceOrderValidator
の実装を完了します。
OSGi登録用のクラスに注釈を付ける
@Component(
property = {
"commerce.order.validator.key=n9b2",
"commerce.order.validator.priority:Integer=9"
},
service = CommerceOrderValidator.class
)
public class N9B2CommerceOrderValidator implements CommerceOrderValidator {
Liferay Commerceが、 注文バリデーターレジストリ で新しい注文バリデーターを他のバリデーターと区別できるように、注文バリデーターに個別のキーを提供することが重要です。 すでに使用されているキーを再利用すると、既存の関連付けられているバリデーターが上書きされます。
commerce.order.validator.priority
値は、他のバリデーターとの順序において、この注文バリデーターがいつ検証を実行するかを示します。 たとえば、 デフォルトの注文バリデーター の値は10です。 この注文バリデータに9の値を指定すると、デフォルトのバリデーターの直前に検証が実行されます。
CommerceOrderValidator
インターフェイスを確認する
次のメソッドを実装します。
public String getKey();
このメソッドは、注文バリデーターレジストリに注文バリデーター用の一意の識別情報を提供します。 このキーを使用して、レジストリからバリデーターを取得できます。 すでに使用されているキーを再利用すると、既存の関連付けられているバリデーターが上書きされます。
public CommerceOrderValidatorResult validate(Locale locale, CommerceOrder commerceOrder, CPInstance cpInstance, int quantity) throws PortalException;
これは、カスタム検証ロジックを追加する2つの検証メソッドの1つです。 このメソッドは、顧客がカートにアイテムを追加するたびに呼び出されます。 これは
CommerceOrderValidatorResult
を返し、booleanを使用して結果が検証に合格したかどうかを示します。 CommerceOrderValidatorResult.java を参照してください。
public CommerceOrderValidatorResult validate(Locale locale, CommerceOrderItem commerceOrderItem) throws PortalException;
これは、カスタム検証ロジックを追加できる2番目の検証方法です。 このメソッドは、顧客がチェックアウトの新しいステップに進むと、カートにすでにあるアイテムに対して呼び出されます。
注文バリデーターを完了する
注文バリデーターは、商品をカートに入れるときと、新しいチェックアウトのステップに進むときの両方の検証ロジックで構成されています。 以下を行います。
2つの検証
メソッドでは、注文バリデーター用のカスタム検証ロジックを定義します。 この例では、特定の価格で商品が11個以上ある注文を拒否するロジックを追加します。
商品をカートに追加するための検証ロジックを追加する
@Override
public CommerceOrderValidatorResult validate(
Locale locale, CommerceOrder commerceOrder, CPInstance cpInstance,
int quantity)
throws PortalException {
if (cpInstance == null) {
return new CommerceOrderValidatorResult(false);
}
BigDecimal price = cpInstance.getPrice();
if ((price.doubleValue() > _MAX_ITEM_PRICE) &&
(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",
Integer.valueOf(_MAX_ITEM_QUANTITY)));
}
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 を参照してください。メインの検証チェックで検証が失敗した理由を説明するローカライズされたメッセージを含めることをお勧めします。
チェックアウトに進むための検証ロジックを追加する
@Override
public CommerceOrderValidatorResult validate(
Locale locale, CommerceOrderItem commerceOrderItem)
throws PortalException {
BigDecimal price = commerceOrderItem.getUnitPrice();
if ((price.doubleValue() > _MAX_ITEM_PRICE) &&
(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",
Integer.valueOf(_MAX_ITEM_QUANTITY)));
}
return new CommerceOrderValidatorResult(true);
}
このメソッドは顧客のカート内のアイテムに対して呼び出されるため、同じ検証ロジックをこのメソッドに追加します。 この場合の主な違いは、
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}.
詳細は、 アプリケーションのローカライズ を参照してください。
まとめ
CommerceOrderValidator
インターフェイスを実装するための基本を理解し、Liferay Commerceに新しい注文バリデーターを追加しました。