1. 行政

プログラムによるカタログ・データのインポート

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

ほとんどのSitecore Experience Commerce実装には、プログラムによってカタログ データをインポートするための要件があります。カタログ データをインポートするためのカスタマイズを作成する際には、データの量、インポート操作の頻度、外部の製品情報管理システムとの統合を作成するかどうか、インポート操作がどこからトリガーされるかに応じて、さまざまなアプローチを取ることができます。

このトピックでは、Sitecore.Commerce.Engine.SDKで提供されているサンプルの一部を活用して、次の操作を行う方法について説明します。

  • Webクライアントによってトリガーされるカスタム カタログのインポート操作をHTTP要求で作成します。

  • カタログのインポート操作をカスタムCommerce Engineプラグインに追加します。

Webクライアントによってトリガーされるカスタムカタログインポートの作成

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 Engineをカスタマイズできます (たとえば、スケジュールされたカタログ インポート ルーチンを実行します)。

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コンテンツ エディターを使用してCommerceアイテムを公開することはできません。

Plugin.Sample.AdventureWorksプラグインとPlugin.Sample.Habitatプラグインは、InitalizeCatalogBlockを実行する前にInitializeEnvironmentパイプラインを呼び出すように構成されています。既定の動作の一部として、InitializeEnvironmentパイプラインは、インポートされたカタログ項目を発行するAutoApprovePolicyを追加および設定します。カスタムプラグインが同じロジック(サンプルプラグインConfigure.Sitecore.csファイルで定義)を使用し、ストアフロントでアイテムを公開せずにカタログをインポートする場合は、InitializeCatalogBlockブロックにコード行を追加して、AutoApprovePolicyを明示的に削除する必要があります。これは、最初に実行されるInitializeEnvironmentが既にAutoApprovePolicyを追加して設定しているためです。

カタログをストアフロントに公開せずにインポートするには、次の例に示すように、自動承認ポリシーを削除するステートメントを追加してInitializeCatalogBlockを変更し、それを有効または無効にする2つのステートメントをコメントアウトします。

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));
この記事を改善するための提案がある場合は、 お知らせください!