カスタム注文バリデーターの実装
このチュートリアルでは、 CommerceOrderValidator インターフェイスを実装してカスタム注文バリデーターを追加する方法について説明します。
注文バリデーターは、チェックアウトを進める際に顧客のカート内のアイテムを検証するクラスです。 Liferay には、 デフォルトのをはじめ、 アイテムのバージョン と 定期的なアイテム (サブスクリプション)をチェックするバリデータなど、すぐに使用できる複数の注文バリデータが用意されています。
注文検証機能には、製品をカートに追加して新しいチェックアウト手順に進むための検証ロジックがあります。 3つの部分があります:
2 つの 検証 メソッドは、注文検証のカスタム検証ロジックを定義する場所です。 この例では、特定の価格を超える品目が 10 個以上ある注文を拒否するロジックを追加します。
サンプル注文検証ツールをデプロイする
新しい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に変更します。
次に、以下の手順に従います。
-
Acme Commerce Order Validatorをダウンロードして解凍します。
curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/sales/liferay-n9b2.zip -Ounzip liferay-n9b2.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.n9b2.impl_1.0.0 -
失敗メッセージを表示して、サンプル注文検証ツールの追加を確認します。 ブラウザで
https://localhost:8080を開き、100ドル以上の価格のアイテムが少なくとも1つあるカタログに移動します。 そのような製品がまだ存在しない場合は、自分で追加してください。詳細については、「 シンプルな製品の作成 」を参照してください。カタログからこの価格の商品を見つけて、 カートに追加をクリックします。 数量を11以上に増やし、矢印をクリックして続行します。 表示されるエラーメッセージは、カスタム注文バリデーターがアイテムの追加を正常に拒否したことを示しています。

おめでとうございます。 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, String json, BigDecimal quantity, boolean child) throws PortalException
これは、カスタム検証ロジックを追加する 2 つの検証方法のうちの 1 つです。 このメソッドは、顧客がカートにアイテムを追加するたびに呼び出されます。 これは、結果が検証に合格したかどうかをブール値を使用して通知する CommerceOrderValidatorResultを返すことによって行われます。 詳細については、 CommerceOrderValidatorResult.java を参照してください。
public CommerceOrderValidatorResult validate(Locale locale, CommerceOrderItem commerceOrderItem) throws PortalException;
これは、カスタム検証ロジックを追加できる 2 番目の検証方法です。 このメソッドは、注文が 進行中 または 保留中に移行するたびに、カートにすでに入っているアイテムに対して呼び出されます。
商品をカートに追加するための検証ロジック
@Override
public CommerceOrderValidatorResult validate(
Locale locale, CommerceOrder commerceOrder, CPInstance cpInstance,
String json, BigDecimal quantity, boolean child)
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を参照してください。
メインの検証チェックで検証が失敗した理由を説明するローカライズされたメッセージを含めることがベスト プラクティスです。
チェックアウトに進むための検証ロジック
@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()));
}
return new CommerceOrderValidatorResult(true);
}
このメソッドは顧客のカート内のアイテムに対して呼び出されるため、同じ検証ロジックをこのメソッドに追加します。 ここでの主な違いは、 CommerceOrderItem オブジェクトから情報を取得することです。 CommerceOrderItem と CommerceOrderItemModel を参照して、 CommerceOrderItemで使用できるその他のメソッドを見つけてください。
言語キーが Language.propertiesに追加されました
モジュール内の liferay-n9b2.zip/n9b2-impl/src/main/resources/content にある 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 に新しい注文検証機能を追加しました。