Documentation

[商品パブリッシャー]ウィジェット用の新しい商品データソースの追加

このチュートリアルでは、CPDataSourceインターフェイスを実装して、新しい商品データソースを追加する方法を示します。

商品データソースは、関連する商品を検索する独自の方法を提供します。 Liferay Commerceでは、 商品の関係別 および カテゴリ別に 検索するものなど、標準でいくつかの商品データソースを提供しています。

すぐに使える商品データソース

サンプルをデプロイする

このセクションでは、商品データソースをLiferay Commerceのインスタンスで実行する例を示します。

新しいLiferayインスタンスを実行します。

docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.22-ga22

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

次に、以下の手順を実行します。

  1. Acme Commerce Product Data Source をダウンロードして解凍します。

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

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

    注釈

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

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

    STARTED com.acme.m5x7.impl_1.0.0
    
  4. サンプルの商品データソースが追加されたことを確認します。 ブラウザーで https://localhost:8080 を開き、商品パブリッシャーウィジェットのあるページに移動します。 商品パブリッシャーの[設定]をクリックし、[製品の選択]セクションで[データソース]を選択します。 新しい商品データソース(「Products Ending in the Same Word」)が、[データソース] ドロップダウンの下に表示されます。

新しい商品データソース

これで、CPDataSourceを実装する新しい商品データソースのビルドとデプロイが完了しました。

次に、詳細をさらに詳しく見ていきましょう。

例の説明

このセクションでは、デプロイした例について確認します。 最初に、OSGi登録用のクラスに注釈を付けます。 次に、 CPDataSourceインターフェイスを確認します。 最後に、CPDataSourceの実装を完了します。

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

@Component(
    property = "commerce.product.data.source.name=m5x7",
    service = CPDataSource.class
)
public class M5X7CPDataSource implements CPDataSource {

Liferay Commerceが新しいデータと既存のデータソースを区別できるように、商品データソース名は一意の値である必要があります。

CPDataSourceインターフェースを確認する

次のメソッドを実装します。

public String getLabel(Locale locale);

このメソッドは、商品データソースが関連商品を検索する方法を説明するテキストラベルを返します。 言語キーでラベルを取得する際のリファレンスについては、 M5X7CPDataSource.java の実装を参照してください。

public String getName();

これは、商品データソースの名前を返します。

public CPDataSourceResult getResult(
        HttpServletRequest httpServletRequest, int start, int end)
    throws Exception;

ここで、関連商品の検索を実行するビジネスロジックを追加します。 HttpServletRequestには、結果を何らかの方法で関連付ける必要がある特定の商品への参照が含まれています。

この方法では、検索結果の一覧を含むCPDataSourceResultを返します。実装については CPDataSourceResult.java を参照してください。

商品データソースを完成させる

商品データソースは、関連商品の検索を実行するロジックで構成されています。 以下を行います。

getResultに検索ロジックを追加する。

@Override
public CPDataSourceResult getResult(
        HttpServletRequest httpServletRequest, int start, int end)
    throws Exception {

    CPCatalogEntry cpCatalogEntry =
        (CPCatalogEntry)httpServletRequest.getAttribute(
            CPWebKeys.CP_CATALOG_ENTRY);

    if (cpCatalogEntry == null) {
        return new CPDataSourceResult(new ArrayList<>(), 0);
    }

    return _cpDefinitionHelper.search(
        _portal.getScopeGroupId(httpServletRequest),
        new SearchContext() {
            {
                setAttributes(
                    HashMapBuilder.<String, Serializable>put(
                        Field.STATUS, WorkflowConstants.STATUS_APPROVED
                    ).put(
                        "excludedCPDefinitionId",
                        cpCatalogEntry.getCPDefinitionId()
                    ).build());
                setCompanyId(_portal.getCompanyId(httpServletRequest));
                setKeywords(
                    StringPool.STAR + _getLastWordOfName(cpCatalogEntry));
            }
        },
        new CPQuery(), start, end);
}

CPDefinitionHelper を使用して、検索を実行します。 CPDefinitionHelperは、商品定義に固有のロジックとBaseIndexerの検索機能を組み合わせたものです。詳細は、 BaseIndexer.java を参照してください。

"excludedCPDefinitionId"属性の値として商品定義のIDをSearchContextに追加します。 これにより、結果から元の商品が除外されます。 この例では、検索する商品名の最後の単語も指定しています。 詳細は、この例では、M5X7CPDataSource.java ファイルの_getLastWordOfNameメソッドの検索ロジックの実行を参照してください。

言語キーをLanguage.propertiesに追加する

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

products-ending-in-the-same-word=Products Ending in the Same Word

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

まとめ

これで、 CPDataSourceインターフェイスを実装するための基本を理解し、Liferay Commerceに新しい商品データソースを追加しました。