Praktická příručka pro psaní výrazů CEL v CMS.
Praktická příručka pro psaní výrazů CEL v CMS.
CEL (Common Expression Language) je lehký skriptovací jazyk zabudovaný do našeho CMS. Umožňuje psát dynamické výrazy, které mohou načítat data z dokumentů, číst parametry URL a průběžně vypočítávat hodnoty.
Co se stane při spuštění skriptu CEL:
Váš skript Modul Výsledek
| | |
v v v
documents.get("article", "intro") --> Načte z databáze --> { headline: "Welcome", body: "..." }
.headline --> Extrahuje pole --> "Welcome"
CEL si můžete představit jako jazyk dotazů pouze pro čtení. Nemůže nic měnit v databázi – pouze čte data a vrací vypočítaný výsledek. Díky tomu je bezpečný pro použití kdekoli v CMS.
Každý výraz CEL má přístup ke třem věcem:
| Objekt | Co představuje | Příklad |
|---|---|---|
documents | Načtení libovolného dokumentu z CMS | documents.get("country", "us") |
meta | Informace o aktuálním požadavku (lokalizace, parametry URL) | meta.locale, meta.params.slug |
schema | Definice polí aktuálního dokumentu | schema.fields |
docPři psaní výrazů CEL v editoru dokumentu můžete k hodnotám polí aktuálního dokumentu přistupovat pomocí objektu doc. To umožňuje vypočítávaná pole a odkazy mezi poli.
// Přístup k poli ceny aktuálního dokumentu
doc.price
// Výpočet celkové částky z polí aktuálního dokumentu
doc.price * doc.quantity
// Podmínka založená na stavu aktuálního dokumentu
doc.status == "published" ? doc.title : "Draft: " + doc.title
Objekt doc obsahuje všechny hodnoty polí upravovaného dokumentu. Hodí se pro:
doc.price * doc.quantity)Nejvýkonnější funkcí CEL je načítání dokumentů odkudkoli z vašeho CMS.
Syntaxe: documents.get(schemaName, identifier)
Řekněme, že máte dokument article uložený s identifikátorem "welcome-post":
// Uloženo v CMS jako: article / welcome-post
{
"headline": "Welcome to Our Platform",
"author": "Sarah Chen",
"body": "We're excited to announce...",
"tags": ["announcement", "news"]
}
Načtení celého dokumentu:
documents.get("article", "welcome-post")
Vrátí:
{
"headline": "Welcome to Our Platform",
"author": "Sarah Chen",
"body": "We're excited to announce...",
"tags": ["announcement", "news"]
}
Načtení pouze nadpisu:
documents.get("article", "welcome-post").headline
Vrátí: "Welcome to Our Platform"
Načtení autora:
documents.get("article", "welcome-post").author
Vrátí: "Sarah Chen"
Když má vaše stránka dynamické routy (například /articles/[slug]), můžete pomocí meta.params získat parametr URL a načíst správný dokument.
Pokud někdo navštíví /articles/welcome-post:
documents.get("article", meta.params.slug).headline
Vrátí: "Welcome to Our Platform"
Takto vytváříte dynamické stránky – stejný skript CEL funguje pro jakýkoli článek a použije slug uvedený v URL.
Syntaxe: documents.find(schemaName) nebo documents.find(schemaName, filter)
// Získání všech zemí
documents.find("country")
Vrátí:
[
{ "code": "us", "name": "United States", "flag": "US" },
{ "code": "sa", "name": "Saudi Arabia", "flag": "SA" },
{ "code": "gb", "name": "United Kingdom", "flag": "GB" }
]
// Získání zemí s filtrem
documents.find("country", { "where": { "code": "us" } })
Vrátí:
[
{ "code": "us", "name": "United States", "flag": "US" }
]
CEL podporuje načítání přeloženého obsahu dokumentů dvěma způsoby: automatickým překladem podle lokalizace a explicitním vyhledáním překladu.
Když je nastaveno meta.locale (například z parametrů routy nebo preferencí uživatele), documents.get() automaticky sloučí přeložený obsah:
// Pokud je meta.locale „fr“, vrátí francouzský překlad sloučený se základním dokumentem
documents.get("greeting", "welcome").headline
Jak to funguje:
meta.locale není „en“ ani „en-US“, vyhledá překlad v tabulce translations{ ...baseContent, ...translatedContent }To znamená, že přeložená pole mají přednost před základními poli, zatímco nepřeložená pole se převezmou ze základního dokumentu.
Pokud potřebujete načíst konkrétní překlad bez ohledu na aktuální lokalizaci:
Syntaxe: documents.translated(schemaName, identifier, locale)
// Vždy načíst španělský překlad
documents.translated("greeting", "welcome", "es").headline
// Načíst překlad podle parametru URL
documents.translated("product", meta.params.id, meta.params.lang).description
// Porovnat překlady
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title
Dokumenty s pozdravy a překlady:
// Základní dokument: greeting / welcome
{ "headline": "Welcome", "subheadline": "Welcome to our platform" }
// Překlad (jazyk: "fr")
{ "headline": "Bienvenue", "subheadline": "Bienvenue sur notre plateforme" }
// Překlad (jazyk: "es")
{ "headline": "Bienvenido", "subheadline": "Bienvenido a nuestra plataforma" }
Skripty CEL:
// S meta.locale = "fr"
documents.get("greeting", "welcome").headline
// Vrátí: "Bienvenue"
// Explicitní španělský překlad
documents.translated("greeting", "welcome", "es").headline
// Vrátí: "Bienvenido"
// Vzor pro náhradní hodnotu při chybějícím překladu
documents.translated("greeting", "welcome", meta.params.lang) != null
? documents.translated("greeting", "welcome", meta.params.lang).headline
: documents.get("greeting", "welcome").headline
Máte hero-block, který má zobrazit nadpis načtený z dokumentu article.
Dokument článku (identifikátor: "homepage-hero"):
{
"headline": "Build Faster, Ship Smarter",
"subheadline": "The modern CMS for developers"
}
Skript CEL v poli nadpisu hero bloku:
documents.get("article", "homepage-hero").headline
Výsledek: Hero zobrazí "Build Faster, Ship Smarter"
Vytváříte stránku na /countries/[code] a chcete zobrazit celý název země.
Dokumenty zemí:
// country / us
{ "code": "us", "name": "United States", "flag": "US", "languages": ["en", "es"] }
// country / sa
{ "code": "sa", "name": "Saudi Arabia", "flag": "SA", "languages": ["ar", "en"] }
Skript CEL:
documents.get("country", meta.params.code).name
Když někdo navštíví /countries/us:
meta.params.code = "us""United States"Když někdo navštíví /countries/sa:
meta.params.code = "sa""Saudi Arabia"Zobrazte různé nadpisy podle lokalizace uživatele.
meta.locale == "ar-SA" ? "Welcome, everyone" : "Welcome"
Pokud je lokalizace "ar-SA": Vrátí "Welcome, everyone"
Pokud je lokalizace jiná: Vrátí "Welcome"
Váš article má pole countryCode a chcete získat celý název země.
Dokument článku:
{ "headline": "News from the US", "countryCode": "us" }
Skript CEL:
documents.get("country", documents.get("article", "us-news").countryCode).name
Co se stane:
documents.get("article", "us-news") vrátí { "headline": "News from the US", "countryCode": "us" }.countryCode extrahuje "us"documents.get("country", "us") vrátí { "code": "us", "name": "United States", ... }.name extrahuje "United States"Výsledek: "United States"
Pokud dokument nemusí existovat, můžete zadat náhradní hodnotu:
documents.get("article", meta.params.slug) != null
? documents.get("article", meta.params.slug).headline
: "Article Not Found"
Nebo ověřit, zda existuje konkrétní pole:
documents.get("article", "intro").author != null
? documents.get("article", "intro").author
: "Unknown Author"
Váš článek má štítky a chcete ověřit, zda obsahuje konkrétní štítek:
"featured" in documents.get("article", "welcome-post").tags
Vrátí: true, pokud článek obsahuje štítek „featured“
Získání prvního štítku:
documents.get("article", "welcome-post").tags[0]
Vrátí: "announcement" (první štítek)
Spočítání štítků:
size(documents.get("article", "welcome-post").tags)
Vrátí: 2 (počet štítků)
Parametrické routy jsou klíčem k tvorbě dynamických lokalizovaných stránek. Když definujete vzor routy jako /{lang}/landingPage, CMS extrahuje parametry z URL a zpřístupní je prostřednictvím meta.params.
Definice vzoru routy:
Routy používají syntaxi :paramName nebo {paramName} pro definování dynamických segmentů:
| Vzor | Příklad URL | Extrahované parametry |
|---|---|---|
/:lang/landingPage | /ko/landingPage | { lang: "ko" } |
/{country}/{lang}/products | /us/en/products | { country: "us", lang: "en" } |
/articles/:slug | /articles/welcome-post | { slug: "welcome-post" } |
Vazby parametrů: Každý parametr routy lze pro validaci navázat na schéma dokumentu:
{
"pattern": "/{lang}/landingPage",
"param_bindings": {
"lang": "language"
}
}
Tato vazba CMS říká:
lang z URLlanguage (hledej dokument, jehož content.code odpovídá)Konfigurace routy:
/{lang}/landingPage/{lang}/landingPage{ "lang": "language" }Dokumenty pozdravů:
// greeting / ko
{ "code": "ko", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Get Started", "ctaUrl": "/ko/get-started" }
// greeting / en
{ "code": "en", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Get Started", "ctaUrl": "/en/get-started" }
// greeting / ja
{ "code": "ja", "headline": "Welcome", "subheadline": "Welcome to our platform", "ctaText": "Start", "ctaUrl": "/ja/get-started" }
Skript CEL pro načtení lokalizovaného obsahu:
documents.get("greeting", meta.params.lang).headline
Jak se vyhodnotí:
| URL | meta.params.lang | Výsledek |
|---|---|---|
/ko/landingPage | "ko" | "Welcome" |
/en/landingPage | "en" | "Welcome" |
/ja/landingPage | "ja" | "Welcome" |
Pro routy jako /{country}/{lang}/products:
Konfigurace routy:
{
"pattern": "/{country}/{lang}/products",
"param_bindings": {
"country": "country",
"lang": "language"
}
}
Skripty CEL:
// Získání názvu země
documents.get("country", meta.params.country).name
// Získání lokalizovaného seznamu produktů podle země
documents.find("product", { "where": { "country": meta.params.country } })
// Kombinace: Zobrazení pozdravu specifického pro zemi v jazyce uživatele
documents.get("greeting", meta.params.lang).headline + " from " + documents.get("country", meta.params.country).name
Kaskáda validace:
CMS ověřuje parametry hierarchicky. Pro routy /{country}/{lang}:
country proti schématu countrylang proti schématu languagelang je v poli country.languages[] (hierarchická validace)meta.segments poskytuje surovou cestu URL jako pole, což je užitečné, když potřebujete poziční přístup bez pojmenovaných parametrů.
Jak to funguje:
| Cesta URL | meta.segments |
|---|---|
/articles/tech/ai-news | ["articles", "tech", "ai-news"] |
/ko/landingPage | ["ko", "landingPage"] |
/us/en/products/featured | ["us", "en", "products", "featured"] |
/ | [] |
| Případ použití | Nejvhodnější přístup |
|---|---|
| Pojmenované parametry ze vzoru routy | meta.params.lang |
| Přístup podle pozice | meta.segments[0] |
| Zjištění hloubky cesty | size(meta.segments) |
| Ověření, zda cesta obsahuje segment | "admin" in meta.segments |
// Získání prvního segmentu (často kód jazyka)
meta.segments[0]
// Kontrola hloubky cesty
size(meta.segments) > 2 ? "deep" : "shallow"
// Kontrola, zda jsme v administraci
"admin" in meta.segments ? "admin mode" : "public mode"
// Náhradní řešení: Použití segmentu, pokud parametr není navázán
has(meta.params.lang) ? meta.params.lang : meta.segments[0]
Objekt meta obsahuje veškerý kontext aktuálního požadavku:
| Vlastnost | Typ | Popis | |
|---|---|---|---|
meta.locale | string | Kód aktuální lokalizace (např. "en-US", "ko-KR", "ar-SA") | |
meta.params | Record<string, string> | Parametry routy extrahované ze vzoru URL | |
meta.segments | string[] | Cesta URL rozdělená na segmenty | |
meta.docId | `string \ | null` | UUID aktuálního dokumentu (u nových dokumentů null) |
meta.title | string | Název aktuálního dokumentu |
Kód lokalizace se řídí formátem BCP 47 (jazyk-oblast):
// Kontrola lokalizace pro jazyky psané zprava doleva
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"
// Získání pouze části s jazykem
meta.locale.split("-")[0] // Není podporováno – použijte místo toho meta.params.lang
Parametry rout jsou vždy řetězce. CMS je před vyhodnocením ověří proti navázaným schématům:
// Přístup k pojmenovanému parametru
meta.params.lang // "ko"
meta.params.country // "us"
meta.params.slug // "welcome-post"
// Kontrola existence parametru
has(meta.params.category) // true/false
// Použití při načítání dokumentu
documents.get("greeting", meta.params.lang)
documents.ref("airports").get(meta.params.code)
Surové segmenty URL jako pole:
// Přístup podle indexu (od 0)
meta.segments[0] // První segment
meta.segments[1] // Druhý segment
// Kontrola délky
size(meta.segments) // Počet segmentů
// Kontrola výskytu
"products" in meta.segments // Obsahuje cesta „products“?
UUID aktuálního dokumentu, užitečné pro skripty odkazující na sebe sama:
// Dostupné pouze při úpravě existujících dokumentů
meta.docId != null ? "editing" : "creating new"
// Použití v podmíněné logice
meta.docId != null ? documents.get("article", meta.docId).status : "draft"
Název aktuálního dokumentu:
// Použití pro zobrazení
"Editing: " + meta.title
// Podmínka založená na názvu
meta.title.contains("Draft") ? "work in progress" : "published"
Pro přehlednější syntaxi, když je schéma známé, ale identifikátor je dynamický:
// Tradiční přístup
documents.get("airports", meta.params.code).name
// Použití ref() – schéma oddělené od dynamického identifikátoru
documents.ref("airports").get(meta.params.code).name
Oba způsoby jsou ekvivalentní, ale ref() zřetelněji odlišuje dynamickou část.
documents.get("schema", "identifier") // Získá jeden dokument
documents.get("schema", "id").fieldName // Získá konkrétní pole
documents.find("schema") // Získá všechny dokumenty
documents.find("schema", { "where": {...}}) // Filtrovaný dotaz
documents.ref("schema").get(identifier) // Řetězené vyhledávání
documents.translated("schema", "id", "fr") // Získá dokument s explicitní lokalizací
meta.locale // "en-US", "ar-SA" atd.
meta.params.xyz // Parametr URL s názvem "xyz"
meta.segments // Cesta URL jako pole: ["articles", "intro"]
meta.segments[0] // První segment cesty
meta.docId // ID aktuálního dokumentu (nebo null)
meta.title // Název aktuálního dokumentu
doc.fieldName // Hodnota pole aktuálního dokumentu (v kontextu editoru)
// Porovnání
== != < <= > >=
// Logika
&& || !
// Ternární operátor (if-else)
condition ? valueIfTrue : valueIfFalse
// Příslušnost
"value" in listOrMap
size(list) // Počet položek
size(string) // Délka řetězce
"text".startsWith("te") // true
"text".endsWith("xt") // true
"text".contains("ex") // true
has(object.property) // Kontrola existence vlastnosti
hasProperty(obj, "key") // Kontrola, zda objekt obsahuje klíč (alternativní syntaxe)
Pokud se něco pokazí, zobrazí se jedna z těchto zpráv:
| Chyba | Význam |
|---|---|
SYNTAX_ERROR | Překlep ve skriptu (chybějící uvozovka, nesprávný operátor) |
TYPE_ERROR | Kombinujete typy, které spolu nefungují |
RUNTIME_ERROR | Skript se spustil, ale narazil na problém (nedefinovaná proměnná) |
FETCH_LIMIT_EXCEEDED | Načítáte příliš mnoho dokumentů (maximum je 50) |
TIMEOUT | Skript trval příliš dlouho (maximum je 5 sekund) |
AST_DEPTH_EXCEEDED | Výraz je příliš hluboce vnořený (maximální hloubka: 50) |
SCRIPT_TOO_LONG | Skript překračuje limit 5000 znaků |
Modul CEL je navržen s ohledem na rozšiřitelnost. Mezi plánované budoucí možnosti patří:
// Budoucí možnost: Volání externích služeb přes MCP
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)
// Budoucí možnost: Generování obsahu pomocí 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"])
Tyto možnosti budou přidávány prostřednictvím systému registrovaných funkcí při zachování zpětné kompatibility s existujícími skripty.
documents. nebo meta. a editor zobrazí dostupné možnostidocuments.get("schema", "id") a teprve potom přidejte .fieldName!= null ? ... : ...documents.get() nebo documents.find() se započítává do limitu 50 načteníhas(meta.params.category)Tato část popisuje pokročilé vzory pro propojování dokumentů a vytváření relačních struktur obsahu.
Nejjednodušší podoba: jeden dokument odkazuje na jiný pomocí identifikátoru.
// Článek ukládá ID autora, načte jméno autora
documents.get("author", documents.get("article", "intro").authorId).name
Pro přehlednější syntaxi, když je identifikátor dynamický:
// Tradiční přístup
documents.get("country", documents.get("airport", meta.params.code).countryCode).name
// Použití ref() – přehlednější, když je schéma známé, ale identifikátor dynamický
documents.ref("country").get(documents.get("airport", meta.params.code).countryCode).name
Hluboké vztahy vytvoříte řetězením více vyhledávání:
// Letiště → Země → Region → Kontinent
documents.get("continent",
documents.get("region",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).regionCode
).continentCode
).name
Kombinace odkazů mezi dokumenty a překladů:
// Získání lokalizovaného názvu země pro letiště
documents.translated("country",
documents.get("airport", meta.params.code).countryCode,
meta.params.lang
).name
Dokument ukládá ID odkazující na jiný dokument.
// article / tech-news
{ "title": "Tech Update", "authorId": "author-123", "categoryId": "cat-tech" }
// Vyřešení jména autora
documents.get("author", documents.get("article", meta.params.slug).authorId).name
// Vyřešení kategorie s náhradní hodnotou
documents.get("article", meta.params.slug).categoryId != null
? documents.get("category", documents.get("article", meta.params.slug).categoryId).name
: "Uncategorized"
Dokumenty na sebe odkazují pomocí významových kódů namísto UUID.
// airport / JFK
{ "code": "JFK", "name": "John F. Kennedy International", "countryCode": "us" }
// country / us
{ "code": "us", "name": "United States", "currencyCode": "usd" }
// currency / usd
{ "code": "usd", "symbol": "$", "name": "US Dollar" }
// Řetězec Letiště → Země → Měna
documents.get("currency",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).currencyCode
).symbol
// Pro JFK: Vrátí "$"
Použijte doc pro vypočítávaná pole, která odkazují na jiné dokumenty podle hodnot aktuálního dokumentu.
// V dokumentu produktu načte podrobnosti související kategorie
documents.get("category", doc.categoryId).description
// Vypočítávané přepravní náklady podle země původu produktu
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight
Pokud dokumenty odkazují jeden na druhý, dávejte pozor na limity načítání.
// Získá autora článku a poté další články autora (sledujte počet načtení!)
documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })
Když může pole odkazovat na různá schémata:
// content-block / hero-1
{ "type": "hero", "sourceType": "article", "sourceId": "welcome-post" }
// content-block / hero-2
{ "type": "hero", "sourceType": "product", "sourceId": "featured-item" }
// Dynamické vyhledání schématu podle 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
Každé volání documents.get(), documents.find() a documents.ref().get() se sleduje kvůli invalidaci mezipaměti. Když se odkazovaný dokument změní, CMS ví, které výrazy CEL je nutné znovu vyhodnotit.
Sledované závislosti zahrnují:
schema:identifier – závislost na konkrétním dokumentuschema:identifier – totéž co get prostřednictvím řetězené syntaxeschema:* – závislost na úrovni schématu (libovolný dokument ve schématu)// Špatně: Stejný dokument načte dvakrát
documents.get("author", documents.get("article", "intro").authorId).name + " - " +
documents.get("author", documents.get("article", "intro").authorId).bio
// Lépe: Pomocí podmínky ověřte existenci jednou
documents.get("article", "intro").authorId != null
? documents.get("author", documents.get("article", "intro").authorId).name
: "Unknown Author"
Tento návod vytvoří vícejazyčnou vstupní stránku dostupnou na /{lang}/landingPage.
V administraci CMS vytvořte vlastní schéma s názvem 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" }
]
}
Vytvořte dokument pro každý jazyk:
Dokument: greeting/ko
{
"code": "ko",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/ko/get-started"
}
Dokument: greeting/en
{
"code": "en",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/en/get-started"
}
Dokument: greeting/ja
{
"code": "ja",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Start",
"ctaUrl": "/ja/get-started"
}
Vytvořte stránku s následující konfigurací:
/{lang}/landingPagelang na komponentu language {
"lang": "language"
}
Přidejte do routy hero blok s těmito skripty CEL pro jednotlivá pole:
Pole nadpisu:
documents.get("greeting", meta.params.lang).headline
Pole podnadpisu:
documents.get("greeting", meta.params.lang).subheadline
Pole textu CTA:
documents.get("greeting", meta.params.lang).ctaText
Pole URL CTA:
documents.get("greeting", meta.params.lang).ctaUrl
Přidejte catch-all routu. ParametricRoutePage vyřeší stránku, extrahuje meta.params z URL, vyhodnotí vaše vazby CEL na serveru a vykreslí každý blok prostřednictvím registru – kontext meta ani nízkoúrovňového klienta nemusíte vytvářet či volat sami.
// 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 })}
/>
);
}
Navštivte tyto URL a zobrazte lokalizovaný obsah:
| URL | Očekávaný nadpis |
|---|---|
/ko/landingPage | 환영 |
/en/landingPage | Welcome |
/ja/landingPage | いらっしゃいませ |
Když uživatel navštíví /ko/landingPage:
/{lang}/landingPagemeta.params.lang = "ko"languagedocuments.get("greeting", meta.params.lang) se vyhodnotí na korejský obsahinterface CelMeta {
/** Kód aktuální lokalizace (např. 'en-US') */
locale: string;
/** Parametry routy extrahované z URL */
params: Record<string, string>;
/** Segmenty cesty URL */
segments: string[];
/** ID aktuálního dokumentu (při úpravě existujícího dokumentu) */
docId: string | null;
/** Název aktuálního dokumentu */
title: string;
}
Funkce extractParams zpracovává cesty URL:
Vzor: /{country}/{lang}/products
Cesta: /us/en/products
Algoritmus:
1. Normalizuj obě hodnoty (odstraň koncová lomítka)
2. Rozděl je na segmenty: ["us", "en", "products"] a ["{country}", "{lang}", "products"]
3. Porovnej počty segmentů (musí být stejné)
4. Pro každý pár segmentů:
- Pokud vzor začíná na : nebo {}, extrahuj parametr
- Jinak se musí přesně shodovat
5. Vrať: { country: "us", lang: "en" }
// Jednoduchá vazba (pro vyhledání používá pole "code")
{ "lang": "language" }
// Podrobná vazba (vlastní pole slug)
{
"lang": {
"schemaName": "language",
"slugField": "code"
},
"slug": {
"schemaName": "article",
"slugField": "slug"
}
}
Při načítání pomocí documents.get(schema, identifier):
idcontent.codecontent.slugtitleTo umožňuje flexibilní odkazování na dokumenty pomocí libovolného jedinečného identifikátoru.