CMS ã§ CEL åŒãæžãããã®å®è·µçãªã¬ã€ãã
CMS ã§ 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 | å 容 | äŸ |
|---|---|---|
documents | CMS ããä»»æã®ããã¥ã¡ã³ããååŸ | 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"
ããŒãžã« /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 ãèšå®ãããŠããå ŽåïŒäŸïŒã«ãŒããã©ã¡ãŒã¿ããŠãŒã¶ãŒèšå®ããïŒãdocuments.get() ã¯ç¿»èš³ãããã³ã³ãã³ããèªåçã«ããŒãžããŸãã
// meta.locale ã "fr" ã®å Žåãè±èªã®ããŒã¹ããã¥ã¡ã³ãã«ãã©ã³ã¹èªã®ç¿»èš³ãããŒãžããã
documents.get("greeting", "welcome").headline
ä»çµã¿ïŒ
meta.locale ã "en" ãŸã㯠"en-US" ã§ãªãå Žåãtranslations ããŒãã«ã§ç¿»èš³ãæ€çŽ¢{ ...baseContent, ...translatedContent }ã€ãŸãã翻蚳æžã¿ãã£ãŒã«ãã¯ããŒã¹ãã£ãŒã«ããäžæžãããæªç¿»èš³ãã£ãŒã«ãã¯ããŒã¹ããã¥ã¡ã³ãã®å€ã䜿ãããŸãã
çŸåšã®ãã±ãŒã«ã«é¢ä¿ãªãç¹å®ã®ç¿»èš³ãååŸããå¿ èŠãããå ŽåïŒ
æ§æïŒ 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
hero-block ããããarticle ããã¥ã¡ã³ããããããã©ã€ã³ã衚瀺ãããšããŸãã
èšäºããã¥ã¡ã³ãïŒèå¥åïŒ"homepage-hero"ïŒïŒ
{
"headline": "ããéãæ§ç¯ããè³¢ãåºè·",
"subheadline": "éçºè
ã®ããã®ã¢ãã³ãª CMS"
}
ããŒããŒãããã¯ã®ã¿ã€ãã«ãã£ãŒã«ãã«èšè¿°ãã CEL ã¹ã¯ãªããïŒ
documents.get("article", "homepage-hero").headline
çµæïŒ ããŒããŒã«ã¯ "ããéãæ§ç¯ããè³¢ãåºè·" ã衚瀺ãããŸãã
/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""ãµãŠãžã¢ã©ãã¢"ãŠãŒã¶ãŒã®ãã±ãŒã«ã«å¿ããŠç°ãªããããã©ã€ã³ã衚瀺ããŸãã
meta.locale == "ar-SA" ? "çããããããã" : "ãããã"
ãã±ãŒã«ã "ar-SA" ã®å ŽåïŒ "çããããããã"
ãã以å€ã®å ŽåïŒ "ãããã"
article ã« countryCode ãã£ãŒã«ãããããå®å
šãªåœåãååŸããããšããŸãã
èšäºããã¥ã¡ã³ãïŒ
{ "headline": "ç±³åœããã®ãã¥ãŒã¹", "countryCode": "us" }
CEL ã¹ã¯ãªããïŒ
documents.get("country", documents.get("article", "us-news").countryCode).name
åäœïŒ
documents.get("article", "us-news") ã { "headline": "ç±³åœããã®ãã¥ãŒã¹", "countryCode": "us" } ãè¿ã.countryCode ã "us" ãæœåºdocuments.get("country", "us") ã { "code": "us", "name": "ã¢ã¡ãªã«åè¡åœ", ... } ãè¿ã.name ã "ã¢ã¡ãªã«åè¡åœ" ãæœåºçµæïŒ "ã¢ã¡ãªã«åè¡åœ"
ããã¥ã¡ã³ããååšããªãå¯èœæ§ãããå Žåããã©ãŒã«ããã¯ãçšæã§ããŸãã
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
: "èè
äžæ"
èšäºã«ã¿ã°ããããç¹å®ã®ã¿ã°ãååšããã確èªããããšããŸãã
"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ïŒã¿ã°ã®æ°ïŒ
ãã©ã¡ããªãã¯ã«ãŒãã¯ãåçã§ããŒã«ã©ã€ãºãããããŒãžãæ§ç¯ããéµã§ãã/{lang}/landingPage ã®ãããªã«ãŒããã¿ãŒã³ãå®çŸ©ãããšãCMS 㯠URL ãããã©ã¡ãŒã¿ãæœåºããmeta.params çµç±ã§å©çšã§ããããã«ããŸãã
ã«ãŒããã¿ãŒã³ã®å®çŸ©ïŒ
ã«ãŒã㯠:paramName ãŸã㯠{paramName} ã®æ§æã䜿çšããŠåçã»ã°ã¡ã³ããå®çŸ©ããŸãã
| Pattern | URL ã®äŸ | æœåºããããã©ã¡ãŒã¿ |
|---|---|---|
/: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 ã«æ¬¡ã®ããšãæç€ºããŸãã
lang ã»ã°ã¡ã³ããæœåºlanguage ã¹ããŒãã«å¯ŸããŠæ€èšŒïŒcontent.code ãäžèŽããããã¥ã¡ã³ããæ€çŽ¢ïŒã«ãŒãèšå®ïŒ
/{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
è§£æ±ºã®æµãïŒ
| URL | meta.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} ã«ãŒãã§ã¯ïŒ
country ãã©ã¡ãŒã¿ã country ã¹ããŒãã§æ€èšŒlang ãã©ã¡ãŒã¿ã language ã¹ããŒãã§æ€èšŒlang ã country.languages[] é
åã«å«ãŸããŠããã確èªïŒéå±€çæ€èšŒïŒ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.params.lang |
| äœçœ®ããŒã¹ã§ã®ã¢ã¯ã»ã¹ | meta.segments[0] |
| ãã¹ã®æ·±ããååŸ | size(meta.segments) |
| ãã¹ã«ç¹å®ã®ã»ã°ã¡ã³ããå«ãŸãããç¢ºèª | "admin" in 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 ãªããžã§ã¯ãã«ã¯ãçŸåšã®ãªã¯ãšã¹ãã«é¢ãããã¹ãŠã®ã³ã³ããã¹ããå«ãŸããŠããŸãã
| Property | å | 説æ | |
|---|---|---|---|
meta.locale | string | çŸåšã®ãã±ãŒã«ã³ãŒãïŒäŸïŒ"en-US", "ko-KR", "ar-SA"ïŒ | |
meta.params | Record<string, string> | URL ãã¿ãŒã³ããæœåºããã«ãŒããã©ã¡ãŒã¿ | |
meta.segments | string[] | URL ãã¹ãã»ã°ã¡ã³ãã«åå²ããé å | |
meta.docId | `string \ | null` | çŸåšã®ããã¥ã¡ã³ã UUIDïŒæ°èŠããã¥ã¡ã³ãã®å Žå㯠nullïŒ |
meta.title | string | çŸåšã®ããã¥ã¡ã³ãã¿ã€ãã« |
ãã±ãŒã«ã³ãŒã㯠BCP 47 圢åŒïŒèšèª-å°åïŒã«åŸããŸãã
// RTL èšèªãã©ããã確èª
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"
// èšèªéšåã®ã¿ãååŸ
meta.locale.split("-")[0] // æªå¯Ÿå¿ - 代ããã« meta.params.lang ã䜿çš
ã«ãŒããã©ã¡ãŒã¿ã¯åžžã«æååã§ãã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)
çã® URL ã»ã°ã¡ã³ããé åã§ååŸïŒ
// ã€ã³ããã¯ã¹ïŒ0 å§ãŸãïŒã§ã¢ã¯ã»ã¹
meta.segments[0] // æåã®ã»ã°ã¡ã³ã
meta.segments[1] // 2 çªç®ã®ã»ã°ã¡ã³ã
// é·ãã確èª
size(meta.segments) // ã»ã°ã¡ã³ãæ°
// å«ãŸããŠããã確èª
"products" in meta.segments // ãã¹ã« "products" ãå«ãŸããŠãããïŒ
çŸåšã®ããã¥ã¡ã³ãã® UUIDãèªå·±åç §ã¹ã¯ãªããã§äŸ¿å©ã§ãã
// æ¢åããã¥ã¡ã³ããç·šéããŠããæã®ã¿å©çšå¯èœ
meta.docId != null ? "editing" : "creating new"
// æ¡ä»¶ä»ãããžãã¯ã§äœ¿çš
meta.docId != null ? documents.get("article", meta.docId).status : "draft"
çŸåšã®ããã¥ã¡ã³ãã¿ã€ãã«ïŒ
// 衚瀺ã«äœ¿çš
"ç·šéäž: " + meta.title
// ã¿ã€ãã«ã«åºã¥ãæ¡ä»¶
meta.title.contains("Draft") ? "äœæ¥äž" : "å
¬éæžã¿"
ã¹ããŒããæ±ºãŸã£ãŠããŠèå¥åã ããåçãªå Žåãããèªã¿ãããæ§æã§ãã
// åŸæ¥ã®ã¢ãããŒã
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.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)
// å°æ¥äºå®ïŒ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"])
ãããã®æ©èœã¯ç»é²æžã¿é¢æ°ã·ã¹ãã ãéããŠè¿œå ãããæ¢åã®ã¹ã¯ãªãããšã®åŸæ¹äºææ§ãç¶æããŸãã
documents. ã meta. ãšå
¥åãããšãå©çšå¯èœãªãªãã·ã§ã³ããšãã£ã¿ãŒã«è¡šç€ºãããŸããdocuments.get("schema", "id") ã§ãã¹ããããã®åŸ .fieldName ã远å ããŸãããã!= null ? ... : ... ã§ãã©ãŒã«ããã¯ã远å ããŸããdocuments.get() ã documents.find() 1 åããšã«ãã§ããæ°ãæ¶è²»ããŸãïŒäžé 50ïŒãhas(meta.params.category) ã確èªããŠããã¢ã¯ã»ã¹ããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãããã¥ã¡ã³ãå士ããªã³ã¯ãããªã¬ãŒã·ã§ãã«ãªã³ã³ãã³ãæ§é ãæ§ç¯ããé«åºŠãªãã¿ãŒã³ãæ±ããŸãã
æãã·ã³ãã«ãªåœ¢ã¯ãäžæ¹ã®ããã¥ã¡ã³ãã仿¹ã®èå¥åãåç §ããã±ãŒã¹ã§ãã
// èšäºãèè
ID ãä¿æããèè
åãååŸ
documents.get("author", documents.get("article", "intro").authorId).name
èå¥åãåçãªå Žåã§ããæ§æãèªã¿ãããã§ããŸãã
// åŸæ¥ã®ã¢ãããŒã
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
ããã¥ã¡ã³ããä»ã®ããã¥ã¡ã³ãã® 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
: "æªåé¡"
ããã¥ã¡ã³ãå士ã 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 ã®å Žå: "$" ãè¿ã
çŸåšã®ããã¥ã¡ã³ãã®å€ã«åºã¥ããŠä»ã®ããã¥ã¡ã³ããåç §ããèšç®ãã£ãŒã«ãã
// 補åããã¥ã¡ã³ãå
ã§ãé¢é£ã«ããŽãªã®è©³çްãååŸ
documents.get("category", doc.categoryId).description
// 補åã®åç£åœã«åºã¥ããé
éæãèšç®
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight
ããã¥ã¡ã³ãå士ãçžäºåç §ãããšãã¯ãã§ããäžéã«æ³šæã
// èšäºã®èè
ãååŸãããã®èè
ã®ä»ã®èšäºãååŸïŒãã§ããæ°ã«æ³šæïŒïŒ
documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })
ãã£ãŒã«ããè€æ°ã®ã¹ããŒããåç §ã§ããå Žåã
// 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 åŒãåè©äŸ¡ããå¿
èŠãããããææ¡ããŸãã
远跡ãããäŸåé¢ä¿ã®äŸïŒ
schema:identifier - ç¹å®ããã¥ã¡ã³ããžã®äŸåschema:identifier - get ãšåãïŒé£éæ§æçµç±ïŒschema:* - ã¹ããŒãå
šäœãžã®äŸåïŒã¹ããŒãå
ã®ä»»æã®ããã¥ã¡ã³ãïŒ// æªãäŸ: åãããã¥ã¡ã³ãã 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
: "èè
äžæ"
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ã/{lang}/landingPage ã§ã¢ã¯ã»ã¹ã§ããå€èšèªã©ã³ãã£ã³ã°ããŒãžãäœæããŸãã
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" }
]
}
åèšèªçšã®ããã¥ã¡ã³ããäœæããŸãã
ããã¥ã¡ã³ã: 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"
}
次ã®èšå®ã§ããŒãžãäœæããŸãã
/{lang}/landingPagelang â language ã³ã³ããŒãã³ã {
"lang": "language"
}
ã«ãŒãã«ããŒããŒãããã¯ã远å ããåãã£ãŒã«ãã«æ¬¡ã® 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
ãã£ãããªãŒã«ã«ãŒãã远å ããŸãã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 })}
/>
);
}
次㮠URL ã蚪ããŠããŒã«ã©ã€ãºãããã³ã³ãã³ãã確èªããŸãã
| URL | æåŸ ããããããã©ã€ã³ |
|---|---|
/ko/landingPage | íì |
/en/landingPage | Welcome |
/ja/landingPage | ããã£ããããŸã |
ãŠãŒã¶ãŒã /ko/landingPage ã蚪ãããšïŒ
/{lang}/landingPage ãã¿ãŒã³ã«äžèŽmeta.params.lang = "ko"language ã¹ããŒãã§ "ko" ãæ€èšŒdocuments.get("greeting", meta.params.lang) ãªã©ã®ã¹ã¯ãªãããéåœèªã³ã³ãã³ãã解決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) ã§ååŸããéã®åªå
é äœïŒ
id ã§ååŸcontent.code ãã£ãŒã«ãããã§ãã¯content.slug ãã£ãŒã«ãããã§ãã¯title ãã£ãŒã«ãããã§ãã¯ããã«ãããä»»æã®äžæãªèå¥åã§æè»ã«ããã¥ã¡ã³ããåç §ã§ããŸãã