Panduan praktis untuk menulis ekspresi CEL di CMS.
Panduan praktis untuk menulis ekspresi CEL di CMS.
CEL (Common Expression Language) adalah bahasa skrip ringan yang terintegrasi di CMS kami. CEL memungkinkan Anda menulis ekspresi dinamis yang dapat mengambil data dari dokumen, membaca parameter URL, dan menghitung nilai secara langsung.
Berikut yang terjadi saat skrip CEL dijalankan:
Skrip Anda Mesin Hasil
| | |
v v v
documents.get("article", "intro") --> Mengambil dari basis data --> { headline: "Welcome", body: "..." }
.headline --> Mengekstrak bidang --> "Welcome"
Anggap CEL sebagai bahasa kueri hanya-baca. CEL tidak dapat mengubah apa pun di basis data—hanya membaca data dan mengembalikan hasil yang dihitung. Hal ini membuatnya aman digunakan di mana saja dalam CMS.
Setiap ekspresi CEL dapat mengakses tiga hal:
| Objek | Penjelasan | Contoh |
|---|---|---|
documents | Mengambil dokumen apa pun dari CMS | documents.get("country", "us") |
meta | Informasi tentang permintaan saat ini (lokal, parameter URL) | meta.locale, meta.params.slug |
schema | Definisi bidang dokumen saat ini | schema.fields |
docSaat menulis ekspresi CEL di dalam editor dokumen, Anda dapat mengakses nilai bidang dokumen saat ini menggunakan objek doc. Ini memungkinkan pembuatan bidang terhitung dan referensi lintas bidang.
// Mengakses bidang harga dokumen saat ini
doc.price
// Menghitung total dari bidang dokumen saat ini
doc.price * doc.quantity
// Kondisi berdasarkan status dokumen saat ini
doc.status == "published" ? doc.title : "Draft: " + doc.title
Objek doc berisi semua nilai bidang dari dokumen yang sedang diedit. Ini berguna untuk:
doc.price * doc.quantity)Fitur CEL yang paling kuat adalah mengambil dokumen dari mana saja di CMS Anda.
Sintaks: documents.get(schemaName, identifier)
Misalkan Anda memiliki dokumen article yang disimpan dengan identifier "welcome-post":
// Disimpan di CMS sebagai: article / welcome-post
{
"headline": "Welcome to Our Platform",
"author": "Sarah Chen",
"body": "We're excited to announce...",
"tags": ["announcement", "news"]
}
Untuk mengambil seluruh dokumen:
documents.get("article", "welcome-post")
Mengembalikan:
{
"headline": "Welcome to Our Platform",
"author": "Sarah Chen",
"body": "We're excited to announce...",
"tags": ["announcement", "news"]
}
Untuk mengambil hanya headline:
documents.get("article", "welcome-post").headline
Mengembalikan: "Welcome to Our Platform"
Untuk mengambil penulis:
documents.get("article", "welcome-post").author
Mengembalikan: "Sarah Chen"
Saat halaman Anda memiliki rute dinamis (seperti /articles/[slug]), Anda dapat menggunakan meta.params untuk mendapatkan parameter URL dan mengambil dokumen yang tepat.
Jika seseorang mengunjungi /articles/welcome-post:
documents.get("article", meta.params.slug).headline
Mengembalikan: "Welcome to Our Platform"
Beginilah cara Anda membuat halaman dinamis—skrip CEL yang sama berfungsi untuk artikel apa pun, dengan menggunakan slug yang terdapat dalam URL.
Sintaks: documents.find(schemaName) atau documents.find(schemaName, filter)
// Mendapatkan semua negara
documents.find("country")
Mengembalikan:
[
{ "code": "us", "name": "United States", "flag": "US" },
{ "code": "sa", "name": "Saudi Arabia", "flag": "SA" },
{ "code": "gb", "name": "United Kingdom", "flag": "GB" }
]
// Mendapatkan negara dengan filter
documents.find("country", { "where": { "code": "us" } })
Mengembalikan:
[
{ "code": "us", "name": "United States", "flag": "US" }
]
CEL mendukung pengambilan konten dokumen yang diterjemahkan dengan dua cara: terjemahan otomatis berdasarkan lokal dan pencarian terjemahan eksplisit.
Saat meta.locale diatur (misalnya dari parameter rute atau preferensi pengguna), documents.get() secara otomatis menggabungkan konten yang diterjemahkan:
// Jika meta.locale adalah "fr", mengembalikan terjemahan bahasa Prancis yang digabungkan dengan dokumen dasar
documents.get("greeting", "welcome").headline
Cara kerjanya:
meta.locale bukan "en" atau "en-US", mencari terjemahan di tabel translations{ ...baseContent, ...translatedContent }Artinya, bidang yang diterjemahkan akan menggantikan bidang dasar, sedangkan bidang yang belum diterjemahkan menggunakan nilai dari dokumen dasar.
Untuk kasus ketika Anda perlu mengambil terjemahan tertentu terlepas dari lokal saat ini:
Sintaks: documents.translated(schemaName, identifier, locale)
// Selalu mengambil terjemahan bahasa Spanyol
documents.translated("greeting", "welcome", "es").headline
// Mengambil terjemahan berdasarkan parameter URL
documents.translated("product", meta.params.id, meta.params.lang).description
// Membandingkan terjemahan
documents.translated("article", "intro", "en").title + " / " + documents.translated("article", "intro", "fr").title
Dokumen sapaan Anda dengan terjemahan:
// Dokumen dasar: greeting / welcome
{ "headline": "Welcome", "subheadline": "Welcome to our platform" }
// Terjemahan (bahasa: "fr")
{ "headline": "Bienvenue", "subheadline": "Bienvenue sur notre plateforme" }
// Terjemahan (bahasa: "es")
{ "headline": "Bienvenido", "subheadline": "Bienvenido a nuestra plataforma" }
Skrip CEL:
// Dengan meta.locale = "fr"
documents.get("greeting", "welcome").headline
// Mengembalikan: "Bienvenue"
// Terjemahan bahasa Spanyol eksplisit
documents.translated("greeting", "welcome", "es").headline
// Mengembalikan: "Bienvenido"
// Pola fallback untuk terjemahan yang tidak tersedia
documents.translated("greeting", "welcome", meta.params.lang) != null
? documents.translated("greeting", "welcome", meta.params.lang).headline
: documents.get("greeting", "welcome").headline
Anda memiliki hero-block yang harus menampilkan headline dari dokumen article.
Dokumen artikel Anda (identifier: "homepage-hero"):
{
"headline": "Build Faster, Ship Smarter",
"subheadline": "The modern CMS for developers"
}
Skrip CEL pada bidang judul blok hero:
documents.get("article", "homepage-hero").headline
Hasil: Hero menampilkan "Build Faster, Ship Smarter"
Anda membuat halaman di /countries/[code] dan ingin menampilkan nama negara lengkap.
Dokumen negara Anda:
// country / us
{ "code": "us", "name": "United States", "flag": "US", "languages": ["en", "es"] }
// country / sa
{ "code": "sa", "name": "Saudi Arabia", "flag": "SA", "languages": ["ar", "en"] }
Skrip CEL:
documents.get("country", meta.params.code).name
Saat seseorang mengunjungi /countries/us:
meta.params.code = "us""United States"Saat seseorang mengunjungi /countries/sa:
meta.params.code = "sa""Saudi Arabia"Tampilkan headline yang berbeda berdasarkan lokal pengguna.
meta.locale == "ar-SA" ? "Welcome, everyone" : "Welcome"
Jika lokal adalah "ar-SA": Mengembalikan "Welcome, everyone"
Jika lokal lainnya: Mengembalikan "Welcome"
article Anda memiliki bidang countryCode, dan Anda ingin mendapatkan nama negara lengkap.
Dokumen artikel:
{ "headline": "News from the US", "countryCode": "us" }
Skrip CEL:
documents.get("country", documents.get("article", "us-news").countryCode).name
Yang terjadi:
documents.get("article", "us-news") mengembalikan { "headline": "News from the US", "countryCode": "us" }.countryCode mengekstrak "us"documents.get("country", "us") mengembalikan { "code": "us", "name": "United States", ... }.name mengekstrak "United States"Hasil: "United States"
Jika dokumen mungkin tidak ada, Anda dapat memberikan fallback:
documents.get("article", meta.params.slug) != null
? documents.get("article", meta.params.slug).headline
: "Article Not Found"
Atau periksa apakah bidang tertentu ada:
documents.get("article", "intro").author != null
? documents.get("article", "intro").author
: "Unknown Author"
Artikel Anda memiliki tag, dan Anda ingin memeriksa apakah tag tertentu ada:
"featured" in documents.get("article", "welcome-post").tags
Mengembalikan: true jika artikel memiliki tag "featured"
Mendapatkan tag pertama:
documents.get("article", "welcome-post").tags[0]
Mengembalikan: "announcement" (tag pertama)
Menghitung jumlah tag:
size(documents.get("article", "welcome-post").tags)
Mengembalikan: 2 (jumlah tag)
Rute parametris adalah kunci untuk membuat halaman dinamis dan terlokalisasi. Saat Anda menentukan pola rute seperti /{lang}/landingPage, CMS mengekstrak parameter dari URL dan membuatnya tersedia melalui meta.params.
Definisi Pola Rute:
Rute menggunakan sintaks :paramName atau {paramName} untuk menentukan segmen dinamis:
| Pola | Contoh URL | Parameter yang Diekstrak |
|---|---|---|
/:lang/landingPage | /ko/landingPage | { lang: "ko" } |
/{country}/{lang}/products | /us/en/products | { country: "us", lang: "en" } |
/articles/:slug | /articles/welcome-post | { slug: "welcome-post" } |
Pengikatan Parameter: Setiap parameter rute dapat diikat ke skema dokumen untuk validasi:
{
"pattern": "/{lang}/landingPage",
"param_bindings": {
"lang": "language"
}
}
Pengikatan ini memberi tahu CMS untuk:
lang dari URLlanguage (mencari dokumen dengan content.code yang cocok)Konfigurasi rute:
/{lang}/landingPage/{lang}/landingPage{ "lang": "language" }Dokumen sapaan Anda:
// 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" }
Skrip CEL untuk mengambil konten terlokalisasi:
documents.get("greeting", meta.params.lang).headline
Cara penyelesaiannya:
| URL | meta.params.lang | Hasil |
|---|---|---|
/ko/landingPage | "ko" | "Welcome" |
/en/landingPage | "en" | "Welcome" |
/ja/landingPage | "ja" | "Welcome" |
Untuk rute seperti /{country}/{lang}/products:
Konfigurasi rute:
{
"pattern": "/{country}/{lang}/products",
"param_bindings": {
"country": "country",
"lang": "language"
}
}
Skrip CEL:
// Mendapatkan nama negara
documents.get("country", meta.params.country).name
// Mendapatkan daftar produk berdasarkan negara
documents.find("product", { "where": { "country": meta.params.country } })
// Gabungan: Menampilkan sapaan khusus negara dalam bahasa pengguna
documents.get("greeting", meta.params.lang).headline + " from " + documents.get("country", meta.params.country).name
Rangkaian validasi:
CMS memvalidasi parameter secara hierarkis. Untuk rute /{country}/{lang}:
country terhadap skema countrylang terhadap skema languagelang ada dalam array country.languages[] (validasi hierarkis)meta.segments menyediakan path URL mentah sebagai array, berguna ketika Anda memerlukan akses berdasarkan posisi tanpa parameter bernama.
Cara kerjanya:
| Path URL | meta.segments |
|---|---|
/articles/tech/ai-news | ["articles", "tech", "ai-news"] |
/ko/landingPage | ["ko", "landingPage"] |
/us/en/products/featured | ["us", "en", "products", "featured"] |
/ | [] |
| Kasus Penggunaan | Pendekatan Terbaik |
|---|---|
| Parameter bernama dari pola rute | meta.params.lang |
| Akses berdasarkan posisi | meta.segments[0] |
| Mendapatkan kedalaman path | size(meta.segments) |
| Memeriksa apakah path berisi segmen | "admin" in meta.segments |
// Mendapatkan segmen pertama (sering kali kode bahasa)
meta.segments[0]
// Memeriksa kedalaman path
size(meta.segments) > 2 ? "deep" : "shallow"
// Memeriksa apakah berada di bagian admin
"admin" in meta.segments ? "admin mode" : "public mode"
// Fallback: Gunakan segmen jika parameter tidak diikat
has(meta.params.lang) ? meta.params.lang : meta.segments[0]
Objek meta berisi seluruh konteks tentang permintaan saat ini:
| Properti | Tipe | Deskripsi | |
|---|---|---|---|
meta.locale | string | Kode lokal saat ini (misalnya, "en-US", "ko-KR", "ar-SA") | |
meta.params | Record<string, string> | Parameter rute yang diekstrak dari pola URL | |
meta.segments | string[] | Path URL yang dipecah menjadi beberapa segmen | |
meta.docId | `string \ | null` | UUID dokumen saat ini (null untuk dokumen baru) |
meta.title | string | Judul dokumen saat ini |
Kode lokal mengikuti format BCP 47 (bahasa-wilayah):
// Memeriksa lokal untuk bahasa RTL
meta.locale == "ar-SA" || meta.locale == "he-IL" ? "rtl" : "ltr"
// Mendapatkan bagian bahasa saja
meta.locale.split("-")[0] // Tidak didukung - gunakan meta.params.lang sebagai gantinya
Parameter rute selalu berupa string. CMS memvalidasinya terhadap skema yang terikat sebelum evaluasi:
// Mengakses parameter bernama
meta.params.lang // "ko"
meta.params.country // "us"
meta.params.slug // "welcome-post"
// Memeriksa apakah parameter ada
has(meta.params.category) // true/false
// Menggunakannya dalam pengambilan dokumen
documents.get("greeting", meta.params.lang)
documents.ref("airports").get(meta.params.code)
Segmen URL mentah sebagai array:
// Mengakses berdasarkan indeks (berbasis 0)
meta.segments[0] // Segmen pertama
meta.segments[1] // Segmen kedua
// Memeriksa panjang
size(meta.segments) // Jumlah segmen
// Memeriksa keanggotaan
"products" in meta.segments // Apakah path menyertakan "products"?
UUID dokumen saat ini, berguna untuk skrip referensial mandiri:
// Hanya tersedia saat mengedit dokumen yang sudah ada
meta.docId != null ? "editing" : "creating new"
// Menggunakannya dalam logika kondisional
meta.docId != null ? documents.get("article", meta.docId).status : "draft"
Judul dokumen saat ini:
// Menggunakannya untuk tampilan
"Editing: " + meta.title
// Kondisional berdasarkan judul
meta.title.contains("Draft") ? "work in progress" : "published"
Untuk sintaks yang lebih bersih ketika skema sudah diketahui tetapi identifier bersifat dinamis:
// Pendekatan tradisional
documents.get("airports", meta.params.code).name
// Menggunakan ref() - skema dipisahkan dari identifier dinamis
documents.ref("airports").get(meta.params.code).name
Keduanya setara, tetapi ref() membuat bagian dinamis lebih jelas.
documents.get("schema", "identifier") // Mendapatkan satu dokumen
documents.get("schema", "id").fieldName // Mendapatkan bidang tertentu
documents.find("schema") // Mendapatkan semua dokumen
documents.find("schema", { "where": {...}}) // Kueri terfilter
documents.ref("schema").get(identifier) // Pencarian berantai
documents.translated("schema", "id", "fr") // Mendapatkan dengan lokal eksplisit
meta.locale // "en-US", "ar-SA", dll.
meta.params.xyz // Parameter URL bernama "xyz"
meta.segments // Path URL sebagai array: ["articles", "intro"]
meta.segments[0] // Segmen path pertama
meta.docId // ID dokumen saat ini (atau null)
meta.title // Judul dokumen saat ini
doc.fieldName // Nilai bidang dokumen saat ini (dalam konteks editor)
// Perbandingan
== != < <= > >=
// Logika
&& || !
// Ternary (if-else)
condition ? valueIfTrue : valueIfFalse
// Keanggotaan
"value" in listOrMap
size(list) // Menghitung item
size(string) // Panjang string
"text".startsWith("te") // true
"text".endsWith("xt") // true
"text".contains("ex") // true
has(object.property) // Memeriksa apakah properti ada
hasProperty(obj, "key") // Memeriksa apakah objek memiliki kunci (sintaks alternatif)
Jika terjadi kesalahan, Anda akan melihat salah satu pesan berikut:
| Kesalahan | Artinya |
|---|---|
SYNTAX_ERROR | Kesalahan ketik dalam skrip (kutip tidak ada, operator salah) |
TYPE_ERROR | Anda mencampur tipe yang tidak dapat digunakan bersama |
RUNTIME_ERROR | Skrip berjalan, tetapi mengalami masalah (variabel tidak terdefinisi) |
FETCH_LIMIT_EXCEEDED | Anda mengambil terlalu banyak dokumen (maksimal 50) |
TIMEOUT | Skrip berjalan terlalu lama (maksimal 5 detik) |
AST_DEPTH_EXCEEDED | Ekspresi terlalu dalam (kedalaman maksimal: 50) |
SCRIPT_TOO_LONG | Skrip melebihi batas 5000 karakter |
Mesin CEL dirancang agar dapat diperluas. Kemampuan yang direncanakan di masa mendatang meliputi:
// Mendatang: Memanggil layanan eksternal melalui MCP
mcp.translate(meta.params.text, "en", meta.params.lang)
mcp.analyze(documents.get("article", meta.params.id).body)
// Mendatang: Pembuatan konten bertenaga 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"])
Kemampuan ini akan ditambahkan melalui sistem fungsi terdaftar dengan tetap menjaga kompatibilitas mundur dengan skrip yang sudah ada.
documents. atau meta. dan editor akan menampilkan opsi yang tersediadocuments.get("schema", "id"), lalu tambahkan .fieldName!= null ? ... : ...documents.get() atau documents.find() dihitung dalam batas 50 pengambilanhas(meta.params.category) sebelum mengaksesnyaBagian ini membahas pola lanjutan untuk menghubungkan dokumen dan membangun struktur konten relasional.
Bentuk paling sederhana: satu dokumen mereferensikan dokumen lain berdasarkan identifier.
// Artikel menyimpan ID penulis, lalu mengambil nama penulis
documents.get("author", documents.get("article", "intro").authorId).name
Untuk sintaks yang lebih bersih ketika identifier bersifat dinamis:
// Pendekatan tradisional
documents.get("country", documents.get("airport", meta.params.code).countryCode).name
// Menggunakan ref() - lebih jelas ketika skema diketahui tetapi identifier dinamis
documents.ref("country").get(documents.get("airport", meta.params.code).countryCode).name
Bangun hubungan yang mendalam dengan merangkai beberapa pencarian:
// Bandara → Negara → Wilayah → Benua
documents.get("continent",
documents.get("region",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).regionCode
).continentCode
).name
Gabungkan referensi dokumen dengan terjemahan:
// Mendapatkan nama negara terlokalisasi untuk sebuah bandara
documents.translated("country",
documents.get("airport", meta.params.code).countryCode,
meta.params.lang
).name
Dokumen menyimpan ID yang merujuk ke dokumen lain.
// article / tech-news
{ "title": "Tech Update", "authorId": "author-123", "categoryId": "cat-tech" }
// Menyelesaikan nama penulis
documents.get("author", documents.get("article", meta.params.slug).authorId).name
// Menyelesaikan kategori dengan fallback
documents.get("article", meta.params.slug).categoryId != null
? documents.get("category", documents.get("article", meta.params.slug).categoryId).name
: "Uncategorized"
Dokumen saling merujuk menggunakan kode semantik, bukan 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" }
// Rantai Bandara → Negara → Mata Uang
documents.get("currency",
documents.get("country",
documents.get("airport", meta.params.code).countryCode
).currencyCode
).symbol
// Untuk JFK: Mengembalikan "$"
Gunakan doc untuk bidang terhitung yang merujuk ke dokumen lain berdasarkan nilai dokumen saat ini.
// Dalam dokumen produk, mengambil detail kategori terkait
documents.get("category", doc.categoryId).description
// Biaya pengiriman terhitung berdasarkan negara asal produk
documents.get("shipping-rates", doc.originCountry).baseRate * doc.weight
Saat dokumen saling merujuk, berhati-hatilah terhadap batas pengambilan data.
// Mendapatkan penulis artikel, lalu artikel lain milik penulis tersebut (perhatikan jumlah pengambilan!)
documents.find("article", { "where": { "authorId": documents.get("article", meta.params.slug).authorId } })
Saat sebuah bidang dapat merujuk ke skema yang berbeda:
// content-block / hero-1
{ "type": "hero", "sourceType": "article", "sourceId": "welcome-post" }
// content-block / hero-2
{ "type": "hero", "sourceType": "product", "sourceId": "featured-item" }
// Pencarian skema dinamis berdasarkan 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
Setiap pemanggilan documents.get(), documents.find(), dan documents.ref().get() dilacak untuk invalidasi cache. Saat dokumen yang dirujuk berubah, CMS mengetahui ekspresi CEL mana yang perlu dievaluasi ulang.
Dependensi yang dilacak meliputi:
schema:identifier - Dependensi dokumen tertentuschema:identifier - Sama seperti get, melalui sintaks berantaischema:* - Dependensi tingkat skema (dokumen apa pun dalam skema)Panduan ini membuat landing page multibahasa yang dapat diakses di /{lang}/landingPage.
Di admin CMS, buat skema khusus bernama 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" }
]
}
Buat dokumen untuk setiap bahasa:
Dokumen: greeting/ko
{
"code": "ko",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/ko/get-started"
}
Dokumen: greeting/en
{
"code": "en",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Get Started",
"ctaUrl": "/en/get-started"
}
Dokumen: greeting/ja
{
"code": "ja",
"headline": "Welcome",
"subheadline": "Welcome to our platform",
"ctaText": "Start",
"ctaUrl": "/ja/get-started"
}
Buat halaman dengan konfigurasi berikut:
/{lang}/landingPagelang → komponen language {
"lang": "language"
}
Tambahkan blok hero ke rute dengan skrip CEL berikut untuk setiap bidang:
Bidang Headline:
documents.get("greeting", meta.params.lang).headline
Bidang Subheadline:
documents.get("greeting", meta.params.lang).subheadline
Bidang Teks CTA:
documents.get("greeting", meta.params.lang).ctaText
Bidang URL CTA:
documents.get("greeting", meta.params.lang).ctaUrl
Tambahkan rute catch-all. ParametricRoutePage menyelesaikan halaman, mengekstrak meta.params dari URL, mengevaluasi binding CEL Anda di sisi server, dan merender setiap blok melalui registry Anda—Anda tidak perlu membuat konteks meta atau memanggil klien tingkat rendah sendiri.
// 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 })}
/>
);
}
Kunjungi URL berikut untuk melihat konten terlokalisasi:
| URL | Headline yang Diharapkan |
|---|---|
/ko/landingPage | 환영 |
/en/landingPage | Welcome |
/ja/landingPage | いらっしゃいませ |
Saat pengguna mengunjungi /ko/landingPage:
/{lang}/landingPagemeta.params.lang = "ko"languagedocuments.get("greeting", meta.params.lang) diselesaikan menjadi konten bahasa Koreainterface CelMeta {
/** Kode lokal saat ini (misalnya, 'en-US') */
locale: string;
/** Parameter rute yang diekstrak dari URL */
params: Record<string, string>;
/** Segmen path URL */
segments: string[];
/** ID dokumen saat ini (jika sedang mengedit dokumen yang sudah ada) */
docId: string | null;
/** Judul dokumen saat ini */
title: string;
}
Fungsi extractParams memproses path URL:
Pola: /{country}/{lang}/products
Path: /us/en/products
Algoritme:
1. Normalisasi keduanya (hapus garis miring di akhir)
2. Pecah menjadi segmen: ["us", "en", "products"] dan ["{country}", "{lang}", "products"]
3. Cocokkan jumlah segmen (harus sama)
4. Untuk setiap pasangan segmen:
- Jika pola diawali : atau {}, ekstrak sebagai parameter
- Jika tidak, harus cocok persis
5. Kembalikan: { country: "us", lang: "en" }
// Pengikatan sederhana (menggunakan bidang "code" untuk pencarian)
{ "lang": "language" }
// Pengikatan terperinci (bidang slug khusus)
{
"lang": {
"schemaName": "language",
"slugField": "code"
},
"slug": {
"schemaName": "article",
"slugField": "slug"
}
}
Saat mengambil melalui documents.get(schema, identifier):
idcontent.codecontent.slugtitleHal ini memungkinkan referensi dokumen yang fleksibel menggunakan identifier unik apa pun.