profound-logoProfound CMS
⌘K
Admin
Theme
DocsTutorialBlogPhilosophy
DocsTutorialBlogPhilosophy

Hybrid

Parametriskā maršrutēšanaKomponentu veidiSetup server sent events (SSE) content refetchIestatīt administratora paneļa starpniekserveriSkriptēšana veidņu veidotājāProject ScaffoldingMultivides bibliotēka

Headless

Ātrā uzsākšanaSplit Screen JSON Component Builder with LLMComponent Zod Pull

REST API

REST API OverviewgetConnect your websitegetSaņemt maršrutusgetGET /routegetGET /blocksgetGET /blocks/with-cel-cachegetGET /blocks/generatedgetGET /componentsgetGET /components/{name}getGET /dataset/{schema_name}getGET /content-changes (SSE)patchPATCH /dataset/{schema_name}postPēctulkošanapatchTulkojumu labojumigetGET /usagepostPOST /csvpatchPATCH /csv
All Systems Operational
Powered Byprofound-logo
Theme

Skriptēšana veidņu veidotājā

Praktiska rokasgrāmata CEL izteiksmju rakstīšanai CMS.

Praktiska rokasgrāmata CEL izteiksmju rakstīšanai CMS.


Kā darbojas CEL

CEL (Common Expression Language — kopējā izteiksmju valoda) ir viegla skriptu valoda, kas iebūvēta mūsu CMS. Tā ļauj rakstīt dinamiskas izteiksmes, kas var iegūt datus no dokumentiem, nolasīt URL parametrus un aprēķināt vērtības izpildes laikā.

Lūk, kas notiek, kad tiek izpildīts CEL skripts:

Jūsu skripts                    Dzinējs                         Rezultāts
    |                              |                              |
    v                              v                              v
documents.get("article", "intro") --> Iegūst no datubāzes --> { headline: "Welcome", body: "..." }
         .headline                --> Izgūst lauku         --> "Welcome"

Uztveriet CEL kā tikai lasāmu vaicājumu valodu. Tā nevar modificēt neko datubāzē — tā tikai nolasa datus un atgriež aprēķinātu rezultātu. Tāpēc to var droši izmantot jebkur CMS.


Pamatelementi

Katrai CEL izteiksmei ir pieejamas trīs lietas:

ObjektsKas tas irPiemērs
documentsIegūst jebkuru dokumentu no CMSdocuments.get("country", "us")
metaInformācija par pašreizējo pieprasījumu (lokāle, URL parametri)meta.locale, meta.params.slug
schemaPašreizējā dokumenta lauku definīcijasschema.fields

Atsauce uz sevi ar doc

Rakstot CEL izteiksmes dokumentu redaktorā, pašreizējā dokumenta lauku vērtībām var piekļūt, izmantojot objektu doc. Tas ļauj izveidot aprēķināmos laukus un atsauces starp laukiem.

// Piekļuve pašreizējā dokumenta cenas laukam
doc.price

// Kopējās summas aprēķins no pašreizējā dokumenta laukiem
doc.price * doc.quantity

// Nosacījums, kas balstīts uz pašreizējā dokumenta statusu
doc.status == "published" ? doc.title : "Draft: " + doc.title

Objekts doc satur visas rediģētā dokumenta lauku vērtības. Tas ir noderīgi:

  • aprēķināmiem laukiem (piemēram, doc.price * doc.quantity);
  • nosacījuma attēlošanas loģikai, kas balstīta uz dokumenta stāvokli;
  • validācijas stila izteiksmēm.

Dokumentu iegūšana

Viena no jaudīgākajām CEL funkcijām ir dokumentu iegūšana no jebkuras vietas jūsu CMS.

Viena dokumenta iegūšana

Sintakse: documents.get(schemaName, identifier)

Pieņemsim, ka jums ir article dokuments ar identifikatoru "welcome-post":

// Saglabāts CMS kā: article / welcome-post
{
  "headline": "Welcome to Our Platform",
  "author": "Sarah Chen",
  "body": "We're excited to announce...",
  "tags": ["announcement", "news"]
}

Lai iegūtu visu dokumentu:

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

Atgriež: visu dokumentu.

Lai iegūtu tikai virsrakstu:

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

Atgriež: "Welcome to Our Platform"

Lai iegūtu autoru:

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

Atgriež: "Sarah Chen"


URL parametru izmantošana

Ja jūsu lapai ir dinamiskie maršruti, piemēram, /articles/[slug], varat izmantot meta.params, lai iegūtu URL parametru un atrastu pareizo dokumentu.

Ja lietotājs apmeklē /articles/welcome-post:

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

Atgriež: "Welcome to Our Platform"

Šādi tiek veidotas dinamiskas lapas — viens un tas pats CEL skripts darbojas jebkuram rakstam, izmantojot URL norādīto slug.


Vairāku dokumentu iegūšana

Sintakse: documents.find(schemaName) vai documents.find(schemaName, filter)

// Iegūt visas valstis
documents.find("country")

Atgriež: dokumentu masīvu.

// Iegūt valstis ar filtru
documents.find("country", { "where": { "code": "us" } })

Tulkojumi

CEL atbalsta tulkota dokumenta satura iegūšanu divos veidos: automātisku tulkošanu pēc lokāles un skaidri norādīta tulkojuma meklēšanu.

Automātiska tulkošana, izmantojot meta.locale

Ja meta.locale ir iestatīts, piemēram, no maršruta parametriem vai lietotāja izvēlēm, documents.get() automātiski apvieno tulkoto saturu:

// Ja meta.locale ir "fr", tiek atgriezts franču tulkojums, apvienots ar pamata dokumentu
documents.get("greeting", "welcome").headline

Darbības princips:

  1. Tiek iegūts pamata dokumenta saturs.
  2. Ja meta.locale nav "en" vai "en-US", tulkojums tiek meklēts translations tabulā.
  3. Tulkotie lauki tiek apvienoti ar pamata saturu: { ...baseContent, ...translatedContent }.

Tas nozīmē, ka tulkotie lauki aizstāj pamata laukus, bet netulkotie lauki tiek paņemti no pamata dokumenta.

Skaidri norādīts tulkojums ar documents.translated()

Ja jāiegūst konkrēts tulkojums neatkarīgi no pašreizējās lokāles:

Sintakse: documents.translated(schemaName, identifier, locale)

// Vienmēr iegūt tulkojumu spāņu valodā
documents.translated("greeting", "welcome", "es").headline

// Iegūt tulkojumu, balstoties uz URL parametru
documents.translated("product", meta.params.id, meta.params.lang).description

// Salīdzināt tulkojumus
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title

Tulkojuma piemērs

// Pamata dokuments: greeting / welcome
{ "headline": "Welcome", "subheadline": "Welcome to our platform" }

// Tulkojums (valoda: "fr")
{ "headline": "Bienvenue", "subheadline": "Bienvenue sur notre plateforme" }

// Tulkojums (valoda: "es")
{ "headline": "Bienvenido", "subheadline": "Bienvenido a nuestra plataforma" }

CEL skripti:

// Ar meta.locale = "fr"
documents.get("greeting", "welcome").headline
// Atgriež: "Bienvenue"

// Skaidri norādīts tulkojums spāņu valodā
documents.translated("greeting", "welcome", "es").headline
// Atgriež: "Bienvenido"

// Rezerves variants, ja tulkojuma nav
documents.translated("greeting", "welcome", meta.params.lang) != null
  ? documents.translated("greeting", "welcome", meta.params.lang).headline
  : documents.get("greeting", "welcome").headline

Praktiski piemēri

1. piemērs: varoņa bloka virsraksts no cita dokumenta

Jums ir hero-block, kuram jāparāda no article dokumenta iegūts virsraksts.

CEL skripts varoņa bloka virsraksta laukā:

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

Rezultāts: varonis parāda "Build Faster, Ship Smarter".

2. piemērs: valsts nosaukums pēc koda

Veidojat lapu /countries/[code] un vēlaties parādīt pilnu valsts nosaukumu:

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

Apmeklējot /countries/us, meta.params.code ir "us", bet rezultāts ir "United States".

3. piemērs: nosacījuma saturs pēc lokāles

meta.locale == "ar-SA" ? "Welcome, everyone" : "Welcome"

Ja lokāle ir "ar-SA", tiek atgriezts "Welcome, everyone"; citādi — "Welcome".

4. piemērs: ķēdē savienotas dokumentu meklēšanas

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

Vispirms tiek iegūts raksts, pēc tam tā countryCode lauks un visbeidzot attiecīgās valsts name lauks.

5. piemērs: rezerves vērtības

documents.get("article", meta.params.slug) != null
  ? documents.get("article", meta.params.slug).headline
  : "Article Not Found"

Lauka esamību var pārbaudīt šādi:

documents.get("article", "intro").author != null
  ? documents.get("article", "intro").author
  : "Unknown Author"

6. piemērs: darbs ar sarakstiem

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

Atgriež true, ja rakstam ir tags "featured".

Pirmā taga iegūšana:

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

Saraksta elementu skaita iegūšana:

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

Parametriskie maršruti un meta.params

Parametriskie maršruti ir svarīgi dinamisku, lokalizētu lapu veidošanai. Ja definējat maršruta shēmu, piemēram, /{lang}/landingPage, CMS izvelk parametrus no URL un padara tos pieejamus, izmantojot meta.params.

Kā darbojas maršruta parametri

Maršruti izmanto sintaksi :paramName vai {paramName}, lai definētu dinamiskos segmentus:

ShēmaPiemēra URLIegūtie 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" }

Katru maršruta parametru var piesaistīt dokumentu shēmai validācijai:

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

CMS izvelk segmentu lang, validē to pret language shēmu un, ja tas ir derīgs, padara pilno dokumentu pieejamu atrisinātajos parametros.

Piemērs: valodas lapa

Lokalizēta satura iegūšanas CEL skripts:

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

Papildu modelis: valsts un valodas maršruti

Maršrutam /{country}/{lang}/products:

// Iegūt valsts nosaukumu
documents.get("country", meta.params.country).name

// Iegūt valstij atbilstošu produktu sarakstu
documents.find("product", { "where": { "country": meta.params.country } })

// Parādīt valstij atbilstošu sveicienu lietotāja valodā
documents.get("greeting", meta.params.lang).headline + " from " + documents.get("country", meta.params.country).name

CMS validē parametrus hierarhiski: vispirms country, pēc tam lang, kā arī pēc izvēles pārbauda, vai lang atrodas country.languages[] masīvā.


meta.segments — neapstrādāta URL ceļa piekļuve

meta.segments nodrošina neapstrādāto URL ceļu kā masīvu. Tas ir noderīgi, ja nepieciešama piekļuve segmentiem pēc to pozīcijas, nevis nosaukta parametra.

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

Kad izmantot meta.segments un kad meta.params

LietojumsIeteicamā pieeja
Nosaukti parametri no maršruta shēmasmeta.params.lang
Piekļuve pēc pozīcijasmeta.segments[0]
Ceļa dziļuma iegūšanasize(meta.segments)
Pārbaude, vai ceļā ir segments"admin" in meta.segments

Piemēri:

// Iegūt pirmo segmentu (bieži valodas kodu)
meta.segments[0]

// Pārbaudīt ceļa dziļumu
size(meta.segments) > 2 ? "deep" : "shallow"

// Pārbaudīt, vai atrodamies administrēšanas sadaļā
"admin" in meta.segments ? "admin mode" : "public mode"

// Rezerves variants, ja parametrs nav piesaistīts
has(meta.params.lang) ? meta.params.lang : meta.segments[0]

Pilnīga meta objekta uzziņa

Objekts meta satur visu pašreizējā pieprasījuma kontekstu:

ĪpašībaTipsApraksts
meta.localestringPašreizējais lokāles kods, piemēram, "en-US", "ko-KR", "ar-SA"
meta.paramsRecord<string, string>No URL shēmas izvilktie maršruta parametri
meta.segmentsstring[]URL ceļš sadalīts segmentos
meta.docIdstring | nullPašreizējā dokumenta UUID; jauniem dokumentiem — null
meta.titlestringPašreizējā dokumenta virsraksts

meta.locale

Lokāles kods atbilst BCP 47 formātam:

// Pārbaudīt lokāli virziena no labās uz kreiso valodām
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"

// Iegūt tikai valodas daļu
meta.locale.split("-")[0]  // Nav atbalstīts — tā vietā izmantojiet meta.params.lang

meta.params

Maršruta parametri vienmēr ir virknes. CMS tos pirms novērtēšanas validē pret piesaistītajām shēmām:

// Piekļūt nosauktam parametram
meta.params.lang           // "ko"
meta.params.country        // "us"
meta.params.slug           // "welcome-post"

// Pārbaudīt, vai parametrs pastāv
has(meta.params.category)  // true/false

// Izmantot dokumenta iegūšanai
documents.get("greeting", meta.params.lang)
documents.ref("airports").get(meta.params.code)

meta.segments

Neapstrādātie URL segmenti kā masīvs:

meta.segments[0]           // Pirmais segments
meta.segments[1]           // Otrais segments
size(meta.segments)        // Segmentu skaits
"products" in meta.segments  // Vai ceļā ir "products"?

meta.docId

Pašreizējā dokumenta UUID, kas noder pašreferences skriptiem:

meta.docId != null ? "editing" : "creating new"
meta.docId != null ? documents.get("article", meta.docId).status : "draft"

meta.title

Pašreizējā dokumenta virsraksts:

"Editing: " + meta.title
meta.title.contains("Draft") ? "work in progress" : "published"

documents.ref() — ķēdē savienotas meklēšanas

Ja shēma ir zināma, bet identifikators ir dinamisks, var izmantot skaidrāku sintaksi:

// Tradicionālā pieeja
documents.get("airports", meta.params.code).name

// Izmantojot ref()
documents.ref("airports").get(meta.params.code).name

Abas pieejas ir līdzvērtīgas, taču ref() skaidrāk parāda dinamisko daļu.


Īsā uzziņa

Dokumentu iegūšana

documents.get("schema", "identifier")       // Iegūt vienu dokumentu
documents.get("schema", "id").fieldName     // Iegūt konkrētu lauku
documents.find("schema")                    // Iegūt visus dokumentus
documents.find("schema", { "where": {...}}) // Filtrēts vaicājums
documents.ref("schema").get(identifier)     // Ķēdē savienota meklēšana
documents.translated("schema", "id", "fr")  // Iegūt ar konkrētu lokāli

Konteksta mainīgie

meta.locale          // "en-US", "ar-SA" u. c.
meta.params.xyz      // URL parametrs ar nosaukumu "xyz"
meta.segments        // URL ceļš kā masīvs
meta.segments[0]     // Pirmais ceļa segments
meta.docId           // Pašreizējā dokumenta ID (vai null)
meta.title           // Pašreizējā dokumenta virsraksts
doc.fieldName        // Pašreizējā dokumenta lauka vērtība

Operatori

// Salīdzināšana
==  !=  <  <=  >  >=

// Loģika
&&  ||  !

// Trīskāršais operators
condition ? valueIfTrue : valueIfFalse

// Piederība
"value" in listOrMap

Biežāk izmantotās funkcijas

size(list)                    // Elementu skaits
size(string)                  // Virknes garums
"text".startsWith("te")       // true
"text".endsWith("xt")         // true
"text".contains("ex")         // true
has(object.property)          // Pārbaudīt, vai īpašība pastāv
hasProperty(obj, "key")       // Alternatīva objekta atslēgas pārbaudes sintakse

Kļūdu ziņojumi

Ja kaut kas neizdodas, var tikt parādīta kāda no šīm kļūdām:

KļūdaNozīme
SYNTAX_ERRORKļūda skriptā (trūkst pēdiņu vai ir nepareizs operators)
TYPE_ERRORTiek kombinēti nesaderīgi tipi
RUNTIME_ERRORSkripts tika palaists, bet radās problēma (piemēram, nedefinēts mainīgais)
FETCH_LIMIT_EXCEEDEDTiek iegūts pārāk daudz dokumentu (ne vairāk kā 50)
TIMEOUTSkripts izpildījās pārāk ilgi (ne vairāk kā 5 sekundes)
AST_DEPTH_EXCEEDEDIzteiksme ir pārāk dziļi ligzdota (maksimālais dziļums: 50)
SCRIPT_TOO_LONGSkripts pārsniedz 5000 rakstzīmju ierobežojumu

Paplašināmība un nākotnes iespējas

CEL dzinējs ir veidots ar iespēju to paplašināt. Plānotās nākotnes iespējas ietver:

Plānots: MCP servera integrācija

// Nākotnē: ārējo pakalpojumu izsaukšana, izmantojot MCP
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)

Plānots: MI iespējas

// Nākotnē: satura ģenerēšana ar MI
aı.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"])

Šīs iespējas tiks pievienotas, izmantojot reģistrēto funkciju sistēmu, saglabājot atpakaļsaderību ar esošajiem skriptiem.


Padomi

  1. Izmantojiet automātisko pabeigšanu — ierakstiet documents. vai meta., un redaktors parādīs pieejamās iespējas.
  2. Sāciet vienkārši — vispirms pārbaudiet documents.get("schema", "id"), pēc tam pievienojiet .fieldName.
  3. Pārbaudiet null vērtības — ja dokuments var neeksistēt, pievienojiet rezerves variantu ar != null ? ... : ....
  4. Neiegūstiet liekus datus — katrs documents.get() vai documents.find() tiek ieskaitīts 50 iegūšanas reižu limitā.
  5. Dodiet priekšroku meta.params, nevis meta.segments — nosauktie parametri tiek validēti un ir uzticamāki.
  6. Izmantojiet has() neobligātiem parametriem — pirms piekļuves pārbaudiet has(meta.params.category).
  7. Izmantojiet documents.ref() dinamiskiem identifikatoriem — skaidrāka sintakse, ja shēma ir statiska, bet identifikators dinamisks.
  8. Izmantojiet doc.fieldName pašreferences gadījumos — piekļūstiet pašreizējā dokumenta laukiem aprēķināmajās izteiksmēs.

Atsauces starp dokumentiem

Šajā sadaļā aprakstīti sarežģītāki modeļi dokumentu sasaistīšanai un relāciju satura struktūru veidošanai.

Pamata atsauces modelis

Vienkāršākajā variantā viens dokuments atsaucas uz citu pēc identifikatora:

// Raksts glabā autora ID; iegūt autora vārdu
documents.get("author", documents.get("article", "intro").authorId).name

Ķēdē savienotas meklēšanas ar documents.ref()

// Tradicionālā pieeja
documents.get("country", documents.get("airport", meta.params.code).countryCode).name

// Izmantojot ref()
documents.ref("country").get(documents.get("airport", meta.params.code).countryCode).name

Vairāku līmeņu atsauču ķēdes

// Lidosta → Valsts → Reģions → Kontinents
documents.get("continent",
  documents.get("region",
    documents.get("country",
      documents.get("airport", meta.params.code).countryCode
    ).regionCode
  ).continentCode
).name

Atsauce ar tulkojumu

// Iegūt lidostai atbilstošu lokalizētu valsts nosaukumu
documents.translated("country",
  documents.get("airport", meta.params.code).countryCode,
  meta.params.lang
).name

Atsauču modeļi pēc lietojuma

1. modelis: ārējās atslēgas meklēšana

Dokuments glabā ID, kas norāda uz citu dokumentu.

// article / tech-news
{ "title": "Tech Update", "authorId": "author-123", "categoryId": "cat-tech" }
// Atrisināt autora vārdu
documents.get("author", documents.get("article", meta.params.slug).authorId).name

// Atrisināt kategoriju ar rezerves vērtību
documents.get("article", meta.params.slug).categoryId != null
  ? documents.get("category", documents.get("article", meta.params.slug).categoryId).name
  : "Uncategorized"

2. modelis: atsauces pēc koda

Dokumenti atsaucas cits uz citu ar semantiskiem kodiem, nevis UUID.

// Lidosta → Valsts → Valūta
documents.get("currency",
  documents.get("country",
    documents.get("airport", meta.params.code).countryCode
  ).currencyCode
).symbol

3. modelis: pašreference ar doc kontekstu

Izmantojiet doc aprēķināmajiem laukiem, kas atsaucas uz citiem dokumentiem, balstoties uz pašreizējā dokumenta vērtībām.

// Produkta dokumentā iegūt saistītās kategorijas informāciju
documents.get("category", doc.categoryId).description

// Aprēķināt piegādes izmaksas pēc produkta izcelsmes valsts
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight

4. modelis: divvirzienu atsauces

Ja dokumenti atsaucas cits uz citu, uzmanieties no iegūšanas reižu limita.

documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })

5. modelis: polimorfas atsauces

Ja lauks var atsaukties uz dažādām shēmām:

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

Atkarību izsekošana

Katrs documents.get(), documents.find() un documents.ref().get() izsaukums tiek izsekots kešatmiņas anulēšanai. Kad mainās atsauces dokuments, CMS zina, kuras CEL izteiksmes jānovērtē atkārtoti.

Izsekojamās atkarības ietver:

  • get: schema:identifier — konkrēta dokumenta atkarība;
  • ref: schema:identifier — tas pats, izmantojot ķēdes sintaksi;
  • query: schema:* — shēmas līmeņa atkarība.

Labākā prakse atsaucēm

  1. Samaziniet ķēdes dziļumu — katrs līmenis palielina aizkavi un iegūšanas reižu skaitu.
  2. Kešojiet starprezultātus — ja viena ligzdota vērtība nepieciešama divreiz, vecāku iegūstiet tikai vienu reizi.
  3. Izmantojiet null pārbaudes — atsauces var pārstāt darboties, ja dokumenti tiek dzēsti.
  4. Dodiet priekšroku kodiem, nevis UUID — kodi izteiksmēs ir saprotami un stabili dažādās vidēs.
  5. Uzraugiet iegūšanas limitus — sarežģītas atsauču ķēdes ātri var sasniegt 50 iegūšanas reižu limitu.

A pielikums: pilnīgs parametriskā maršruta piemērs

Šajā piemērā tiek izveidota daudzvalodu galvenā lapa, kas pieejama vietnē /{lang}/landingPage.

1. darbība: izveidot sveiciena dokumenta shēmu

CMS administrēšanas vidē izveidojiet pielāgotu shēmu ar nosaukumu 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. darbība: izveidot sveiciena dokumentus

Izveidojiet dokumentu katrai valodai, izmantojot iepriekš minēto struktūru.

3. darbība: izveidot lapu

Izveidojiet lapu ar šādu konfigurāciju:

  • Ceļš/shēma: /{lang}/landingPage
  • Stāvoklis: publicēts
  • Dinamisko segmentu kartējumi: kartēt lang uz language komponenti.
{
  "lang": "language"
}

4. darbība: pievienot blokus ar CEL skriptiem

Pievienojiet maršrutam varoņa bloku ar šādiem CEL skriptiem:

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

// Apakšvirsraksts
documents.get("greeting", meta.params.lang).subheadline

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

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

5. darbība: izmantot Next.js

Pievienojiet visaptverošu maršrutu. ParametricRoutePage atrisina lapu, izvelk meta.params no URL, servera pusē novērtē CEL piesaistes un attēlo katru bloku, izmantojot reģistru.

// 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. darbība: pārbaudīt maršrutus

Apmeklējiet URL, lai skatītu lokalizētu saturu:

URLParedzamais virsraksts
/ko/landingPage환영
/en/landingPageWelcome
/ja/landingPageいらっしゃいませ

Kā notiek atrisināšana

Apmeklējot /ko/landingPage:

  1. Maršruta atbilstība: CMS atrod atbilstošu /{lang}/landingPage shēmu.
  2. Parametra izvilkšana: meta.params.lang = "ko".
  3. Validācija: CMS pārbauda, ka "ko" pastāv language shēmā.
  4. CEL novērtēšana: tādi skripti kā documents.get("greeting", meta.params.lang) tiek atrisināti līdz korejiešu saturam.
  5. Atbilde: klientam tiek atgriezti lokalizētie bloki.

B pielikums: tehniskā uzziņa

CelMeta saskarne (TypeScript)

interface CelMeta {
  /** Pašreizējais lokāles kods (piemēram, 'en-US') */
  locale: string;
  /** No URL izvilktie maršruta parametri */
  params: Record<string, string>;
  /** URL ceļa segmenti */
  segments: string[];
  /** Pašreizējā dokumenta ID (ja tiek rediģēts esošs dokuments) */
  docId: string | null;
  /** Pašreizējā dokumenta virsraksts */
  title: string;
}

Parametru izvilkšanas algoritms

Funkcija extractParams apstrādā URL ceļus:

Shēma: /{country}/{lang}/products
Ceļš:  /us/en/products

Algoritms:
1. Normalizēt abus ceļus (noņemt beigu slīpsvītras)
2. Sadalīt segmentos: ["us", "en", "products"] un ["{country}", "{lang}", "products"]
3. Salīdzināt segmentu skaitu (tam jābūt vienādam)
4. Katram segmentu pārim:
   - Ja shēma sākas ar : vai {}, izvilkt parametru
   - Pretējā gadījumā segmentiem precīzi jāsakrīt
5. Atgriezt: { country: "us", lang: "en" }

Atbalstītie parametru piesaistes formāti

// Vienkārša piesaiste (meklēšanai izmanto lauku "code")
{ "lang": "language" }

// Detalizēta piesaiste (pielāgots slug lauks)
{
  "lang": {
    "schemaName": "language",
    "slugField": "code"
  },
  "slug": {
    "schemaName": "article",
    "slugField": "slug"
  }
}

Dokumentu meklēšanas prioritāte

Iegūstot datus ar documents.get(schema, identifier):

  1. UUID atbilstība: ja identifikators ir derīgs UUID, meklēt pēc id.
  2. Code lauks: pārbaudīt content.code lauku.
  3. Slug lauks: pārbaudīt content.slug lauku.
  4. Virsraksta atbilstība: pārbaudīt title lauku.

Tas ļauj elastīgi atsaukties uz dokumentiem, izmantojot jebkuru unikālu identifikatoru.

Continue Reading
Previous‹Iestatīt administratora paneļa starpniekserveriNextProject Scaffolding›