Salta ai contenuti

Gestione dei Contenuti

Un CMS headless con collezioni, voci, localizzazioni e release. Gestisci i contenuti dal pannello Content o tramite l’SDK.

Proyecta include un CMS headless completo. È basato su schema: definisci le collezioni (tipi di contenuto strutturato), poi crei le voci conformi ai campi di ciascuna collezione. Le voci possono essere localizzate e raggruppate in release.

I contenuti possono essere gestiti tramite l’SDK o chiedendo all’AI. La Content API dispone di sei tipi di risorse:

Tab / RisorsaA cosa serve
CollectionsDefinisce e gestisce gli schemi dei contenuti (es. “Blog Post”, “FAQ”, “Product Spec”)
FieldsSlot tipizzati all’interno di una collezione (gestiti come sotto-risorsa di Collections)
EntriesSfoglia, crea, modifica, pubblica ed elimina voci all’interno di una collezione
LocalesAggiunge e gestisce le localizzazioni lingua/regione per i contenuti tradotti
ReleasesRaggruppa le voci da pubblicare (o da rimuovere) insieme; pubblica manualmente tramite releases.publish()
AssetsCarica e gestisce file multimediali (immagini, video, PDF) referenziabili dalle voci

Clicca su una collezione nella tab Collections per passare direttamente alle sue voci. La tab Entries ti permette di creare, modificare, pubblicare ed eliminare singoli elementi di contenuto.

Puoi anche gestire tutto in modo programmatico tramite l’SDK (proyecta.content).

ConcettoCos’è
CollectionUno schema — la struttura di un tipo di contenuto (es. “Blog Post”, “FAQ”, “Product Spec”)
FieldUno slot tipizzato in una collezione (es. title: string, body: rich_text, coverImage: asset)
EntryUna singola istanza di una collezione (un articolo del blog, un elemento FAQ)
AssetUn file multimediale caricato e referenziabile dalle voci
LocaleUna lingua/regione in cui il contenuto viene tradotto
ReleaseUn gruppo di voci pianificate per andare online (o essere rimosse) contemporaneamente
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);

Le voci sono le righe di contenuto effettive. Ogni voce appartiene a una collezione e contiene dati conformi ai campi di quella collezione.

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

I caricamenti di asset sono di prima classe — usali per allegare immagini, video o PDF alle tue voci:

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

Per i caricamenti di file tramite chat (trascina nel builder), consulta File e Media.

I contenuti possono essere tradotti in più localizzazioni. Ogni localizzazione è un record gestito tramite proyecta.content.locales:

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

Quando recuperi le voci, puoi richiedere la traduzione di una specifica localizzazione. Consulta Internazionalizzazione per una visione più ampia dell’i18n.

Una release è un insieme di voci che vanno online (o vengono rimosse) contemporaneamente. Questo ti permette di pianificare un lancio coordinato di contenuti — un lancio marketing, una nuova pagina prodotto, un aggiornamento delle FAQ — e di far scattare tutto in modo atomico.

Nota: La pubblicazione automatica programmata non è ancora implementata. Le release con una data scheduled_at entrano nello stato scheduled ma devono essere pubblicate manualmente tramite releases.publish(). La pubblicazione automatica all’orario specificato è in arrivo.

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

Per modificare la pianificazione di una release, eliminala e ricreala — non è disponibile un endpoint di aggiornamento.

  • "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."
Caso d’usoUsa questo
Contenuti editoriali (articoli, FAQ, testi marketing) — richiede stati pubblicato/bozza, pianificazione, localizzazioneContent API
Dati applicativi (utenti, ordini, righe d’ordine) — richiede velocità di query, transazioni, dati in tempo realeDatabase
Asset statici nel codiceDirectory public/ nel tuo progetto
File caricati dagli utentiFile e Media
  • Editor di voci rich-text — modifica WYSIWYG completa per i campi rich_text nel pannello Content
  • Anteprima live delle modifiche ai contenuti nella tua app
  • Ruoli per i contenuti — permessi separati per editor e sviluppatori