Kolekce
Definujte typy obsahu pomocí TypeScript schémat a validace polí. Kolekce jsou základem vašeho obsahového modelu v CatCMS.[object Object]
Přehled
Kolekce definují vaše typy obsahu pomocí TypeScript schémat. Každá kolekce automaticky získá:
- Typově bezpečné databázové schéma
- Automatické API koncové body
- Administrační rozhraní pro správu obsahu
- Validaci polí a omezení
- Správu verzí pomocí git
Dva typy kolekcí
Kolekce spravované konfigurací:
- Definované v TypeScript souborech (
src/collections/*.collection.ts) - Verzované společně s vaší kódovou základnou
- Automaticky synchronizované při spuštění aplikace
- Uzamčené pro úpravy v administračním rozhraní (označeno štítkem “Config”)
- Typově bezpečné s automatickým doplňováním v IDE
Kolekce vytvořené v rozhraní:
- Vytvářené a upravované prostřednictvím administračního rozhraní
- Uložené přímo в databázi
- Neverzované
- Plně upravitelné v rozhraní
- Skvělé pro rychlé prototypování
Vytváření kolekcí
Základní kolekce
Vytvořte nový soubor v src/collections/ s .collection.ts příponou:
// src/collections/blog-posts.collection.ts
import { CollectionConfig } from 'catcms-core'
export const blogPostsCollection: CollectionConfig = {
name: 'blog_posts',
displayName: 'Blog Posts',
description: 'Articles and blog content',
schema: {
type: 'object',
properties: {
title: {
type: 'string',
required: true,
minLength: 3,
maxLength: 200
},
slug: {
type: 'slug',
required: true
},
content: {
type: 'richtext',
required: true
},
excerpt: {
type: 'textarea',
maxLength: 500
},
author: {
type: 'reference',
collection: 'users',
required: true
},
publishDate: {
type: 'datetime',
required: true
},
status: {
type: 'select',
enum: ['draft', 'published', 'archived'],
default: 'draft'
}
}
},
icon: '📝',
color: 'blue',
managed: true,
isActive: true,
defaultSort: 'created_at',
defaultSortOrder: 'desc',
listFields: ['title', 'author', 'publishDate', 'status'],
searchFields: ['title', 'excerpt', 'content']
}
Blog Posts Collection
Synchronizace kolekcí
Kolekce se automaticky synchronizují při spuštění serveru. Můžete je také synchronizovat ručně:
# Collections auto-sync on server restart
npm run dev
# Or manually sync
npm run sync-collectionsSync Collections
Typy polí
CatCMS podporuje více než 30 typů polí pro vytváření bohatých obsahových schémat:
Textová pole
- Name
string- Type
- string
- Description
Jednořádkový textový vstup. Použijte pro titulky, jména, krátký text.
- Name
textarea- Type
- string
- Description
Víceřádkový prostý text. Použijte pro popisy, poznámky, dlouhý text.
- Name
email- Type
- string
- Description
E-mail s validací. Použijte pro kontaktní e-maily, informace o autorovi.
- Name
url- Type
- string
- Description
URL s validací. Použijte pro odkazy, externí zdroje.
- Name
slug- Type
- string
- Description
Identifikátor přátelský k URL. Použijte pro URL stránek, SEO cesty.
- Name
color- Type
- string
- Description
Výběr barvy. Použijte pro barvy motivu, přizpůsobení rozhraní.
Bohatý obsah
- Name
richtext- Type
- string
- Description
WYSIWYG HTML editor. Použijte pro blogové příspěvky, články, formátovaný obsah.
- Name
markdown- Type
- string
- Description
Markdown editor. Použijte pro dokumentaci, technický obsah.
- Name
json- Type
- object
- Description
JSON editor. Použijte pro strukturovaná data, odpovědi API.
Čísla a data
- Name
number- Type
- number
- Description
Číselný vstup. Použijte pro ceny, množství, hodnocení.
- Name
date- Type
- string
- Description
Výběr data (bez času). Použijte pro narozeniny, termíny.
- Name
datetime- Type
- string
- Description
Výběr data a času. Použijte pro data publikace, události.
Výběry
- Name
select- Type
- string
- Description
Rozbalovací seznam (jedna volba). Použijte pro kategorie, stavová pole.
- Name
multiselect- Type
- array
- Description
Rozbalovací seznam (více voleb). Použijte pro štítky, více kategorií.
- Name
radio- Type
- string
- Description
Přepínače. Použijte pro stav, možnosti viditelnosti.
- Name
checkbox- Type
- boolean
- Description
Zaškrtávací políčko (boolean). Použijte pro přepínače funkcí, příznaky.
Média a soubory
- Name
media- Type
- string
- Description
Výběr obrázku/média. Použijte pro hlavní obrázky, avatary.
- Name
file- Type
- string
- Description
Nahrání souboru. Použijte pro PDF, dokumenty, soubory ke stažení.
Vztahy
- Name
reference- Type
- string
- Description
Odkaz na jinou kolekci. Použijte pro autory, kategorie.
- Name
array- Type
- array
- Description
Pole položek. Může obsahovat jakýkoli typ pole.
Validace
Vestavěné validátory
export const productsCollection: CollectionConfig = {
name: 'products',
displayName: 'Products',
schema: {
type: 'object',
properties: {
name: {
type: 'string',
required: true,
minLength: 3,
maxLength: 200
},
sku: {
type: 'string',
required: true,
pattern: '^[A-Z0-9-]+$' // Only uppercase, numbers, hyphens
},
price: {
type: 'number',
required: true,
minimum: 0,
maximum: 999999
},
email: {
type: 'email',
required: true
},
url: {
type: 'url',
required: false
},
status: {
type: 'select',
enum: ['draft', 'active', 'archived'],
default: 'draft'
}
}
},
managed: true,
isActive: true
}Field Validation
Validační pravidla
- required - Pole musí mít hodnotu
- minLength / maxLength - Omezení délky řetězce
- minimum / maximum - Omezení číselného rozsahu
- pattern - Validace pomocí regulárního výrazu
- enum - Musí být jedna ze zadaných hodnot
- default - Výchozí hodnota, pokud není zadána
Příklady
Produkt e-shopu
export const productsCollection: CollectionConfig = {
name: 'products',
displayName: 'Products',
description: 'E-commerce product catalog',
schema: {
type: 'object',
properties: {
name: {
type: 'string',
required: true
},
sku: {
type: 'string',
required: true
},
price: {
type: 'number',
required: true,
minimum: 0
},
description: {
type: 'richtext'
},
images: {
type: 'array',
items: {
type: 'media',
accept: 'image/*'
}
},
category: {
type: 'select',
enum: ['electronics', 'clothing', 'home', 'sports']
},
inStock: {
type: 'boolean',
default: true
},
tags: {
type: 'array',
items: { type: 'string' }
}
}
},
icon: '🛍️',
managed: true,
isActive: true
}Product Collection
Stránka dokumentace
export const docsCollection: CollectionConfig = {
name: 'documentation',
displayName: 'Documentation',
schema: {
type: 'object',
properties: {
title: {
type: 'string',
required: true
},
slug: {
type: 'slug',
required: true
},
content: {
type: 'markdown',
required: true
},
category: {
type: 'select',
enum: ['getting-started', 'api', 'guides', 'reference']
},
order: {
type: 'number',
default: 0
},
published: {
type: 'boolean',
default: false
}
}
},
icon: '📚',
managed: true,
isActive: true
}Docs Collection
Správa událostí
export const eventsCollection: CollectionConfig = {
name: 'events',
displayName: 'Events',
schema: {
type: 'object',
properties: {
title: {
type: 'string',
required: true
},
description: {
type: 'richtext'
},
startDate: {
type: 'datetime',
required: true
},
endDate: {
type: 'datetime',
required: true
},
location: {
type: 'string'
},
virtualLink: {
type: 'url'
},
capacity: {
type: 'number',
minimum: 1
},
registration: {
type: 'boolean',
default: false
},
organizer: {
type: 'reference',
collection: 'users'
}
}
},
icon: '📅',
managed: true,
isActive: true
}Events Collection
Používání kolekcí
Dotazování na obsah
// Get all content from a collection
const posts = await db.select()
.from(content)
.where(eq(content.collection_id, 'blog_posts'))
.orderBy(desc(content.created_at))
.limit(10)
// Get single content item
const post = await db.select()
.from(content)
.where(eq(content.id, postId))
.get()
// Search content
const results = await db.select()
.from(content)
.where(
and(
eq(content.collection_id, 'blog_posts'),
like(content.title, '%search%')
)
)
.all()
Fetch Collection Content
Koncové body API
Kolekce automaticky získávají REST API koncové body:
/api/collections/{collection}/content /api/content/{id} /admin/content Auth required/admin/content/{id} Auth required/admin/content/{id} Auth requiredOsvědčené postupy
Collection Design Tips
- Používejte popisné názvy polí, které odrážejí váš obsahový model - Nastavte vhodná validační pravidla pro udržení kvality dat - Používejte reference pro vztahy mezi kolekcemi - Povolte vyhledávání na polích, na která se uživatelé budou často dotazovat - Nastavte rozumné výchozí hodnoty pro volitelná pole
Performance Considerations
- Omezte počet polí v
listFieldspro zlepšení výkonu výpisů - Používejte vhodné typy polí (např.selectmístostringpro pevně dané možnosti) - Indexujte často dotazovaná pole ve vaší databázi
Další kroky