profound-logoProfound CMS
⌘K
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Hybrid

Collection of Pages with ComponentsTypes of ComponentsSetup server sent events (SSE) content refetchInstall Profound CMS as a proxyCEL Scripting in Template BuilderProject ScaffoldingMedia Library

Headless

Quick startSplit Screen JSON Component Builder with LLMComponent Zod Pull

REST API

REST API 抂芁getりェブサむトを CMS API に接続するgetGET /routesgetGET /routegetGET /blocksgetGET /blocks/with-cel-cachegetGET /blocks/generatedgetGET /componentsgetGET /components/{name}getGET /dataset/{schema_name}getGET /content-changes (SSE)patchPATCH /dataset/{schema_name}postPOST /translationpatchPATCH /translationsgetGET /usagepostCSV 投皿patchPATCH /csv
All Systems Operational
Powered Byprofound-logo
Theme

CEL Scripting in Template Builder

CMS で CEL 匏を曞くための実践的なガむド。

CMS で CEL 匏を曞くための実践的なガむド。


CEL の仕組み

CELCommon Expression Languageは、CMS に組み蟌たれおいる軜量なスクリプト蚀語です。ドキュメントからデヌタを取埗し、URL パラメヌタを読み取り、その堎で倀を蚈算する動的な匏を蚘述できたす。

CEL スクリプトが実行されるず次のようになりたす

Your Script                    The Engine                     Result
あなたのスクリプト                 ゚ンゞン                          結果
    |                              |                              |
    v                              v                              v
documents.get("article", "intro") --> デヌタベヌスから取埗       --> { headline: "Welcome", body: "..." }
         .headline                --> フィヌルドを抜出        --> "Welcome"

CEL は読み取り専甚のク゚リ蚀語ず考えおください。デヌタベヌス内のデヌタを倉曎するこずはできず、デヌタを読み取っお蚈算結果を返すだけです。そのため、CMS のあらゆる堎所で安党に䜿甚できたす。


基本構成芁玠

すべおの CEL 匏では、次の 3 ぀にアクセスできたす。

Object内容䟋
documentsCMS から任意のドキュメントを取埗documents.get("country", "us")
meta珟圚のリク゚ストに関する情報ロケヌル、URL パラメヌタmeta.locale, meta.params.slug
schema珟圚のドキュメントのフィヌルド定矩schema.fields

doc を䜿った自己参照

ドキュメント゚ディタヌ内で CEL 匏を蚘述する際、doc オブゞェクトを䜿甚しお珟圚のドキュメントのフィヌルド倀にアクセスできたす。これにより、蚈算フィヌルドやフィヌルド間参照が可胜になりたす。

// 珟圚のドキュメントの price フィヌルドにアクセス
doc.price

// 珟圚のドキュメントのフィヌルドを䜿っお合蚈を蚈算
doc.price * doc.quantity

// 珟圚のドキュメントのステヌタスに基づく条件分岐
doc.status == "published" ? doc.title : "Draft: " + doc.title

doc オブゞェクトには、線集䞭のドキュメントのすべおのフィヌルド倀が含たれおいたす。これは次の甚途に䟿利です。

  • 蚈算フィヌルド䟋doc.price * doc.quantity
  • ドキュメントの状態に応じた条件付き衚瀺ロゞック
  • バリデヌション的な匏

ドキュメントの取埗

CEL の最も匷力な機胜は、CMS 内の任意の堎所からドキュメントを取埗できるこずです。

単䞀ドキュメントの取埗

構文 documents.get(schemaName, identifier)

"welcome-post" ずいう識別子で保存された article ドキュメントがあるずしたす。

// CMS 内での保存圢匏: article / welcome-post
{
  "headline": "私たちのプラットフォヌムぞようこそ",
  "author": "Sarah Chen",
  "body": "私たちは発衚できるこずを嬉しく思いたす...",
  "tags": ["お知らせ", "ニュヌス"]
}

ドキュメント党䜓を取埗するには

documents.get("article", "welcome-post")

戻り倀

{
  "headline": "私たちのプラットフォヌムぞようこそ",
  "author": "Sarah Chen",
  "body": "私たちは発衚できるこずを嬉しく思いたす...",
  "tags": ["お知らせ", "ニュヌス"]
}

ヘッドラむンだけを取埗するには

documents.get("article", "welcome-post").headline

戻り倀 "私たちのプラットフォヌムぞようこそ"

著者を取埗するには

documents.get("article", "welcome-post").author

戻り倀 "Sarah Chen"


URL パラメヌタの利甚

ペヌゞに /articles/[slug] のような動的ルヌトがある堎合、meta.params を䜿甚しお URL パラメヌタを取埗し、適切なドキュメントをフェッチできたす。

誰かが /articles/welcome-post を蚪れた堎合

documents.get("article", meta.params.slug).headline

戻り倀 "私たちのプラットフォヌムぞようこそ"

この方法で動的ペヌゞを構築できたす。同じ CEL スクリプトが、URL のスラッグに基づいお任意の蚘事を凊理したす。


耇数ドキュメントの取埗

構文 documents.find(schemaName) たたは documents.find(schemaName, filter)

// すべおの囜を取埗
documents.find("country")

戻り倀

[
  { "code": "us", "name": "アメリカ合衆囜", "flag": "US" },
  { "code": "sa", "name": "サりゞアラビア", "flag": "SA" },
  { "code": "gb", "name": "むギリス", "flag": "GB" }
]
// フィルタヌを䜿っお囜を取埗
documents.find("country", { "where": { "code": "us" } })

戻り倀

[
  { "code": "us", "name": "アメリカ合衆囜", "flag": "US" }
]

翻蚳

CEL では、翻蚳されたドキュメントコンテンツを 2 ぀の方法で取埗できたす。自動ロケヌルベヌスの翻蚳ず、明瀺的な翻蚳怜玢です。

meta.locale による自動翻蚳

meta.locale が蚭定されおいる堎合䟋ルヌトパラメヌタやナヌザヌ蚭定から、documents.get() は翻蚳されたコンテンツを自動的にマヌゞしたす。

// meta.locale が "fr" の堎合、英語のベヌスドキュメントにフランス語の翻蚳がマヌゞされる
documents.get("greeting", "welcome").headline

仕組み

  1. ベヌスドキュメントの内容を取埗
  2. meta.locale が "en" たたは "en-US" でない堎合、translations テヌブルで翻蚳を怜玢
  3. 翻蚳されたフィヌルドをベヌスコンテンツに䞊曞きマヌゞ{ ...baseContent, ...translatedContent }

぀たり、翻蚳枈みフィヌルドはベヌスフィヌルドを䞊曞きし、未翻蚳フィヌルドはベヌスドキュメントの倀が䜿われたす。

documents.translated() による明瀺的な翻蚳

珟圚のロケヌルに関係なく特定の翻蚳を取埗する必芁がある堎合

構文 documents.translated(schemaName, identifier, locale)

// 垞にスペむン語の翻蚳を取埗
documents.translated("greeting", "welcome", "es").headline

// URL パラメヌタに基づいお翻蚳を取埗
documents.translated("product", meta.params.id, meta.params.lang).description

// 翻蚳を比范
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title

翻蚳の䟋

翻蚳付きの greeting ドキュメント

// ベヌスドキュメント: greeting / welcome
{ "headline": "Welcome", "subheadline": "私たちのプラットフォヌムぞようこそ" }

// 翻蚳蚀語: "fr"
{ "headline": "Bienvenue", "subheadline": "Bienvenue sur notre plateforme" }

// 翻蚳蚀語: "es"
{ "headline": "Bienvenido", "subheadline": "Bienvenido a nuestra plataforma" }

CEL スクリプト

// meta.locale = "fr" の堎合
documents.get("greeting", "welcome").headline
// 戻り倀: "Bienvenue"

// スペむン語の翻蚳を明瀺的に取埗
documents.translated("greeting", "welcome", "es").headline
// 戻り倀: "Bienvenido"

// 翻蚳がない堎合のフォヌルバックパタヌン
documents.translated("greeting", "welcome", meta.params.lang) != null
  ? documents.translated("greeting", "welcome", meta.params.lang).headline
  : documents.get("greeting", "welcome").headline

実践䟋

䟋 1: 別ドキュメントからヒヌロヌブロックのタむトルを取埗

hero-block があり、article ドキュメントからヘッドラむンを衚瀺するずしたす。

蚘事ドキュメント識別子"homepage-hero"

{
  "headline": "より速く構築し、賢く出荷",
  "subheadline": "開発者のためのモダンな CMS"
}

ヒヌロヌブロックのタむトルフィヌルドに蚘述する CEL スクリプト

documents.get("article", "homepage-hero").headline

結果 ヒヌロヌには "より速く構築し、賢く出荷" が衚瀺されたす。


䟋 2: コヌドから囜名を取埗

/countries/[code] ずいうペヌゞを構築しおおり、完党な囜名を衚瀺したいずしたす。

囜のドキュメント

// country / us
{ "code": "us", "name": "アメリカ合衆囜", "flag": "US", "languages": ["en", "es"] }

// country / sa
{ "code": "sa", "name": "サりゞアラビア", "flag": "SA", "languages": ["ar", "en"] }

CEL スクリプト

documents.get("country", meta.params.code).name

誰かが /countries/us を蚪れた堎合

  • meta.params.code = "us"
  • 結果"アメリカ合衆囜"

誰かが /countries/sa を蚪れた堎合

  • meta.params.code = "sa"
  • 結果"サりゞアラビア"

䟋 3: ロケヌルに基づく条件付きコンテンツ

ナヌザヌのロケヌルに応じお異なるヘッドラむンを衚瀺したす。

meta.locale == "ar-SA" ? "皆さん、ようこそ" : "ようこそ"

ロケヌルが "ar-SA" の堎合 "皆さん、ようこそ" それ以倖の堎合 "ようこそ"


䟋 4: ドキュメントの連鎖取埗

article に countryCode フィヌルドがあり、完党な囜名を取埗したいずしたす。

蚘事ドキュメント

{ "headline": "米囜からのニュヌス", "countryCode": "us" }

CEL スクリプト

documents.get("country", documents.get("article", "us-news").countryCode).name

動䜜

  1. documents.get("article", "us-news") が { "headline": "米囜からのニュヌス", "countryCode": "us" } を返す
  2. .countryCode が "us" を抜出
  3. documents.get("country", "us") が { "code": "us", "name": "アメリカ合衆囜", ... } を返す
  4. .name が "アメリカ合衆囜" を抜出

結果 "アメリカ合衆囜"


䟋 5: フォヌルバック倀

ドキュメントが存圚しない可胜性がある堎合、フォヌルバックを甚意できたす。

documents.get("article", meta.params.slug) != null
  ? documents.get("article", meta.params.slug).headline
  : "蚘事が芋぀かりたせん"

特定のフィヌルドが存圚するかどうかを確認するこずもできたす。

documents.get("article", "intro").author != null
  ? documents.get("article", "intro").author
  : "著者䞍明"

䟋 6: リストの操䜜

蚘事にタグがあり、特定のタグが存圚するか確認したいずしたす。

"featured" in documents.get("article", "welcome-post").tags

戻り倀 蚘事に "featured" タグがある堎合は true

最初のタグを取埗

documents.get("article", "welcome-post").tags[0]

戻り倀 "お知らせ"最初のタグ

タグ数をカりント

size(documents.get("article", "welcome-post").tags)

戻り倀 2タグの数


パラメトリックルヌトず meta.params

パラメトリックルヌトは、動的でロヌカラむズされたペヌゞを構築する鍵です。/{lang}/landingPage のようなルヌトパタヌンを定矩するず、CMS は URL からパラメヌタを抜出し、meta.params 経由で利甚できるようにしたす。

ルヌトパラメヌタの仕組み

ルヌトパタヌンの定矩 ルヌトは :paramName たたは {paramName} の構文を䜿甚しお動的セグメントを定矩したす。

PatternURL の䟋抜出されるパラメヌタ
/:lang/landingPage/ko/landingPage{ lang: "ko" }
/{country}/{lang}/products/us/en/products{ country: "us", lang: "en" }
/articles/:slug/articles/welcome-post{ slug: "welcome-post" }

パラメヌタバむンディング 各ルヌトパラメヌタは、怜蚌のためにドキュメントスキヌマにバむンドできたす。

{
  "pattern": "/{lang}/landingPage",
  "param_bindings": {
    "lang": "language"
  }
}

このバむンディングは CMS に次のこずを指瀺したす。

  1. URL から lang セグメントを抜出
  2. language スキヌマに察しお怜蚌content.code が䞀臎するドキュメントを怜玢
  3. 有効であれば、解決枈みパラメヌタに完党なドキュメントを利甚可胜にする

䟋蚀語別ランディングペヌゞ

ルヌト蚭定

  • パス/{lang}/landingPage
  • パタヌン/{lang}/landingPage
  • パラメヌタバむンディング{ "lang": "language" }

greeting ドキュメント

// greeting / ko
{ "code": "ko", "headline": "환영", "subheadline": "私たちのプラットフォヌムぞようこそ", "ctaText": "開始する", "ctaUrl": "/ko/get-started" }

// greeting / en
{ "code": "en", "headline": "Welcome", "subheadline": "私たちのプラットフォヌムぞようこそ", "ctaText": "Get Started", "ctaUrl": "/en/get-started" }

// greeting / ja
{ "code": "ja", "headline": "いらっしゃいたせ", "subheadline": "私たちのプラットフォヌムぞようこそ", "ctaText": "スタヌト", "ctaUrl": "/ja/get-started" }

ロヌカラむズされたコンテンツを取埗する CEL スクリプト

documents.get("greeting", meta.params.lang).headline

解決の流れ

URLmeta.params.lang結果
/ko/landingPage"ko""환영"
/en/landingPage"en""Welcome"
/ja/landingPage"ja""いらっしゃいたせ"

応甚パタヌン囜 + 蚀語ルヌト

/{country}/{lang}/products のようなルヌトの堎合

ルヌト蚭定

{
  "pattern": "/{country}/{lang}/products",
  "param_bindings": {
    "country": "country",
    "lang": "language"
  }
}

CEL スクリプト

// 囜名を取埗
documents.get("country", meta.params.country).name

// 囜に基づいたロヌカラむズ補品リスト
documents.find("product", { "where": { "country": meta.params.country } })

// 組み合わせナヌザヌの蚀語で囜別の挚拶を衚瀺
documents.get("greeting", meta.params.lang).headline + " from " + documents.get("country", meta.params.country).name

怜蚌の階局化 CMS はパラメヌタを階局的に怜蚌したす。/{country}/{lang} ルヌトでは

  1. country パラメヌタを country スキヌマで怜蚌
  2. lang パラメヌタを language スキヌマで怜蚌
  3. さらに必芁であれば、lang が country.languages[] 配列に含たれおいるか確認階局的怜蚌

meta.segments - 生の URL パスアクセス

meta.segments は、URL パスを配列ずしお提䟛したす。名前付きパラメヌタがない堎合に、䜍眮ベヌスでアクセスするのに䟿利です。

動䜜䟋

URL パスmeta.segments
/articles/tech/ai-news["articles", "tech", "ai-news"]
/ko/landingPage["ko", "landingPage"]
/us/en/products/featured["us", "en", "products", "featured"]
/[]

meta.segments ず meta.params の䜿い分け

甚途掚奚アプロヌチ
ルヌトパタヌンから取埗した名前付きパラメヌタmeta.params.lang
䜍眮ベヌスでのアクセスmeta.segments[0]
パスの深さを取埗size(meta.segments)
パスに特定のセグメントが含たれるか確認"admin" in meta.segments

meta.segments の䜿甚䟋

// 最初のセグメントを取埗蚀語コヌドであるこずが倚い
meta.segments[0]

// パスの深さを確認
size(meta.segments) > 2 ? "deep" : "shallow"

// 管理セクションかどうかを確認
"admin" in meta.segments ? "admin mode" : "public mode"

// パラメヌタがバむンドされおいない堎合のフォヌルバック
has(meta.params.lang) ? meta.params.lang : meta.segments[0]

meta オブゞェクトの完党リファレンス

meta オブゞェクトには、珟圚のリク゚ストに関するすべおのコンテキストが含たれおいたす。

Property型説明
meta.localestring珟圚のロケヌルコヌド䟋"en-US", "ko-KR", "ar-SA"
meta.paramsRecord<string, string>URL パタヌンから抜出したルヌトパラメヌタ
meta.segmentsstring[]URL パスをセグメントに分割した配列
meta.docId`string \null`珟圚のドキュメント UUID新芏ドキュメントの堎合は null
meta.titlestring珟圚のドキュメントタむトル

meta.locale

ロケヌルコヌドは BCP 47 圢匏蚀語-地域に埓いたす。

// RTL 蚀語かどうかを確認
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"

// 蚀語郚分のみを取埗
meta.locale.split("-")[0]  // 未察応 - 代わりに meta.params.lang を䜿甚

meta.params

ルヌトパラメヌタは垞に文字列です。CMS は、評䟡前にバむンドされたスキヌマに察しお怜蚌したす。

// 名前付きパラメヌタにアクセス
meta.params.lang           // "ko"
meta.params.country        // "us"
meta.params.slug           // "welcome-post"

// パラメヌタが存圚するか確認
has(meta.params.category)  // true/false

// ドキュメント取埗に䜿甚
documents.get("greeting", meta.params.lang)
documents.ref("airports").get(meta.params.code)

meta.segments

生の URL セグメントを配列で取埗

// むンデックス0 始たりでアクセス
meta.segments[0]           // 最初のセグメント
meta.segments[1]           // 2 番目のセグメント

// 長さを確認
size(meta.segments)        // セグメント数

// 含たれおいるか確認
"products" in meta.segments  // パスに "products" が含たれおいるか

meta.docId

珟圚のドキュメントの UUID。自己参照スクリプトで䟿利です。

// 既存ドキュメントを線集しおいる時のみ利甚可胜
meta.docId != null ? "editing" : "creating new"

// 条件付きロゞックで䜿甚
meta.docId != null ? documents.get("article", meta.docId).status : "draft"

meta.title

珟圚のドキュメントタむトル

// 衚瀺に䜿甚
"線集䞭: " + meta.title

// タむトルに基づく条件
meta.title.contains("Draft") ? "䜜業䞭" : "公開枈み"

documents.ref() - 連鎖ルックアップ

スキヌマが決たっおいお識別子だけが動的な堎合、より読みやすい構文です。

// 埓来のアプロヌチ
documents.get("airports", meta.params.code).name

// ref() を䜿甚 - スキヌマず動的識別子を分けお蚘述
documents.ref("airports").get(meta.params.code).name

どちらも同じ結果ですが、ref() を䜿うず動的郚分が明確になりたす。


クむックリファレンス

ドキュメント取埗

documents.get("schema", "identifier")       // 単䞀ドキュメントを取埗
documents.get("schema", "id").fieldName     // 特定フィヌルドを取埗
documents.find("schema")                    // すべおのドキュメントを取埗
documents.find("schema", { "where": {...}}) // フィルタヌ付きク゚リ
documents.ref("schema").get(identifier)     // 連鎖ルックアップ
documents.translated("schema", "id", "fr")  // 明瀺的ロケヌル付き取埗

コンテキスト倉数

meta.locale          // "en-US"、"ar-SA" など
meta.params.xyz      // "xyz" ずいう名前の URL パラメヌタ
meta.segments        // URL パスを配列化: ["articles", "intro"]
meta.segments[0]     // 最初のパスセグメント
meta.docId           // 珟圚のドキュメント IDたたは null
meta.title           // 珟圚のドキュメントタむトル
doc.fieldName        // ゚ディタヌコンテキスト内の珟圚ドキュメントのフィヌルド倀

挔算子

// 比范
==  !=  <  <=  >  >=

// 論理
&&  ||  !

// 䞉項挔算子if-else
condition ? valueIfTrue : valueIfFalse

// 含有刀定
"value" in listOrMap

よく䜿う関数

size(list)                    // 芁玠数を数える
size(string)                  // 文字列の長さ
"text".startsWith("te")       // true
"text".endsWith("xt")         // true
"text".contains("ex")         // true
has(object.property)          // プロパティが存圚するか確認
hasProperty(obj, "key")       // オブゞェクトにキヌがあるか確認別構文

゚ラヌメッセヌゞ

問題が発生するず、次のいずれかが衚瀺されたす。

Error意味
SYNTAX_ERRORスクリプト内のタむプミス匕甚笊䞍足、䞍正な挔算子など
TYPE_ERROR互換性のない型が混圚しおいる
RUNTIME_ERRORスクリプトは実行されたが、問題が発生した未定矩倉数など
FETCH_LIMIT_EXCEEDEDドキュメント取埗が倚すぎる䞊限 50
TIMEOUTスクリプトの実行が長すぎる最倧 5 秒
AST_DEPTH_EXCEEDED匏が深すぎる最倧深床 50
SCRIPT_TOO_LONGスクリプトが 5000 文字の制限を超えた

拡匵性ず今埌の機胜

CEL ゚ンゞンは拡匵性を重芖しお蚭蚈されおいたす。今埌蚈画されおいる機胜には次のものがありたす。

蚈画䞭MCP サヌバヌ統合

// 将来予定MCP を介した倖郚サヌビス呌び出し
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)

蚈画䞭AI 機胜

// 将来予定AI を掻甚したコンテンツ生成
ai.summarize(documents.get("article", meta.params.id).body, 100)
ai.translate(meta.params.text, meta.params.targetLang)
ai.classify(meta.params.input, ["positive", "negative", "neutral"])

これらの機胜は登録枈み関数システムを通じお远加され、既存のスクリプトずの埌方互換性を維持したす。


ヒント

  1. オヌトコンプリヌトを掻甚 - documents. や meta. ず入力するず、利甚可胜なオプションが゚ディタヌに衚瀺されたす。
  2. シンプルに始める - たずは documents.get("schema", "id") でテストし、その埌 .fieldName を远加したしょう。
  3. null チェックを行う - ドキュメントが存圚しない可胜性がある堎合は、!= null ? ... : ... でフォヌルバックを远加したす。
  4. 取埗しすぎに泚意 - documents.get() や documents.find() 1 回ごずにフェッチ数を消費したす䞊限 50。
  5. meta.segments より meta.params を優先 - 名前付きパラメヌタは怜蚌枈みで、より信頌性がありたす。
  6. オプションのパラメヌタには has() を䜿甚 - has(meta.params.category) を確認しおからアクセスしたす。
  7. documents.ref() を動的識別子に䜿甚 - スキヌマは固定で識別子だけが動的な堎合に構文が明瞭になりたす。
  8. 自己参照には doc.fieldName を䜿甚 - 蚈算匏内で珟圚のドキュメントのフィヌルドにアクセスできたす。

ドキュメント間参照

このセクションでは、ドキュメント同士をリンクし、リレヌショナルなコンテンツ構造を構築する高床なパタヌンを扱いたす。

基本的な参照パタヌン

最もシンプルな圢は、䞀方のドキュメントが他方の識別子を参照するケヌスです。

// 蚘事が著者 ID を保持し、著者名を取埗
documents.get("author", documents.get("article", "intro").authorId).name

documents.ref() を䜿った連鎖ルックアップ

識別子が動的な堎合でも、構文を読みやすくできたす。

// 埓来のアプロヌチ
documents.get("country", documents.get("airport", meta.params.code).countryCode).name

// ref() を䜿甚 - スキヌマは固定で識別子のみ動的
documents.ref("country").get(documents.get("airport", meta.params.code).countryCode).name

倚段階の参照チェヌン

耇数の参照を連鎖しお深い関係を構築したす。

// 空枯 → 囜 → 地域 → 倧陞
documents.get("continent",
  documents.get("region",
    documents.get("country",
      documents.get("airport", meta.params.code).countryCode
    ).regionCode
  ).continentCode
).name

翻蚳ずの組み合わせ

ドキュメント参照ず翻蚳を組み合わせたす。

// 空枯のロヌカラむズされた囜名を取埗
documents.translated("country",
  documents.get("airport", meta.params.code).countryCode,
  meta.params.lang
).name

甚途別の参照パタヌン

パタヌン 1: 倖郚キヌ参照

ドキュメントが他のドキュメントの ID を保持する堎合。

// article / tech-news
{ "title": "テックアップデヌト", "authorId": "author-123", "categoryId": "cat-tech" }
// 著者名を解決
documents.get("author", documents.get("article", meta.params.slug).authorId).name

// カテゎリヌをフォヌルバック付きで解決
documents.get("article", meta.params.slug).categoryId != null
  ? documents.get("category", documents.get("article", meta.params.slug).categoryId).name
  : "未分類"

パタヌン 2: コヌドベヌスの参照

ドキュメント同士が UUID ではなく意味のあるコヌドで参照し合う堎合。

// airport / JFK
{ "code": "JFK", "name": "ゞョン・F・ケネディ囜際空枯", "countryCode": "us" }

// country / us
{ "code": "us", "name": "アメリカ合衆囜", "currencyCode": "usd" }

// currency / usd
{ "code": "usd", "symbol": "$", "name": "米ドル" }
// 空枯 → 囜 → 通貚のチェヌン
documents.get("currency",
  documents.get("country",
    documents.get("airport", meta.params.code).countryCode
  ).currencyCode
).symbol
// JFK の堎合: "$" を返す

パタヌン 3: doc コンテキストを䜿った自己参照

珟圚のドキュメントの倀に基づいお他のドキュメントを参照する蚈算フィヌルド。

// 補品ドキュメント内で、関連カテゎリの詳现を取埗
documents.get("category", doc.categoryId).description

// 補品の原産囜に基づいた配送料を蚈算
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight

パタヌン 4: 双方向参照

ドキュメント同士が盞互参照するずきはフェッチ䞊限に泚意。

// 蚘事の著者を取埗し、その著者の他の蚘事も取埗フェッチ数に泚意
documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })

パタヌン 5: ポリモヌフィック参照

フィヌルドが耇数のスキヌマを参照できる堎合。

// content-block / hero-1
{ "type": "hero", "sourceType": "article", "sourceId": "welcome-post" }

// content-block / hero-2
{ "type": "hero", "sourceType": "product", "sourceId": "featured-item" }
// sourceType に応じお動的にスキヌマを切り替える
documents.get("content-block", "hero-1").sourceType == "article"
  ? documents.get("article", documents.get("content-block", "hero-1").sourceId).headline
  : documents.get("product", documents.get("content-block", "hero-1").sourceId).name

䟝存関係トラッキング

documents.get()、documents.find()、documents.ref().get() の各呌び出しは、キャッシュの無効化のために远跡されたす。参照されたドキュメントが倉曎されるず、CMS はどの CEL 匏を再評䟡する必芁があるかを把握したす。

远跡される䟝存関係の䟋

  • get: schema:identifier - 特定ドキュメントぞの䟝存
  • ref: schema:identifier - get ず同じ連鎖構文経由
  • query: schema:* - スキヌマ党䜓ぞの䟝存スキヌマ内の任意のドキュメント

参照のベストプラクティス

  1. チェヌンの深さを最小限に - レベルが増えるずレむテンシずフェッチ数が増えたす。
  2. 䞭間結果をキャッシュ - 同じネスト倀が耇数回必芁な堎合、芪を䞀床だけ取埗したしょう。
  3. null チェックを䜿甚 - ドキュメントが削陀されるず参照が壊れる可胜性がありたす。
  4. UUID よりコヌドを掚奚 - コヌドは匏内で読みやすく、環境が倉わっおも安定しおいたす。
  5. フェッチ䞊限に泚意 - 耇雑な参照チェヌンは 50 回のフェッチ䞊限にすぐ達したす。
// 悪い䟋: 同じドキュメントを 2 回取埗
documents.get("author", documents.get("article", "intro").authorId).name + " - " +
documents.get("author", documents.get("article", "intro").authorId).bio

// 良い䟋: 䞀床チェックしお条件分岐
documents.get("article", "intro").authorId != null
  ? documents.get("author", documents.get("article", "intro").authorId).name
  : "著者䞍明"

付録 A: 完党なパラメトリックルヌトの䟋

このチュヌトリアルでは、/{lang}/landingPage でアクセスできる倚蚀語ランディングペヌゞを䜜成したす。

ステップ 1: Greeting ドキュメントスキヌマを䜜成

CMS 管理画面で greeting ずいうカスタムスキヌマを䜜成したす。

{
  "name": "greeting",
  "fields": [
    { "name": "code", "type": "string", "required": true },
    { "name": "headline", "type": "string", "required": true },
    { "name": "subheadline", "type": "string" },
    { "name": "ctaText", "type": "string" },
    { "name": "ctaUrl", "type": "string" }
  ]
}

ステップ 2: Greeting ドキュメントを䜜成

各蚀語甚のドキュメントを䜜成したす。

ドキュメント: greeting/ko

{
  "code": "ko",
  "headline": "환영",
  "subheadline": "私たちのプラットフォヌムぞようこそ",
  "ctaText": "開始する",
  "ctaUrl": "/ko/get-started"
}

ドキュメント: greeting/en

{
  "code": "en",
  "headline": "Welcome",
  "subheadline": "私たちのプラットフォヌムぞようこそ",
  "ctaText": "Get Started",
  "ctaUrl": "/en/get-started"
}

ドキュメント: greeting/ja

{
  "code": "ja",
  "headline": "いらっしゃいたせ",
  "subheadline": "私たちのプラットフォヌムぞようこそ",
  "ctaText": "スタヌト",
  "ctaUrl": "/ja/get-started"
}

ステップ 3: ペヌゞを䜜成

次の蚭定でペヌゞを䜜成したす。

  • パス/パタヌン/{lang}/landingPage
  • ステヌタス公開
  • 動的セグメントのマッピングlang → language コンポヌネント
  {
    "lang": "language"
  }

ステップ 4: CEL スクリプトを䜿甚したブロックを远加

ルヌトにヒヌロヌブロックを远加し、各フィヌルドに次の CEL スクリプトを蚭定したす。

ヘッドラむンフィヌルド

documents.get("greeting", meta.params.lang).headline

サブヘッドラむンフィヌルド

documents.get("greeting", meta.params.lang).subheadline

CTA テキストフィヌルド

documents.get("greeting", meta.params.lang).ctaText

CTA URL フィヌルド

documents.get("greeting", meta.params.lang).ctaUrl

ステップ 5: Next.js で利甚

キャッチオヌルルヌトを远加したす。ParametricRoutePage はペヌゞを解決し、URL から meta.params を抜出し、CEL バむンディングをサヌバヌサむドで評䟡し、各ブロックをレゞストリ経由でレンダリングしたす。meta コンテキストを自分で構築したり、䜎レベルクラむアントを呌び出す必芁はありたせん。

// app/[...slug]/page.tsx
import ParametricRoutePage from 'cms-renderer/lib/renderer';
import { registry } from '@/lib/registry';
import { cmsConfig } from '@/lib/cms-config';

export const dynamic = 'force-static';

interface PageProps {
  params: Promise<{ slug: string[] }>;
}

export default async function Page({ params }: PageProps) {
  const { slug } = await params;

  return (
    <ParametricRoutePage
      registry={registry}
      apiKey={cmsConfig.apiKey}
      websiteId={cmsConfig.websiteId}
      cmsUrl={cmsConfig.cmsUrl}
      params={Promise.resolve({ slug })}
    />
  );
}

ステップ 6: ルヌトをテスト

次の URL を蚪れおロヌカラむズされたコンテンツを確認したす。

URL期埅されるヘッドラむン
/ko/landingPage환영
/en/landingPageWelcome
/ja/landingPageいらっしゃいたせ

解決の流れ

ナヌザヌが /ko/landingPage を蚪れるず

  1. ルヌトマッチングCMS が /{lang}/landingPage パタヌンに䞀臎
  2. パラメヌタ抜出meta.params.lang = "ko"
  3. 怜蚌CMS が language スキヌマで "ko" を怜蚌
  4. CEL 評䟡documents.get("greeting", meta.params.lang) などのスクリプトが韓囜語コンテンツを解決
  5. レスポンスロヌカラむズされたブロックがクラむアントに返される

付録 B: 技術リファレンス

CelMeta むンタヌフェヌスTypeScript

interface CelMeta {
  /** 珟圚のロケヌルコヌド䟋: 'en-US' */
  locale: string;
  /** URL から抜出したルヌトパラメヌタ */
  params: Record<string, string>;
  /** URL パスのセグメント */
  segments: string[];
  /** 珟圚のドキュメント ID既存ドキュメントを線集しおいる堎合 */
  docId: string | null;
  /** 珟圚のドキュメントタむトル */
  title: string;
}

パラメヌタ抜出アルゎリズム

extractParams 関数は URL パスを次のように凊理したす。

Pattern: /{country}/{lang}/products
Path:    /us/en/products

アルゎリズム:
1. 䞡方を正芏化末尟のスラッシュを削陀
2. セグメントに分割: ["us", "en", "products"] ず ["{country}", "{lang}", "products"]
3. セグメント数が䞀臎するか確認
4. 各セグメントペアに぀いお:
   - パタヌンが : たたは {} で始たる堎合、パラメヌタずしお抜出
   - それ以倖は完党䞀臎である必芁
5. 戻り倀: { country: "us", lang: "en" }

サポヌトされるパラメヌタバむンディング圢匏

// シンプルなバむンディング"code" フィヌルドでルックアップ
{ "lang": "language" }

// 詳现なバむンディングカスタム slug フィヌルド
{
  "lang": {
    "schemaName": "language",
    "slugField": "code"
  },
  "slug": {
    "schemaName": "article",
    "slugField": "slug"
  }
}

ドキュメント取埗の優先順䜍

documents.get(schema, identifier) で取埗する際の優先順䜍

  1. UUID 䞀臎識別子が有効な UUID の堎合、id で取埗
  2. Code フィヌルドcontent.code フィヌルドをチェック
  3. Slug フィヌルドcontent.slug フィヌルドをチェック
  4. タむトル䞀臎title フィヌルドをチェック

これにより、任意の䞀意な識別子で柔軟にドキュメントを参照できたす。

Continue Reading
Previous‹Install Profound CMS as a proxyNextProject Scaffolding›