カタログデータのプログラム的インポート
このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。
ほとんどのSitecore Experience Commerce実装では、カタログデータをプログラム的にインポートする要件があります。カタログデータのインポートカスタマイズを作成する際には、データの量、インポート操作の頻度、外部製品情報管理システムとの連携の有無、インポート操作のトリガー先などに応じて異なるアプローチを取ることができます。
このトピックでは、Sitecore.Commerce.Engine.SDKで提供されているサンプルの一部をどのように活用して以下のようなことができるかに焦点を当てています。
- ウェブクライアントによってHTTPリクエストでトリガーされるカスタムカタログインポート操作を作成します。
- カスタムCommerce Engineプラグインにカタログインポート操作を追加してください。
ウェブクライアントによってトリガーされるカスタムカタログインポートの作成
Sitecore.Commerce.Engine.SDKには、RunImportという名前のサンプル静的ヘルパーメソッドを定義したSitecore.Commerce.Sample.Consoleアプリケーションが含まれています。このRunImportメソッドを使ってHTTPリクエストを通じてカタログインポートをトリガーできます。箱から出してみると、このメソッドはPostmanでInitialize Environmentサンプルリクエストを実行するときに呼び出されます。
RunImportメソッドを含むコンソールアプリケーション拡張ファイルへのパスは以下の通りです:
Sitecore.Commerce.Engine.SDK.*.*.**\src\Sitecore.Commerce.Sample.Console\Extensions\EngineExtensions.cs
サンプルRunImportメソッドはカタログをインポートし、カタログエンティティもデフォルトで公開します。しかし、カタログをコンテンツを公開せずにインポートしたい場合は、公開オプションをブールでパラメータ化した以下のコード例を使用できます。
private static async Task RunImport( string filePath, string mode, string importMethodName, bool publish, params string allowedErrorTerms) { using (new SampleMethodScope()) { File.Exists(filePath).Should().BeTrue(); using (var importStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { using (var hc = CreateHttpClientAuthoring()) { using (var importContent = new MultipartFormDataContent()) { importContent.Add(new StreamContent(importStream), "importFile", filePath); importContent.Add(new StringContent(mode), "mode"); importContent.Add(new StringContent("0"), "errorThreshold"); importContent.Add(new StringContent(publish ? "true" : "false"), "publish");
var importResponse = await hc.PostAsync( $"{Program.ShopsServiceUri}{importMethodName}()", importContent); importResponse.IsSuccessStatusCode.Should().BeTrue(); var importResponseText = await importResponse.Content.ReadAsStringAsync(); var importCommand = JsonConvert.DeserializeObject<CommerceOps.Sitecore.Commerce.Core.Commands.CommerceCommand>(importResponseText); importCommand.WaitUntilCompletion(allowedErrorTerms); } } } } }
!注未公開状態でカタログエンティティをインポートすると、Business Toolsユーザーは各エンティティを承認ワークフローに通してストアフロントに公開しなければなりません。コンテンツエディターを使ってCommerceアイテムを公開することはできません。
Commerce Engineでトリガーされるカスタムカタログインポートの作成
一部の商取引実装では、Commerce Engineがインポート操作をトリガーする必要があります。カタログデータインポート操作を処理するために、Commerceエンジンをカスタマイズする独自のプラグインを作成することもできます。例えば、スケジュールされたカタログインポートルーチンを実行する場合などです。
Sitecore.Commerce.Engine.SDKには、カスタムカタログインポートプラグインの良い出発点となる2つのサンプルカタログ管理プラグイン、Plugin.Sample.AdventureWorksプラグインとPlugin.Sample.Habitatプラグインが含まれています。
これらのサンプルプラグインでは、InitializeCatalogBlockクラスがカタログインポートプロセスを定義します。このサンプルクラスはカスタムカタログ管理プラグインでインポート機能を扱うために使用できます。サンプルHabitatカタログプラグインのこのパイプラインブロックへの完全なパスは以下の通りです:
Sitecore.Commerce.Engine.SDK.*.*.**/src/Plugin.Sample.Habitat/Pipelines/Blocks/InitializeCatalogBlock.cs
以下の例に示されているサンプルInitializeCatalogBlockブロックは、AutoApprovePolicyポリシーを設定し、インポートされたエンティティを自動的にストアフロントに公開します。
protected virtual async Task ImportCatalogAsync(CommercePipelineExecutionContext context) { using (var stream = new FileStream(GetPath("Habitat.zip"), FileMode.Open, FileAccess.Read)) { var file = new FormFile(stream, 0, stream.Length, stream.Name, stream.Name); var contextOptions = context.CommerceContext.PipelineContextOptions; var argument = new ImportCatalogsArgument(file, CatalogConstants.Replace) { BatchSize = -1, ErrorThreshold = 10 }; context.CommerceContext.Environment.SetPolicy(new AutoApprovePolicy()); await _importCatalogsPipeline.RunAsync(argument, contextOptions).ConfigureAwait(false); context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy)); } } private string GetPath(string fileName) { return Path.Combine(_hostingEnvironment.WebRootPath, "data", "Catalogs", fileName); }
カスタムカタログインポート操作は、ポリシーキーをプログラム的に渡すことで最適化できますCommerceCommerce.Headers。
公開せずにカタログアイテムをインポートする方法
場合によっては、ストアフロントにアイテムを自動公開せずにカタログデータをインポートしたい場合もあります。サンプルプラグインのInitializeCatalogBlockを変更することでこれが可能です。
!注未公開状態でカタログエンティティをインポートする場合( AutoApprovePolicyポリシーなし)、Business Toolsユーザーはインポートしたエンティティを パブリッシング ワークフローに通して公開しなければなりません。Sitecoreコンテンツエディターを使ってコマースアイテムを公開することはできません。
Plugin.Sample.AdventureWorksとPlugin.Sample.Habitatプラグインは、InitalizeCatalogBlockを実行する前にInitializeEnvironmentパイプラインを呼び出すように設定されています。InitializeEnvironmentパイプラインはデフォルトの動作の一部として、インポートしたカタログアイテムを公開するよう追加・設定AutoApprovePolicyを設定します。カスタムプラグインが同じロジック(サンプルプラグインConfigure.Sitecore.csファイルで定義されている)を使っていて、ストアフロントに公開せずにカタログをインポートしたい場合、InitializeCatalogBlockブロックに追加のコードを追加して明示的にAutoApprovePolicyを削除する必要があります。これは、最初に動作するInitializeEnvironmentがすでに追加・設定AutoApprovePolicyを設定しているため、必要です。
ストアフロントに公開せずにカタログをインポートするには、自動承認ポリシーを解除する文を追加し、それを有効と無効にする2つの文をコメントアウトしてInitializeCatalogBlockを変更してください。以下の例のように:
context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy)); //context.CommerceContext.Environment.SetPolicy(new AutoApprovePolicy()); await _importCatalogsPipeline.RunAsync(argument, contextOptions).ConfigureAwait(false); //context.CommerceContext.Environment.RemovePolicy(typeof(AutoApprovePolicy));