Przejdź do głównej zawartości

Zarządzanie treścią

Headless CMS z kolekcjami, wpisami, lokalizacjami i wydaniami. Zarządzaj treścią z poziomu panelu Content lub SDK.

Proyecta posiada pełnoprawny headless CMS. Opiera się on na schemacie: definiujesz kolekcje (ustrukturyzowane typy treści), a następnie tworzysz wpisy zgodne z polami każdej kolekcji. Wpisy mogą być lokalizowane i grupowane w wydania.

Treścią można zarządzać za pomocą SDK lub przez rozmowę z AI. Content API udostępnia sześć typów zasobów:

Zakładka / ZasóbDo czego służy
CollectionsDefiniowanie i zarządzanie schematami treści (np. „Blog Post”, „FAQ”, „Product Spec”)
FieldsTypowane pola w kolekcji (zarządzane jako podzasób kolekcji)
EntriesPrzeglądanie, tworzenie, edytowanie, publikowanie i usuwanie wpisów w kolekcji
LocalesDodawanie i zarządzanie lokalizacjami językowymi/regionalnymi dla przetłumaczonej treści
ReleasesGrupowanie wpisów, które mają zostać opublikowane (lub wycofane) razem; ręczna publikacja przez releases.publish()
AssetsPrzesyłanie i zarządzanie plikami multimedialnymi (obrazy, filmy, PDF-y) dostępnymi z poziomu wpisów

Kliknij kolekcję w zakładce Collections, aby przejść do jej wpisów. Zakładka Entries umożliwia tworzenie, edytowanie, publikowanie i usuwanie pojedynczych elementów treści.

Wszystkim można też zarządzać programowo za pomocą SDK (proyecta.content).

PojęcieOpis
CollectionSchemat — struktura jednego typu treści (np. „Blog Post”, „FAQ”, „Product Spec”)
FieldTypowane pole w kolekcji (np. title: string, body: rich_text, coverImage: asset)
EntryPojedyncza instancja kolekcji (jeden wpis na blogu, jeden element FAQ)
AssetPrzesłany plik multimedialny dostępny z poziomu wpisów
LocaleJęzyk/region, na który treść jest tłumaczona
ReleaseGrupa wpisów zaplanowanych do równoczesnego opublikowania (lub wycofania)
import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collection
const blog = await proyecta.content.collections.create({
api_id: 'blogPost',
name: 'Blog Post',
// fields are added via collections.fields.create()
});
// 2. Create an entry
const post = await proyecta.content.entries.create({
collection_id: blog.id,
data: {
title: 'Hello, world',
body: 'My very first post.',
},
});
// 3. Publish it
await proyecta.content.entries.publish({ entryId: post.id });
// Browse collections
for await (const collection of proyecta.content.collections.list()) {
console.log(collection.name);
}
// Add or remove fields on a collection
await proyecta.content.collections.fields.create(blog.id, {
/* field definition */
});
await proyecta.content.collections.fields.delete(blog.id, fieldId);

Wpisy to właściwe wiersze treści. Każdy wpis należy do kolekcji i przechowuje dane zgodne z polami tej kolekcji.

// Browse entries (pass the collection's api_id, not its numeric id)
for await (const entry of proyecta.content.entries.list({ collection: 'blogPost' })) {
console.log(entry);
}
// Update an entry
await proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entry
await proyecta.content.entries.publish({ entryId: post.id });
// Delete an entry
await proyecta.content.entries.delete(post.id);

Przesyłanie plików jest traktowane priorytetowo — użyj assetów, aby dołączyć obrazy, filmy lub PDF-y do swoich wpisów:

// Browse assets
for await (const asset of proyecta.content.assets.list()) {
console.log(asset);
}
// Upload, update, or delete via assets.create / assets.update / assets.delete

Informacje o przesyłaniu plików przez czat (przeciąganie do buildera) znajdziesz w sekcji Pliki i media.

Treść może być tłumaczona na wiele lokalizacji. Każda lokalizacja to rekord zarządzany przez proyecta.content.locales:

await proyecta.content.locales.create({
/* code, name, etc. */
});
for await (const locale of proyecta.content.locales.list()) {
console.log(locale);
}

Podczas pobierania wpisów możesz zażądać tłumaczenia dla konkretnej lokalizacji. Szerszy obraz internacjonalizacji znajdziesz w sekcji Internacjonalizacja.

Wydanie to paczka wpisów, które mają zostać opublikowane (lub wycofane) w tym samym momencie. Pozwala to przygotować skoordynowaną aktualizację treści — launch marketingowy, nową stronę produktu, odświeżenie FAQ — i opublikować wszystko atomowo.

Uwaga: Automatyczna publikacja o określonej godzinie nie jest jeszcze zaimplementowana. Wydania z ustawioną datą scheduled_at otrzymują status scheduled, ale muszą być opublikowane ręcznie przez releases.publish(). Autopublikacja o wskazanym czasie jest w planach.

// Create a release (optionally with a target date)
const release = await proyecta.content.releases.create({
name: 'Monday launch',
scheduled_at: '2024-01-08T09:00:00Z',
});
// Manually publish a release when ready
await proyecta.content.releases.publish({ releaseId: release.id });
// Browse releases
for await (const r of proyecta.content.releases.list()) {
console.log(r);
}

Aby zmienić harmonogram wydania, usuń je i utwórz ponownie — endpoint do aktualizacji nie istnieje.

  • "Build a blog using the Proyecta Content API. Collection 'Blog Post' with fields: title, slug, excerpt, body (rich text), coverImage (asset), author. Public route at /blog and /blog/[slug]."
  • "Create an FAQ collection in Proyecta Content. Build an admin page where I can add/edit FAQs and a public /faq page."
  • "Set up a multi-language landing page using Proyecta Content with English and Spanish locales."
  • "Create a release containing three blog posts and publish it manually when ready."
Przypadek użyciaUżyj tego
Treści redakcyjne (wpisy, FAQ, teksty marketingowe) — wymagają stanów publikacji/szkicu, harmonogramowania, lokalizacjiContent API
Dane aplikacji (użytkownicy, zamówienia, pozycje) — wymagają szybkich zapytań, transakcji, czasu rzeczywistegoDatabase
Zasoby statyczne w kodziekatalog public/ w projekcie
Pliki przesyłane przez użytkownikówPliki i media
  • Edytor treści rich-text — pełny edytor WYSIWYG dla pól rich_text w panelu Content
  • Podgląd na żywo zmian treści w kontekście aplikacji
  • Role w Content — oddzielenie uprawnień redaktora od uprawnień dewelopera