---
title: "レイアウトサービスのレンダリング出力のカスタマイズ"
slug: "customizing-the-layout-service-rendering-output"
abstract: "GraphQLクエリやRendering Contents Resolverを使ってレイアウトサービスの出力を調整する方法"
---
# レイアウトサービスのレンダリング出力のカスタマイズ

レンダリングをJSONにシリアライズする際、レイアウトサービスはレンダリングの内容にレンダリングのデータソース項目のフィールドを入力します。

時には、出力に以下のような他の種類のデータを含めることもあります。

-   コンテキストアイテムからのデータ。
-   データソースまたはコンテキストアイテムの子からのデータ。
-   他のアイテムからのデータも含めて。
-   不要なデータの過剰取得を避けるため、前述のデータの種類をより限定的に見ることができます。
-   計算された値、あるいはより複雑な値です。
-   xDBからの情報など、アイテム以外のデータ。
-   外部システムからの非Sitecoreデータ。

以下のセクションでは、レイアウトサービスから返されるレンダリング出力のカスタマイズオプションの一部について説明します。

## GraphQL APIの利用

Sitecoreレンダリングのレイアウトサービスの出力は、レンダリング時にGraphQLクエリを設定することでカスタマイズできます。JSSでは、この技術は [統合型GraphQL](https://doc.sitecore.com/xp/ja/developers/hd/19/sitecore-headless-development/integrated-graphql-in-jss-apps.html "Integrated GraphQL in JSS apps")と呼ばれます。クエリはLayout Serviceリクエスト中、またはExperience Edgeを使用している場合は公開時にサーバー側で実行されます。

Sitecoreレイアウトサービスがページをレンダリングすると、ページのレイアウトと各レンダリング/コンポーネントのデータを含むJSON表現を返します。通常、レンダリング/コンポーネントデータはSitecoreのデータソース項目のフィールドの集合です。Integrated GraphQLを使えば、これをGraphQLクエリ結果に再構成できます。

このテクニックを使うには、以下が必要です:

-   クエリしたいスキーマを持つ[Sitecore GraphQLエンドポイント](https://doc.sitecore.com/xp/ja/developers/hd/19/sitecore-headless-development/start-using-sitecore-graphql-api.html#UUID-c479471f-7d88-620c-8df9-bd308d88dfb4_section-idm45126077390160 "Configure a GraphQL endpoint") を定義します。
    
-   アプリケーションをエンドポイントに設定してください。例えば:
    
    <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は、コンポーネントのレンダリングアイテムの**Component GraphQL Query**フィールドにGraphQLクエリを保存することで動作します。例えば、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エンドポイントに対して処理中のものに対して実行されます。その結果は、返される通常のレンダリングフィールド値を置き換えます。

## 組み込みのレンダリングコンテンツリゾルバの選択または設定

Headless Servicesでは、各レンダリングに*Rendering Contents Resolver*を設定し、レンダリングおよび関連データのシリアライズ方法を決定できます。レンダリング内容リゾルバは */sitecore/system/Modules/Layout Service/Rendering Contents Resolvers*で設定されています。デフォルトでは、Headless Servicesは以下のリソルバーを提供します:

-   *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、自分で実装を作っている場合を除きます。
    
-   *メディアURLにサーバーURLを含めてください* 。 *Integrated*モードでJSSを使ったフロントエンドアプリを動かさない限り、このフィールドは必ず確認してください。
    
-   *Use Context Item* - データソース項目の代わりにコンテキスト項目を使用すること。
    
-   *Item Selector Query* - シリアライズされた項目をカスタマイズするためのSitecoreクエリを提供する。これは上記の選択に応じて、データソースおよび/またはコンテキスト項目に対して相対的である必要があります。
    
    > !重要このパラメータを使う際は、パフォーマンスに大きな悪影響を及ぼすSitecoreクエリを簡単に作成できることに注意してください。
    
-   *Parameters* - 任意のパラメータを提供する。これらはデフォルトでは使われませんが、自らの実装を作成する際には有用です。
    

Rendering Contexts Resolverを使うには、適用するコンポーネントを参照するレンダリングアイテムのRendering Contents Resolverフィールドで設定する必要があります。例として、SitecoreフォームをJSSと統合する際のフォームレンダリング用リゾルバを設定する [このウォークスルー](https://doc.sitecore.com/xp/ja/developers/hd/19/sitecore-headless-development/walkthrough--using-a-sitecore-form-in-jss-applications.html "Walkthrough: Using a Sitecore form in JSS applications") を参照してください。

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

レイアウトサービスでは、IRenderingContentsResolverインターフェースの助けを借りて、シリアライズされたレンダリングの内容を完全にカスタマイズできます。

> !重要可能な限り、今後の互換性のために、以前のノーコードオプションのいずれかを使うことをお勧めします。

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

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エディタ向けにアイテムフィールドのレンダリングを有効にする](https://github.com/Sitecore/Helix.Examples/blob/master/examples/helix-basic-aspnetcore/src/Feature/Products/platform/LayoutService/ProductListContentsResolver.cs)ことができます。

## 統合型GraphQLクエリを別個のRESTエンドポイントではなく使用する利点

上記のシナリオのいくつかでは、必要なデータにアクセスするために別のRESTエンドポイントを作成するという別のアプローチもあります。しかし、前述の手法はRESTエンドポイントを使うことと比べていくつかの利点があります。例えば:

-   追加のHTTP往復はありません。
-   データをコンポーネントに自動バインディングします。
-   データはサーバー/ユニバーサルレンダリング用に利用可能です。
-   現在のアプリケーション、コンテキスト項目(ルート)、またはデータソース項目に関連する追加データのクエリが容易になります。

> !注統合されたGraphQLクエリの使用と [、レイアウトサービスが返すコンテキストデータの拡張](https://doc.sitecore.com/xp/ja/developers/hd/19/sitecore-headless-development/extending-context-data-returned-by-the-layout-service.html "Extending context data returned by the Layout Service")には、いくつかのユースケースが重複しています。
> 
> 統合されたGraphQLクエリは、コンテンツ作成者がルート内でそのレンダリングを利用したときにのみ、データが利用可能であることを保証します。
> 
> レイアウトサービスが戻すコンテキストデータの拡張は、一般的に複数のコンポーネントで使用される情報や、Placeholder内で管理されない静的配置コンポーネントのデータ提供を目的としています。