1. レイアウトサービスの拡張

レイアウト・サービスのレンダリング出力のカスタマイズ

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

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

レンダリングをJSONにシリアル化する場合、レイアウト サービスはレンダリングの内容にレンダリングのデータ ソース アイテムのフィールドを入力します。

場合によっては、次のような他の種類のデータを出力に含める必要があります。

  • コンテキスト項目からのデータ。

  • データソースまたはコンテキストアイテムの子からのデータ。

  • 他のアイテムからのデータ。

  • 前述のデータの種類をより限定して表示し、不要なデータを過度にフェッチしないようにします。

  • 計算された値またはより複雑な値。

  • xDBからの情報などの非アイテム データ。

  • 外部システムからのSitecore以外のデータ。

次のセクションでは、レイアウト サービスによって返されるレンダリング出力をカスタマイズするためのいくつかのオプションについて説明します。

GraphQL APIの使用

Sitecoreレンダリングのレイアウト サービス出力をカスタマイズするには、レンダリングでGraphQLクエリを設定します。JSSでは、この手法を 統合GraphQLと呼びます。クエリは、レイアウトサービスリクエスト中、またはExperience Edgeを使用している場合は公開時にサーバー側で実行されます。

Sitecoreレイアウト サービスがページをレンダリングすると、ページのレイアウトのJSON表現と各レンダリング/コンポーネントのデータが返されます。通常、レンダリング/コンポーネント データは、Sitecoreデータソース アイテムのフィールドのセットです。統合されたGraphQLを使用すると、これをGraphQLクエリ結果に形を変えることができます。

この手法を使用するには、次のことを行う必要があります。

  • クエリするスキーマを持つSitecore GraphQLエンドポイント を定義します。

  • エンドポイントを使用するようにアプリケーションを設定します。例えば:

    <configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
      <sitecore>
        <javaScriptServices>
          <apps>
            <!-- you may override other attributes from 'defaults' in the app definition below -->
            <app name="JssBasicAppGraphQL"
                 graphQLEndpoint="/sitecore/api/jssbasicappgraphql"
                 inherits="defaults"
            />
          </apps>
        </javaScriptServices>
      </sitecore>
    </configuration>

統合されたGraphQLは、GraphQLクエリをコンポーネントのレンダリングアイテムのComponent GraphQL Queryフィールドに格納することで動作します。たとえば、GraphQLサンプル アプリでは、/sitecore/layout/Renderings/JssBasicAppGraphQL/IntegratedPageに対してクエリを設定します。例えば:

query IntegratedPageQuery(
  $datasource: String!
  $language: String!
  $contextItem: String!
) {
  datasource: item(path: $datasource, language: $language) {
    ... on IntegratedPage {
      title {
        jsonValue
      }
      text {
        jsonValue
      }
      logoImage {
        jsonValue
      }
    }
  }

  contextItem: item(path: $contextItem, language: $language) {
    id
    children(hasLayout: true) {
      results {
        displayName
        url {
          url
        }
      }
    }
  }
}
    
メモ

defaultおよびjssレイアウト サービス構成では、$datasource $contextItem、および$languageの値が自動的に挿入されます。

Sitecoreがレイアウト リクエストを受信すると、コンポーネントが空でないGraphQLクエリを定義している場合、クエリはアプリに設定されたGraphQLエンドポイントに対してインプロセスで実行されます。結果は、返される通常のレンダリング フィールド値を置き換えます。

組み込みのレンダリング コンテンツ リゾルバーの選択または構成

ヘッドレス サービスでは、レンダリングごとにRendering Contents Resolverを設定して、レンダリングとそれに関連するデータのシリアル化方法を決定できます。レンダリング コンテンツ リゾルバは /sitecore/system/Modules/Layout Service/Rendering Contents Resolvers.デフォルトでは、ヘッドレスサービスは次のリゾルバーを提供します。

  • Datasource Resolver - デフォルトの動作。レンダリングのデータソース項目をシリアル化します。

  • Datasource Item Children Resolver - データソース項目の子をシリアル化します。

  • Context Item Resolver - データソースアイテムの代わりにコンテキストアイテムをシリアル化します。

  • Context Item Children Resolver - コンテキスト項目の子をシリアル化します。

  • Folder Filter Resolver - データソース項目の子孫をシリアル化します (フォルダーを除く)。

Rendering Contents Resolversフォルダに独自の設定を作成するには、次の使用可能なパラメータを使用します。

  • Type - これは、独自の実装を作成している場合を除き、Sitecore.LayoutService.ItemRendering.ContentsResolvers.RenderingContentsResolver, Sitecore.LayoutServiceです。

  • Include Server URL in Media URLs - JSSでビルドされたフロントエンドアプリをIntegratedモードで実行している場合を除き、常にこのフィールドをオンにします。

  • Use Context Item - データソースアイテムの代わりにコンテキストアイテムを使用します。

  • Item Selector Query - シリアル化されたアイテムをカスタマイズするためのSitecoreクエリを提供します。これは、上記の選択に応じて、データソースやコンテキストアイテムに対して相対的である必要があります。

    大事な

    このパラメーターを使用するときは、パフォーマンスに深刻な悪影響を与えるSitecoreクエリを簡単に作成できることに注意してください。

  • Parameters - 任意のパラメータを指定します。これらはデフォルトでは使用されませんが、独自の実装を作成する際に役立つ可能性があります。

レンダリング コンテキスト リゾルバを使用するには、適用先のコンポーネントを参照するレンダリング アイテムのRendering Contents Resolverフィールドで設定する必要があります。例については、Sitecore FormsをJSSと統合するときにFormレンダリングのリゾルバーを設定する このチュートリアル を参照してください。

IRenderingContentsResolverインターフェイスの作成

レイアウト サービスでは、IRenderingContentsResolverインターフェイスを使用して、シリアル化されたレンダリングの内容を完全にカスタマイズできます。

大事な

可能な限り、将来の互換性のために、以前のノーコードオプションのいずれかを使用することをお勧めします。

レンダリングのデフォルトのIRenderingContentsResolverインタフェースをオーバーライドするには、独自の実装を作成し、Rendering Contents Resolverアイテムを作成してカスタムTypeを指定します。例えば:

public class ExampleRenderingContentsResolver : Sitecore.LayoutService.ItemRendering.ContentsResolvers.IRenderingContentsResolver
{
    public bool IncludeServerUrlInMediaUrls { get; set; }
    public bool UseContextItem { get; set; }
    public string ItemSelectorQuery { get; set; }
    public NameValueCollection Parameters { get; set; }

    public object ResolveContents(Rendering rendering, IRenderingConfiguration renderingConfig)
    {
        //if you want to access the datasource item
        var datasource = !string.IsNullOrEmpty(rendering.DataSource)
            ? rendering.RenderingItem?.Database.GetItem(rendering.DataSource)
            : null;

        return new
        {
            name = datasource.Name,
            date = DateTime.Now,
            hello = "world"
        };
    }
}

実装によって返されたオブジェクトのフィールドは、アイテムコンテンツであるかのようにフロントエンドコンポーネントにバインドできます(たとえば、Reactのprops )。

先端

Sitecore.LayoutService.ItemRendering.ContentsResolvers.RenderingContentsResolverクラスを拡張し、クラスのProcessItemメソッドを使用して、高度なSitecoreエディターのアイテム フィールドのレンダリングを有効にすることができます。

個別のRESTエンドポイントの代わりに統合されたGraphQLクエリを使用する利点

上記の一部のシナリオでは、必要なデータにアクセスするために別のRESTエンドポイントを作成することが別の方法になる場合があります。ただし、前述の手法には、RESTエンドポイントを使用する場合と比較して、次のようないくつかの利点があります。

  • 追加のHTTPラウンドトリップはありません。

  • コンポーネントへのデータの自動バインド。

  • データはサーバー/ユニバーサルレンダリングに使用できます。

  • 現在のアプリケーション、コンテキストアイテム(ルート)、またはデータソースアイテムに関連する追加データのクエリが容易になります。

手記

統合されたGraphQLクエリの使用と 、Layout Serviceによって返されるコンテキストデータの拡張との間には、潜在的なユースケースで重複する部分があります。

統合されたGraphQLクエリにより、コンテンツ作成者がルート内でそのレンダリングを利用する場合にのみ、データが使用可能になります。

レイアウト サービスによって返されるコンテキスト データの拡張は、通常、複数のコンポーネントで使用される可能性のある情報、またはPlaceholder内で管理されていない静的に配置されたコンポーネントのデータを提供することを目的としています。

この記事を改善するための提案がある場合は、 お知らせください!