商品パブリッシャーウィジェット用の新しい商品データソースを追加する
このチュートリアルでは、 CPDataSource インターフェイスを実装して新しい製品データ ソースを追加する方法を説明します。
商品データソースは、関連する商品を検索する独自の方法を提供します。 Liferay Commerceは、すぐに使用できる製品データソースをいくつか提供しており、その中には、製品関係 による や、カテゴリによる の検索が含まれます。

概要
サンプルをデプロイする
このセクションでは、Liferay Commerce のインスタンスでサンプルの製品データ ソースを起動して実行します。
新しい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 製品データ ソースをダウンロードして解凍します。
curl https://resources.learn.liferay.com/commerce/latest/en/developer-guide/content/liferay-m5x7.zip -Ounzip liferay-m5x7.zip -
サンプルをビルドしてデプロイします。
./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされたjarをDockerコンテナ上の
/opt/liferay/osgi/modulesにコピーするのと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.acme.m5x7.impl_1.0.0 -
サンプルの商品データソースが追加されたことを確認します。 ブラウザーで
https://localhost:8080を開き、商品パブリッシャーウィジェットのあるページに移動します。 製品パブリッシャーの 構成 をクリックし、 製品選択 セクションの データ ソース を選択します。 新しい製品データ ソース (「同じ単語で終わる製品」) が、下の データ ソース ドロップダウンの下に表示されます。

これで、CPDataSourceを実装する新しい商品データソースのビルドとデプロイが完了しました。
次に、詳細をさらに詳しく見ていきましょう。
サンプルの説明
このセクションでは、デプロイした例を確認します。 まず、OSGi 登録用のクラスにアノテーションを付けます。 次に、 CPDataSource インターフェースを確認します。 3 番目に、 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);
このメソッドは、製品データ ソースが関連製品を検索する方法を説明するテキスト ラベルを返します。 言語キーを使用してラベルを取得する際のリファレンスについては、 liferay-m5x7.zip/m5x7-impl/src/main/java/com/acme/m5x7/internal/commerce/product/data/source の 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, Serializableput(
Field.STATUS, WorkflowConstants.TATUS_APPROVED
).put(
"excludedCPDefinitionId",
cpCatalogEntry.getCPDefinitionId()
).build());
setCompanyId(_portal.getCompanyId(httpServletRequest));
setKeywords(
StringPool.STAR + _getLastWordOfName(cpCatalogEntry));
}
},
new CPQuery(), start, end);
}
検索を実行するには、 CPDefinitionHelper を使用します。 CPDefinitionHelper は、製品定義に固有のロジックと BaseIndexerの検索機能を組み合わせます。詳細については、 BaseIndexer.java を参照してください。
製品定義の ID を "excludedCPDefinitionId" 属性の値として SearchContextに追加します。 これにより、結果から元の製品が省略されます。 この例では、検索する商品名の最後の単語も指定しています。 詳細は、この例では、M5X7CPDataSource.java
ファイルの_getLastWordOfNameメソッドの検索ロジックの実行を参照してください。
言語キーをLanguage.propertiesに追加する
モジュール内の liferay-m5x7.zip/m5x7-impl/src/main/resources/content にある Language.properties ファイルに言語キーとその値を追加します。
products-ending-in-the-same-word=Products Ending in the Same Word
詳細については、「 アプリケーションのローカライズ 」を参照してください。
さいごに
これで、CPDataSourceインターフェイスを実装するための基本を理解し、Liferay Commerceに新しい商品データソースを追加しました。