Praktični vodnik za pisanje izrazov CEL v sistemu CMS.
Praktični vodnik za pisanje izrazov CEL v sistemu CMS.
CEL (Common Expression Language oziroma skupni jezik izrazov) je lahek skriptni jezik, vgrajen v naš CMS. Omogoča pisanje dinamičnih izrazov, ki lahko pridobivajo podatke iz dokumentov, berejo parametre URL-ja in sproti izračunavajo vrednosti.
Ko se zažene skript CEL:
Vaš skript Mehanizem Rezultat
| | |
v v v
documents.get("article", "intro") --> Pridobi iz podatkovne zbirke --> { headline: "Welcome", body: "..." }
.headline --> Izlušči polje --> "Welcome"
CEL si lahko predstavljate kot jezik poizvedb samo za branje. V podatkovni zbirki ne more ničesar spreminjati – podatke samo prebere in vrne izračunan rezultat. Zato ga je varno uporabljati kjer koli v sistemu CMS.
Vsak izraz CEL ima dostop do treh stvari:
| Objekt | Kaj predstavlja | Primer |
|---|---|---|
documents | Pridobivanje katerega koli dokumenta iz sistema CMS | documents.get("country", "us") |
meta | Informacije o trenutni zahtevi (lokalna nastavitev, parametri URL-ja) | meta.locale, meta.params.slug |
schema | Definicije polj trenutnega dokumenta | schema.fields |
docPri pisanju izrazov CEL v urejevalniku dokumentov lahko do vrednosti polj trenutnega dokumenta dostopate z objektom doc. To omogoča izračunana polja in sklicevanja med polji.
// Dostop do polja price trenutnega dokumenta
doc.price
// Izračun skupne vrednosti iz polj trenutnega dokumenta
doc.price * doc.quantity
// Pogoj glede na stanje trenutnega dokumenta
doc.status == "published" ? doc.title : "Draft: " + doc.title
Objekt doc vsebuje vse vrednosti polj urejanega dokumenta. Uporaben je za:
doc.price * doc.quantity),Najzmogljivejša funkcija CEL je pridobivanje dokumentov s katerega koli mesta v sistemu CMS.
Sintaksa: documents.get(schemaName, identifier)
Recimo, da imate dokument article, shranjen z identifikatorjem "welcome-post":
// Shranjeno v sistemu CMS kot: article / welcome-post
{
"headline": "Welcome to Our Platform",
"author": "Sarah Chen",
"body": "We're excited to announce...",
"tags": ["announcement", "news"]
}
Pridobitev celotnega dokumenta:
documents.get("article", "welcome-post")
Pridobitev samo naslova:
documents.get("article", "welcome-post").headline
Pridobitev avtorja:
documents.get("article", "welcome-post").author
Ko ima stran dinamične poti (na primer /articles/[slug]), lahko z meta.params pridobite parameter URL-ja in ustrezen dokument.
Če nekdo obišče /articles/welcome-post:
documents.get("article", meta.params.slug).headline
Tako ustvarite dinamične strani – isti skript CEL deluje za kateri koli članek, pri čemer uporabi vrednost slug iz URL-ja.
Sintaksa: documents.find(schemaName) ali documents.find(schemaName, filter)
// Pridobi vse države
documents.find("country")
// Pridobi države s filtrom
documents.find("country", { "where": { "code": "us" } })
CEL podpira pridobivanje prevedene vsebine dokumentov na dva načina: samodejni prevod na podlagi lokalne nastavitve in izrecno iskanje prevoda.
Ko je nastavljen meta.locale (na primer iz parametrov poti ali uporabniških nastavitev), documents.get() samodejno združi prevedeno vsebino:
// Če je meta.locale enak "fr", vrne francoski prevod, združen z osnovnim dokumentom
documents.get("greeting", "welcome").headline
Delovanje:
meta.locale ni "en" ali "en-US", poišče prevod v tabeli translations.{ ...baseContent, ...translatedContent }.Prevedena polja tako preglasijo osnovna polja, neprevedena polja pa se vrnejo iz osnovnega dokumenta.
Če morate pridobiti določen prevod ne glede na trenutno lokalno nastavitev:
Sintaksa: documents.translated(schemaName, identifier, locale)
// Vedno pridobi španski prevod
documents.translated("greeting", "welcome", "es").headline
// Pridobi prevod na podlagi parametra URL-ja
documents.translated("product", meta.params.id, meta.params.lang).description
Imate blok hero-block, ki mora prikazati naslov iz dokumenta article.
Skript CEL v polju naslova bloka:
documents.get("article", "homepage-hero").headline
Rezultat: Uvodni blok prikaže "Build Faster, Ship Smarter".
Ustvarjate stran na /countries/[code] in želite prikazati polno ime države.
documents.get("country", meta.params.code).name
Ko nekdo obišče /countries/us:
meta.params.code = "us""United States"Prikažite različne naslove glede na lokalno nastavitev uporabnika.
meta.locale == "ar-SA" ? "Welcome, everyone" : "Welcome"
Dokument article ima polje countryCode, vi pa želite pridobiti polno ime države.
documents.get("country", documents.get("article", "us-news").countryCode).name
Če dokument morda ne obstaja, lahko navedete nadomestno vrednost:
documents.get("article", meta.params.slug) != null
? documents.get("article", meta.params.slug).headline
: "Article Not Found"
Če ima članek oznake in želite preveriti, ali obstaja določena oznaka:
"featured" in documents.get("article", "welcome-post").tags
Za pridobitev prve oznake:
documents.get("article", "welcome-post").tags[0]
Za štetje oznak:
size(documents.get("article", "welcome-post").tags)
Parametrične poti so ključne za izdelavo dinamičnih, lokaliziranih strani. Ko določite vzorec poti, kot je /{lang}/landingPage, CMS iz URL-ja izlušči parametre in jih omogoči prek meta.params.
Poti uporabljajo sintakso :paramName ali {paramName} za določanje dinamičnih segmentov:
| Vzorec | Primer URL-ja | Izluščeni parametri |
|---|---|---|
/:lang/landingPage | /ko/landingPage | { lang: "ko" } |
/{country}/{lang}/products | /us/en/products | { country: "us", lang: "en" } |
/articles/:slug | /articles/welcome-post | { slug: "welcome-post" } |
Vsak parameter poti je mogoče povezati s shemo dokumenta za preverjanje veljavnosti.
meta.segments zagotavlja surovo pot URL-ja kot polje, kar je uporabno pri dostopu po položaju brez poimenovanih parametrov.
| Pot URL-ja | meta.segments |
|---|---|
/articles/tech/ai-news | ["articles", "tech", "ai-news"] |
/ko/landingPage | ["ko", "landingPage"] |
/ | [] |
| Primer uporabe | Najprimernejši pristop |
|---|---|
| Poimenovani parametri iz vzorca poti | meta.params.lang |
| Dostop po položaju | meta.segments[0] |
| Pridobivanje globine poti | size(meta.segments) |
| Preverjanje, ali pot vsebuje segment | "admin" in meta.segments |
Objekt meta vsebuje ves kontekst trenutne zahteve:
| Lastnost | Vrsta | Opis |
|---|---|---|
meta.locale | string | Koda trenutne lokalne nastavitve, na primer "en-US" |
meta.params | Record<string, string> | Parametri poti, izluščeni iz vzorca URL-ja |
meta.segments | string[] | Pot URL-ja, razdeljena na segmente |
meta.docId | string \| null | UUID trenutnega dokumenta |
meta.title | string | Naslov trenutnega dokumenta |
Parametri poti so vedno nizi. CMS jih pred vrednotenjem preveri glede na povezane sheme:
meta.params.lang
meta.params.country
meta.params.slug
has(meta.params.category)
documents.get("greeting", meta.params.lang)
Za čistejšo sintakso, kadar je shema znana, identifikator pa dinamičen:
// Tradicionalni pristop
documents.get("airports", meta.params.code).name
// Uporaba ref() - shema je ločena od dinamičnega identifikatorja
documents.ref("airports").get(meta.params.code).name
Oba pristopa sta enakovredna, vendar ref() jasneje izpostavi dinamični del.
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")
Če gre kaj narobe, se lahko prikaže eno od teh sporočil:
| Napaka | Pomen |
|---|---|
SYNTAX_ERROR | Napaka v skriptu (manjkajoči narekovaji ali nepravilen operator) |
TYPE_ERROR | Mešanje nezdružljivih vrst |
RUNTIME_ERROR | Skript se je zagnal, vendar je naletel na težavo |
FETCH_LIMIT_EXCEEDED | Pridobljenih je preveč dokumentov (največ 50) |
TIMEOUT | Skript je trajal predolgo (največ 5 sekund) |
AST_DEPTH_EXCEEDED | Izraz je pregloboko ugnezden (največja globina: 50) |
SCRIPT_TOO_LONG | Skript presega omejitev 5000 znakov |
documents. ali meta. in urejevalnik bo prikazal možnosti.documents.get("schema", "id"), nato dodajte .fieldName.!= null ? ... : ....documents.get() ali documents.find() šteje v omejitev 50 pridobitev.has(meta.params.category).Ta razdelek opisuje napredne vzorce za povezovanje dokumentov in izdelavo povezanih vsebinskih struktur.
Najpreprostejša oblika: en dokument se na drugega sklicuje z identifikatorjem.
// Članek hrani ID avtorja; pridobi ime avtorja
documents.get("author", documents.get("article", "intro").authorId).name
Globoke povezave lahko ustvarite z veriženjem več iskanj:
// Letališče → država → regija → celina
documents.get("continent",
documents.get("region",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).regionCode
).continentCode
).name
Ta vodič ustvari večjezično ciljno stran, dostopno na /{lang}/landingPage.
V skrbniškem vmesniku CMS ustvarite shemo po meri z imenom greeting.
Ustvarite dokument za vsak jezik.
Ustvarite stran z naslednjo konfiguracijo:
/{lang}/landingPagelang v komponento language.documents.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
Dodajte univerzalno pot. ParametricRoutePage razreši stran, iz URL-ja izlušči meta.params, na strežniški strani ovrednoti vaše vezave CEL in vsak blok izriše prek registra.
Obiščite URL-je in preverite lokalizirano vsebino.
interface CelMeta {
locale: string;
params: Record<string, string>;
segments: string[];
docId: string | null;
title: string;
}
Funkcija extractParams obdela poti URL-ja tako, da normalizira poti, jih razdeli na segmente, primerja njihovo število, izlušči dinamične segmente ter vrne parametre.
Pri pridobivanju prek documents.get(schema, identifier) sistem uporabi naslednji vrstni red:
id.content.code.content.slug.title.To omogoča prilagodljivo sklicevanje na dokumente s katerim koli enoličnim identifikatorjem.