Documentation

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

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

注文バリデーターは、清算を進めるときに顧客のカート内のアイテムを検証するクラスです。 Liferay Commerceでは、 デフォルト をはじめ、 アイテムバージョン定期的なアイテム(サブスクリプション) を確認するバリデーターなど複数の注文バリデーターをすぐに使うことができます。

サンプルをデプロイする

このセクションでは、注文バリデーターをLiferay Commerceのインスタンスで実行する例を示します。 次の手順を実行します:

  1. Liferay Commerceを開始します。

    docker run -it -p 8080:8080 liferay/portal:7.4.3.22-ga22
    
  2. Acme Commerce Order Validator をダウンロードして解凍します。

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

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

    注釈

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

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

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

    カタログからこの価格の商品を見つけて、[カートへ追加]をクリックします。 数量を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で使用できる他のメソッドについては、 CPInstanceCPInstanceModel を参照してください。

メインの検証チェックで検証が失敗した理由を説明するローカライズされたメッセージを含めることをお勧めします。

清算に進むための検証ロジックを追加する

@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に新しい注文バリデーターを追加しました。