今回は Sitecore XM / XM Cloud で提供している便利な機能、Rendering Contents Resolvers について取り上げます。レンダリングの定義で複数の定義が用意されており、これを活用することで効率よくコンポーネントを作成することができます。
レイアウトサービスからデータを取得する
コンポーネントが Sitecore のアイテムからデータを取得する方法としては、以前パンくずリストの時に GraphQL を利用してデータを取得しました。
これ以外に用意されている方法として、組み込まれている Rendering Contents Resolver を利用する、もしくはカスタマイズしたものを組み込むことができます。カスタマイズに関しては、以下のページをご覧ください。
この設定は Rendering の定義の Layout Service の中に含まれています。
今回は組み込まれている Rendering Contents Resolver の動きとして子アイテムを利用するDatasource Item Children Resolver の動作を確認をしたいと思います。
サンプルのコンポーネントを作成する
検証をするためのベースのコンポーネントのコードを準備します。まず、テンプレートとしては heading および content (どちらも Single-Line Text )を定義します。
続いて、テンプレートを利用してデータとしてアイテムを作成しておきます。
最後にこのコンポーネントのコードを以下のように設定します。
import React from 'react';
import { ComponentParams, Field, RichText } from '@sitecore-jss/sitecore-jss-nextjs';
import { ComponentProps } from 'lib/component-props';
interface ContentBlockFields {
heading: Field<string>;
content: Field<string>;
}
interface TestComponentProps extends ComponentProps {
fields: ContentBlockFields;
params: ComponentParams;
}
export const Default = (props: TestComponentProps): JSX.Element => {
const id = props.params.RenderingIdentifier;
return (
<div className={`component ${props.params.styles}`} id={id ? id : undefined}>
<div className="component-content">
Heading - <RichText field={props.fields.heading} />
Content - <RichText field={props.fields.content} />
</div>
</div>
);
};
以下のようにサンプルが動くようになりました。
Datasource Item Children Resolver
これは指定したアイテムの下にあるアイテムからデータを取得することができる Resolver になります。実際にサンプルのコードを用意していきます。まずは、テストコンポーネントの Resolver を以下のように指定します。
続いてアイテムを用意していきます。今回は 3 つのアイテムを用意しました。
続いてコンポーネントのコードを書き換えていきます。以下のように一気に書き換えました。
import React from 'react';
import { ComponentParams, TextField } from '@sitecore-jss/sitecore-jss-nextjs';
import { ComponentProps } from 'lib/component-props';
interface PageItemFields {
displayName: string;
fields: {
Title: TextField;
};
}
interface TestComponentProps extends ComponentProps {
fields: {
items: PageItemFields[];
};
params: ComponentParams;
}
export const Default = (props: TestComponentProps): JSX.Element => {
const id = props.params.RenderingIdentifier;
return (
<div className={`component ${props.params.styles}`} id={id ? id : undefined}>
<div className="component-content">
<ul>
{props.fields.items.map((item, index) => (
<li key={index}>{item.fields.Title.value}</li>
))}
</ul>
</div>
</div>
);
};
この変更で、以下のように子アイテムのタイトルを一覧で表示しています。
1つ追加すると、きちんと追加されていることを確認できます。
まとめ
子アイテムを利用してコンポーネントでレンダリングする方法を今回は確認しました。次回は、この仕組みを利用したコンポーネントを作成したいと思います。