Перейти к содержимому

Управление контентом

Headless CMS с коллекциями, записями, локалями и релизами. Управляй контентом через панель Content или SDK.

Proyecta имеет полноценную headless CMS. Она построена по принципу «schema first»: ты определяешь коллекции (структурированные типы контента), а затем создаёшь записи, соответствующие полям каждой коллекции. Записи можно локализовать и объединять в релизы.

Контентом можно управлять через SDK или с помощью AI. Content API включает шесть типов ресурсов:

Вкладка / РесурсНазначение
CollectionsОпределение и управление схемами контента (например, «Blog Post», «FAQ», «Product Spec»)
FieldsТипизированные поля внутри коллекции (управляются как вложенный ресурс Collections)
EntriesПросмотр, создание, редактирование, публикация и удаление записей внутри коллекции
LocalesДобавление и управление локалями языков/регионов для переведённого контента
ReleasesГруппировка записей для одновременного выхода (или снятия с публикации); ручная публикация через releases.publish()
AssetsЗагрузка медиафайлов (изображений, видео, PDF) и управление ими — на них можно ссылаться из записей

Нажми на коллекцию во вкладке Collections, чтобы перейти к её записям. Вкладка Entries позволяет создавать, редактировать, публиковать и удалять отдельные элементы контента.

Всем этим также можно управлять программно через SDK (proyecta.content).

ПонятиеОписание
CollectionСхема — структура одного типа контента (например, «Blog Post», «FAQ», «Product Spec»)
FieldТипизированное поле в коллекции (например, title: string, body: rich_text, coverImage: asset)
EntryОтдельный экземпляр коллекции (одна статья блога, один элемент FAQ)
AssetЗагруженный медиафайл, на который можно ссылаться из записей
LocaleЯзык/регион, на который переведён контент
ReleaseГруппа записей, которые выходят (или снимаются с публикации) одновременно
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);

Записи — это фактические строки контента. Каждая запись принадлежит коллекции и содержит данные, соответствующие полям этой коллекции.

// 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);

Загрузка медиафайлов является полноценным инструментом — используй их для прикрепления изображений, видео или PDF к своим записям:

// 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

Для загрузки файлов через чат (перетаскивание в builder) см. раздел Файлы и медиа.

Контент можно переводить на несколько локалей. Каждая локаль — это запись, управляемая через proyecta.content.locales:

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

При получении записей можно запросить перевод для конкретной локали. Полную картину интернационализации см. в разделе Интернационализация.

Релиз — это набор записей, которые выходят (или снимаются с публикации) одновременно. Это позволяет подготовить скоординированный выход контента — маркетинговый запуск, новую страницу продукта, обновление FAQ — и переключить всё атомарно.

Примечание: Автоматическая публикация по расписанию пока не реализована. Релизы с указанной датой scheduled_at переходят в статус scheduled, но должны публиковаться вручную через releases.publish(). Автопубликация в указанное время появится в ближайшее время.

// 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);
}

Чтобы изменить расписание релиза, удали его и создай заново — endpoint для обновления отсутствует.

Типовые сценарии (попроси AI всё настроить)

Заголовок раздела «Типовые сценарии (попроси AI всё настроить)»
  • "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."
Сценарий использованияИспользуй
Редакционный контент (статьи, FAQ, маркетинговые тексты) — нужны статусы публикации/черновика, расписание, локализацияContent API
Данные приложения (пользователи, заказы, позиции) — нужна скорость запросов, транзакции, реальное времяDatabase
Статичные ресурсы в кодеДиректория public/ в твоём проекте
Файлы, загружаемые пользователямиФайлы и медиа
  • Редактор rich-text записей — полноценное WYSIWYG-редактирование полей rich_text в панели Content
  • Live preview изменений контента в контексте твоего приложения
  • Content roles — разграничение прав редакторов и разработчиков