Gyakorlati útmutató CEL-kifejezések írásához a CMS-ben.
Gyakorlati útmutató CEL-kifejezések írásához a CMS-ben.
A CEL (Common Expression Language) egy könnyű szkriptnyelv, amely be van építve a CMS-ünkbe. Segítségével dinamikus kifejezéseket írhat, amelyek adatokat kérhetnek le dokumentumokból, URL-paramétereket olvashatnak ki, és menet közben értékeket számíthatnak ki.
Ez történik egy CEL-szkript futtatásakor:
A szkriptje A motor Eredmény
| | |
v v v
documents.get("article", "intro") --> Lekérés az adatbázisból --> { headline: "Welcome", body: "..." }
.headline --> A mező kinyerése --> "Welcome"
A CEL-re úgy tekintsen, mint egy csak olvasható lekérdezési nyelvre. Nem módosíthat semmit az adatbázisban – csak adatokat olvas, és kiszámított eredményt ad vissza. Ezért biztonságosan használható a CMS bármely részén.
Minden CEL-kifejezés három dologhoz fér hozzá:
| Objektum | Mi ez? | Példa |
|---|---|---|
documents | Bármely dokumentum lekérése a CMS-ből | documents.get("country", "us") |
meta | Információ az aktuális kérésről (területi beállítás, URL-paraméterek) | meta.locale, meta.params.slug |
schema | Az aktuális dokumentum meződefiníciói | schema.fields |
doc használatávalAmikor dokumentumszerkesztőben ír CEL-kifejezéseket, a doc objektummal elérheti az aktuális dokumentum mezőértékeit. Ez lehetővé teszi a számított mezők és a mezők közötti hivatkozások használatát.
// Az aktuális dokumentum price mezőjének elérése
doc.price
// Összeg kiszámítása az aktuális dokumentum mezőiből
doc.price * doc.quantity
// Feltétel az aktuális dokumentum állapota alapján
doc.status == "published" ? doc.title : "Draft: " + doc.title
A doc objektum a szerkesztett dokumentum összes mezőértékét tartalmazza. Ez hasznos:
doc.price * doc.quantity)A CEL leghasznosabb funkciója, hogy a CMS bármely részéről képes dokumentumokat lekérni.
Szintaxis: documents.get(schemaName, identifier)
Tegyük fel, hogy van egy article dokumentuma "welcome-post" azonosítóval:
// A CMS-ben tárolva: article / welcome-post
{
"headline": "Üdvözöljük platformunkon",
"author": "Sarah Chen",
"body": "Örömmel jelentjük be...",
"tags": ["bejelentés", "hírek"]
}
A teljes dokumentum lekérése:
documents.get("article", "welcome-post")
A fejléc lekérése:
documents.get("article", "welcome-post").headline
Az eredmény: "Üdvözöljük platformunkon"
A szerző lekérése:
documents.get("article", "welcome-post").author
Az eredmény: "Sarah Chen"
Ha az oldala dinamikus útvonalakat használ (például /articles/[slug]), a meta.params segítségével lekérheti az URL-paramétert, majd betöltheti a megfelelő dokumentumot.
Ha valaki meglátogatja a /articles/welcome-post címet:
documents.get("article", meta.params.slug).headline
Az eredmény: "Üdvözöljük platformunkon"
Így készíthet dinamikus oldalakat: ugyanaz a CEL-szkript működik minden cikkhez, mindig az URL-ben szereplő slugot használva.
Szintaxis: documents.find(schemaName) vagy documents.find(schemaName, filter)
// Az összes ország lekérése
documents.find("country")
// Országok lekérése szűrővel
documents.find("country", { "where": { "code": "us" } })
A CEL kétféleképpen támogatja a lefordított dokumentumtartalom lekérését: automatikus, területi beállításon alapuló fordítással és explicit fordításkereséssel.
Ha a meta.locale be van állítva (például útvonalparaméterekből vagy felhasználói beállításokból), a documents.get() automatikusan egyesíti a lefordított tartalmat:
// Ha a meta.locale értéke "fr", a francia fordítást egyesíti az alapdokumentummal
documents.get("greeting", "welcome").headline
Működése:
meta.locale nem "en" vagy "en-US", megkeresi a fordítást a translations táblában{ ...baseContent, ...translatedContent }Ez azt jelenti, hogy a lefordított mezők felülírják az alapmezőket, a le nem fordított mezők pedig az alapdokumentum értékeire állnak vissza.
Ha az aktuális területi beállítástól függetlenül egy adott fordítást szeretne lekérni:
Szintaxis: documents.translated(schemaName, identifier, locale)
// Mindig a spanyol fordítás lekérése
documents.translated("greeting", "welcome", "es").headline
// Fordítás lekérése URL-paraméter alapján
documents.translated("product", meta.params.id, meta.params.lang).description
// Fordítások összehasonlítása
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title
Van egy hero-block blokkja, amelynek egy article dokumentumból származó címsort kell megjelenítenie.
A CEL-szkript a hősszekció címmezőjében:
documents.get("article", "homepage-hero").headline
Eredmény: A hősszekció a "Build Faster, Ship Smarter" szöveget jeleníti meg.
A /countries/[code] oldalon a teljes országnevet szeretné megjeleníteni.
documents.get("country", meta.params.code).name
Ha valaki a /countries/us címet látogatja meg:
meta.params.code = "us""United States"meta.locale == "ar-SA" ? "Üdvözlünk mindenkit" : "Üdvözöljük"
documents.get("country", documents.get("article", "us-news").countryCode).name
A kifejezés először lekéri a cikket, kinyeri a countryCode mezőt, majd lekéri az országot és annak nevét.
Ha előfordulhat, hogy egy dokumentum nem létezik, megadhat tartalékértéket:
documents.get("article", meta.params.slug) != null
? documents.get("article", meta.params.slug).headline
: "A cikk nem található"
"featured" in documents.get("article", "welcome-post").tags
true értéket ad vissza, ha a cikk tartalmazza a "featured" címkét.
size(documents.get("article", "welcome-post").tags)
A címkék számát adja vissza.
A paraméterezett útvonalak dinamikus, lokalizált oldalak készítésének alapjai. Amikor olyan útvonalmintát határoz meg, mint a /{lang}/landingPage, a CMS kinyeri a paramétereket az URL-ből, és elérhetővé teszi őket a meta.params segítségével.
Az útvonalak a :paramName vagy {paramName} szintaxist használják a dinamikus szegmensek meghatározására:
| Minta | Példa-URL | Kinyert paraméterek |
|---|---|---|
/:lang/landingPage | /ko/landingPage | { lang: "ko" } |
/{country}/{lang}/products | /us/en/products | { country: "us", lang: "en" } |
/articles/:slug | /articles/welcome-post | { slug: "welcome-post" } |
Útvonal-konfiguráció:
/{lang}/landingPage{ "lang": "language" }Lokalizált tartalom lekérése:
documents.get("greeting", meta.params.lang).headline
A meta.segments a nyers URL-útvonalat tömbként biztosítja. Akkor hasznos, ha név szerinti paraméterek helyett pozíció alapján szeretne hozzáférni a szegmensekhez.
| URL-útvonal | meta.segments |
|---|---|
/articles/tech/ai-news | ["articles", "tech", "ai-news"] |
/ko/landingPage | ["ko", "landingPage"] |
/ | [] |
| Felhasználási eset | Javasolt megoldás |
|---|---|
| Az útvonalmintából származó név szerinti paraméterek | meta.params.lang |
| Pozíció szerinti hozzáférés | meta.segments[0] |
| Az útvonal mélységének lekérése | size(meta.segments) |
| Annak ellenőrzése, hogy az útvonal tartalmaz-e egy szegmenst | "admin" in meta.segments |
A meta objektum az aktuális kérés teljes környezetét tartalmazza:
| Tulajdonság | Típus | Leírás |
|---|---|---|
meta.locale | string | Aktuális területi kód, például "en-US" vagy "ar-SA" |
meta.params | Record<string, string> | Az URL-mintából kinyert útvonalparaméterek |
meta.segments | string[] | Az URL-útvonal szegmensekre bontva |
meta.docId | string | null | Az aktuális dokumentum UUID-je |
meta.title | string | Az aktuális dokumentum címe |
A területi kód a BCP 47 formátumot követi:
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"
Az útvonalparaméterek mindig karakterláncok. A CMS kiértékelés előtt ellenőrzi őket a hozzárendelt sémák alapján:
meta.params.lang
meta.params.country
meta.params.slug
has(meta.params.category)
documents.get("greeting", meta.params.lang)
meta.segments[0]
meta.segments[1]
size(meta.segments)
"products" in meta.segments
meta.docId != null ? "szerkesztés" : "új létrehozása"
"Szerkesztés: " + meta.title
meta.title.contains("Draft") ? "folyamatban" : "közzétéve"
Ha a séma ismert, de az azonosító dinamikus, a ref() tisztább szintaxist biztosít:
documents.get("airports", meta.params.code).name
documents.ref("airports").get(meta.params.code).name
A két megoldás egyenértékű, de a ref() egyértelműbben jelzi a dinamikus részt.
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
meta.params.xyz
meta.segments
meta.segments[0]
meta.docId
meta.title
doc.fieldName
== != < <= > >=
&& || !
condition ? valueIfTrue : valueIfFalse
"value" in listOrMap
size(list)
size(string)
"text".startsWith("te")
"text".endsWith("xt")
"text".contains("ex")
has(object.property)
hasProperty(obj, "key")
Ha valami nem működik, az alábbi hibák egyikét láthatja:
| Hiba | Jelentése |
|---|---|
SYNTAX_ERROR | Elgépelés a szkriptben (hiányzó idézőjel vagy hibás operátor) |
TYPE_ERROR | Nem kompatibilis típusokat próbál kombinálni |
RUNTIME_ERROR | A szkript elindult, de problémába ütközött (például nem definiált változó) |
FETCH_LIMIT_EXCEEDED | Túl sok dokumentumot kér le (maximum 50) |
TIMEOUT | A szkript túl sokáig futott (maximum 5 másodperc) |
AST_DEPTH_EXCEEDED | A kifejezés túl mélyen egymásba ágyazott (maximum 50-es mélység) |
SCRIPT_TOO_LONG | A szkript meghaladja az 5000 karakteres korlátot |
A CEL-motor bővíthetőségre készült. A tervezett jövőbeli lehetőségek közé tartoznak:
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)
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"])
Ezeket a képességeket a regisztrált függvényrendszeren keresztül adjuk hozzá, miközben megőrizzük a meglévő szkriptek visszamenőleges kompatibilitását.
documents. vagy meta. előtagot, és a szerkesztő megjeleníti az elérhető lehetőségeketdocuments.get("schema", "id") kifejezést, majd adja hozzá a .fieldName részt!= null ? ... : ... mintávaldocuments.get() vagy documents.find() hívás beleszámít az 50-es lekérési korlátbahas(meta.params.category) értéketEz a rész a dokumentumok összekapcsolásának és relációs tartalmi struktúrák kialakításának fejlettebb mintáit ismerteti.
A legegyszerűbb esetben az egyik dokumentum azonosító alapján hivatkozik egy másikra.
documents.get("author", documents.get("article", "intro").authorId).name
documents.get("country", documents.get("airport", meta.params.code).countryCode).name
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
Ez a bemutató egy többnyelvű céloldalt hoz létre, amely a /{lang}/landingPage címen érhető el.
Hozzon létre a CMS adminisztrációs felületén egy greeting nevű egyéni sémát.
Hozzon létre dokumentumokat minden nyelvhez.
/{lang}/landingPagelang hozzárendelése a language komponenshezdocuments.get("greeting", meta.params.lang).headline
documents.get("greeting", meta.params.lang).subheadline
documents.get("greeting", meta.params.lang).ctaText
documents.get("greeting", meta.params.lang).ctaUrl
Adjon hozzá egy minden útvonalat kezelő útvonalat. A ParametricRoutePage feloldja az oldalt, kinyeri a meta.params értékeket az URL-ből, szerveroldalon kiértékeli a CEL-hozzárendeléseket, majd a regisztráción keresztül megjeleníti az egyes blokkokat.
| URL | Várt címsor |
|---|---|
/ko/landingPage | 환영 |
/en/landingPage | Üdvözöljük |
/ja/landingPage | いらっしゃいませ |
interface CelMeta {
locale: string;
params: Record<string, string>;
segments: string[];
docId: string | null;
title: string;
}
Az extractParams függvény feldolgozza az URL-útvonalakat:
Minta: /{country}/{lang}/products
Útvonal: /us/en/products
Algoritmus:
1. Mindkettő normalizálása (záró perjelek eltávolítása)
2. Szegmensekre bontás
3. A szegmensek számának egyeztetése
4. Minden szegmenspár feldolgozása
5. Eredmény: { country: "us", lang: "en" }
{ "lang": "language" }
{
"lang": {
"schemaName": "language",
"slugField": "code"
},
"slug": {
"schemaName": "article",
"slugField": "slug"
}
}
A documents.get(schema, identifier) használatakor:
id alapjáncontent.code mező ellenőrzésecontent.slug mező ellenőrzésetitle mező ellenőrzéseEz rugalmas dokumentumhivatkozást tesz lehetővé bármely egyedi azonosító használatával.