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.
Il pannello Content
Sezione intitolata “Il pannello Content”I contenuti possono essere gestiti tramite l’SDK o chiedendo all’AI. La Content API dispone di sei tipi di risorse:
| Tab / Risorsa | A cosa serve |
|---|---|
| Collections | Definisce e gestisce gli schemi dei contenuti (es. “Blog Post”, “FAQ”, “Product Spec”) |
| Fields | Slot tipizzati all’interno di una collezione (gestiti come sotto-risorsa di Collections) |
| Entries | Sfoglia, crea, modifica, pubblica ed elimina voci all’interno di una collezione |
| Locales | Aggiunge e gestisce le localizzazioni lingua/regione per i contenuti tradotti |
| Releases | Raggruppa le voci da pubblicare (o da rimuovere) insieme; pubblica manualmente tramite releases.publish() |
| Assets | Carica 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).
Concetti
Sezione intitolata “Concetti”| Concetto | Cos’è |
|---|---|
| Collection | Uno schema — la struttura di un tipo di contenuto (es. “Blog Post”, “FAQ”, “Product Spec”) |
| Field | Uno slot tipizzato in una collezione (es. title: string, body: rich_text, coverImage: asset) |
| Entry | Una singola istanza di una collezione (un articolo del blog, un elemento FAQ) |
| Asset | Un file multimediale caricato e referenziabile dalle voci |
| Locale | Una lingua/regione in cui il contenuto viene tradotto |
| Release | Un gruppo di voci pianificate per andare online (o essere rimosse) contemporaneamente |
Quickstart
Sezione intitolata “Quickstart”import Proyecta from '@proyecta-ai/sdk';
const proyecta = new Proyecta({ apiKey: process.env.PROYECTA_API_KEY });
// 1. Define a collectionconst blog = await proyecta.content.collections.create({ api_id: 'blogPost', name: 'Blog Post', // fields are added via collections.fields.create()});
// 2. Create an entryconst post = await proyecta.content.entries.create({ collection_id: blog.id, data: { title: 'Hello, world', body: 'My very first post.', },});
// 3. Publish itawait proyecta.content.entries.publish({ entryId: post.id });Collezioni
Sezione intitolata “Collezioni”// Browse collectionsfor await (const collection of proyecta.content.collections.list()) { console.log(collection.name);}
// Add or remove fields on a collectionawait 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 entryawait proyecta.content.entries.update(post.id, { data: { title: 'Updated title' } });
// Publish an entryawait proyecta.content.entries.publish({ entryId: post.id });
// Delete an entryawait 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 assetsfor await (const asset of proyecta.content.assets.list()) { console.log(asset);}
// Upload, update, or delete via assets.create / assets.update / assets.deletePer i caricamenti di file tramite chat (trascina nel builder), consulta File e Media.
Localizzazione
Sezione intitolata “Localizzazione”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.
Release
Sezione intitolata “Release”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_atentrano nello statoscheduledma devono essere pubblicate manualmente tramitereleases.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 readyawait proyecta.content.releases.publish({ releaseId: release.id });
// Browse releasesfor 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.
Pattern comuni (lascia che l’AI li configuri)
Sezione intitolata “Pattern comuni (lascia che l’AI li configuri)”"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."
Quando usare Content rispetto al Database
Sezione intitolata “Quando usare Content rispetto al Database”| Caso d’uso | Usa questo |
|---|---|
| Contenuti editoriali (articoli, FAQ, testi marketing) — richiede stati pubblicato/bozza, pianificazione, localizzazione | Content API |
| Dati applicativi (utenti, ordini, righe d’ordine) — richiede velocità di query, transazioni, dati in tempo reale | Database |
| Asset statici nel codice | Directory public/ nel tuo progetto |
| File caricati dagli utenti | File e Media |
Prossimamente
Sezione intitolata “Prossimamente”- Editor di voci rich-text — modifica WYSIWYG completa per i campi
rich_textnel pannello Content - Anteprima live delle modifiche ai contenuti nella tua app
- Ruoli per i contenuti — permessi separati per editor e sviluppatori