Un proiect ține conținutul unui site sau al unei aplicații. Structura lui e un set de tipuri, fiecare cu câmpurile lui, plus o listă de limbi.
Tipuri
| Fel | Ține | Se citește cu |
|---|---|---|
| Colecție | mai multe intrări: articole, produse, evenimente | entries(type), entry(type, slug) |
| Singleton | o singură intrare: setările site-ului, pagina de start | singleton(type) |
Fiecare tip are o cheie (article, site_settings), un nume și un câmp de titlu, pe care admin-ul îl folosește ca titlu al intrării în liste, la căutare și în referințe. Cheile au litere mici, cifre și liniuțe jos și încep cu o literă.
Câmpuri
| Tip | Ține | De știut |
|---|---|---|
text | un text scurt | implicit cel mult 500 de caractere |
longtext | un text lung | implicit cel mult 20.000 de caractere |
number | un număr | opțional min, max, integer |
boolean | adevărat sau fals | |
date | 2026-10-12 | |
datetime | 2026-10-12T18:00:00.000Z | primește orice fus orar, întoarce UTC |
time | 18:30 | ceas de 24 de ore |
select | o valoare sau, cu multiple, mai multe | dintr-o listă fixă de opțiuni |
slug | primul-meu-articol | unic în tip, poate urma un câmp de text cu from |
url | https://exemplu.ro | doar http și https |
email | salut@exemplu.ro | se păstrează cu litere mici |
color | #1f5c4a | hex cu șase cifre |
reference | id-ul altei intrări | to limitează tipurile, multiple permite mai multe |
list | elemente repetate, fiecare cu câmpurile lui | cel mult 500 de elemente |
group | câmpuri ținute împreună | |
json | orice valoare JSON | pentru date care nu au încă un formular |
media | un fișier din biblioteca media sau, cu multiple, mai multe | kinds îl limitează la imagini, video sau fișiere; imaginile cer text alternativ la publicare |
rich_text | text formatat: titluri, liste, citate, cod, linkuri și imagini | vine ca JSON și ca HTML sigur |
embed | un video de pe YouTube sau Vimeo | merge orice link spre video, se păstrează furnizorul și id-ul |
blocks | secțiunile unei pagini: o listă ordonată de blocuri, fiecare de un fel pe care îl definești, cu câmpurile lui | doar pe primul nivel; lista e comună tuturor limbilor, câmpurile din bloc se pot traduce |
Câmpurile se pot pune în liste și grupuri pe cel mult trei niveluri.
Fiecare câmp mai poate avea:
- required: publicarea așteaptă până are o valoare, în fiecare limbă pentru câmpurile care se traduc
- help: un rând sub câmp, în editor
- maxLength și pattern pentru text; tiparele rulează pe RE2, deci se termină mereu în timp liniar
- unique pentru
textșislug
Limbi
Un proiect are o listă de limbi și o limbă principală, de exemplu en și ro, cu en principală. Un câmp marcat pe limbă ține câte o valoare pentru fiecare limbă; celelalte țin o singură valoare.
Când ceri din Delivery API locale=ro, fiecare câmp tradus vine în română, iar un câmp fără valoare în română cade pe limba principală, câmp cu câmp. _locale de pe fiecare intrare spune ce limbă ai cerut.
Ciorne, versiuni și publicare
Fiecare salvare e o versiune pe care o poți deschide și restaura. O intrare are una dintre trei stări:
- draft: nepublicată niciodată, invizibilă pentru Delivery API
- published: copia live e la fel cu ultima salvare
- changed: publicată, cu modificări noi care așteaptă
Publicarea copiază versiunea curentă în copia live, dintr-un singur pas. Retragerea o scoate din Delivery API; intrarea și versiunile ei rămân în admin.
Schimbarea structurii
Poți adăuga, redenumi și reordona câmpuri oricând. Un câmp șters își păstrează datele, așa că, dacă îl aduci înapoi, revin și valorile. Delivery API întoarce doar câmpurile din structura de acum, deci un câmp șters nu ajunge pe site.
Dacă structura se schimbă cât cineva are o intrare deschisă, salvarea întoarce 409 schema_changed, iar editorul îi cere să reîncarce pagina, ca nimeni să nu suprascrie un câmp pe care nu l-a văzut.