Ga naar inhoud

Contentbeheer

Het CMS van Proyecta is de primaire datalaag van je app — niet alleen blogposts en marketingteksten, maar de echte records waarop je app is gebouwd. Collecties worden ingericht en gevuld met realistische voorbeeldcontent voordat de UI bestaat, zodat je app vanaf de eerste build is gekoppeld aan bewerkbare data.

De meeste Proyecta-apps slaan hun gegevens op in het ingebouwde CMS. Wanneer je je app beschrijft, ontwerpt Proyecta een datamodel, maakt de benodigde collecties aan en vult ze met realistische voorbeeldcontent — allemaal voordat er ook maar één pagina is gebouwd. Je pagina’s lezen vervolgens die echte, door de eigenaar bewerkbare content via getypeerde hooks die de AI voor je inricht. Zie Hoe de data van je app werkt voor het grote geheel.

Je hoeft hier bij de start niets over na te denken — het gebeurt automatisch. Deze pagina legt uit wat er achter de schermen gebeurt, zodat je het kunt bijsturen.

Content is georganiseerd in collecties en singletons:

Type Wat het is Voorbeelden
Collection Een contenttype met meerdere entries — één schema, meerdere rijen. posts, services, testimonials, catalogItems
Singleton Een contenttype met precies één entry — globale, eenmalige content. businessInfo, seoSettings

Een collectie is een structuur; elke entry is één item van die structuur (één blogpost, één dienst, één FAQ). Een singleton bevat één bewerkbaar record — je bedrijfsidentiteit, of de hero- en sectiestekst van een pagina.

Proyecta wordt geleverd met kant-en-klare collectieontwerpen — doordachte velden, adminhinten en startcontent — voor de soorten records die echte bedrijven bijhouden: blogposts en artikelen, diensten, een productcatalogus, een menukaart, getuigenissen en recensies, teamleden, een fotogalerij, FAQ’s, evenementen, locaties, downloadbare bronnen, vacatures, cursussen, tours en accommodatievermeldingen, en meer.

Je kiest nooit uit een lijst. Wanneer je je app beschrijft, kiest Proyecta de collecties die bij jouw beschrijving passen — je bedrijfstype, de functies die je wilt, je taal — en maakt ze aan, vooraf gevuld met realistische voorbeeldcontent. Als je app iets nodig heeft dat geen van de standaardcollecties dekt, ontwerpt Proyecta een aangepaste collectie met eigen velden.

Daardoor toont het adminpaneel van je app jouw collecties — geen vaste lijst. Het bouwt zichzelf op uit het live contentmodel van je app, dus alles wat Proyecta voor jou heeft aangemaakt — ingebouwd of aangepast — is precies wat je ziet en bewerkt. Twee Proyecta-apps hebben zelden dezelfde set, en dat is bewust zo.

Elke collectie bestaat uit getypeerde velden. Veldtypen worden end-to-end afgedwongen — het adminpaneel toont de juiste editor, en je pagina’s ontvangen correct getypeerde waarden.

Veldtype Gebruik het voor
string Korte éénregelige waarden — titels, namen, adressen.
text Een alinea platte tekst.
markdown Uitgebreide opgemaakte tekst — artikelinhoud, “over ons”-tekst.
slug URL-identifier, automatisch afgeleid van een ander veld (bijv. de titel).
number Telwaarden, beoordelingen, duren.
money Een prijs of geldbedrag — weergegeven en bewerkt als valuta.
boolean Aan/uit-schakelaars.
date Kalenderdatums.
datetime Tijdstempels — publicatiedatums, starttijden van evenementen.
weeklyHours Openingstijden per dag van de week.
asset Een afbeelding, video of PDF (opgeslagen als openbare URL).
reference Een verwijzing naar een entry in een andere collectie.
enum Een waarde uit een vaste lijst met opties.
array Een lijst met strings — tags, telefoonnummers, zones.
blocks Stapelbare contentblokken — een pagina opgebouwd uit getypeerde secties.
json Gestructureerde data die niet in een van de bovenstaande typen past.

Een entry is één item in een collectie. Elke entry heeft een status:

  • Draft — een werk in uitvoering; nooit zichtbaar op je live site.
  • Published — live en zichtbaar voor bezoekers.
  • Archived — buiten gebruik gesteld, opzijgezet.

Je openbare pagina’s zien uitsluitend gepubliceerde entries — concepten en gearchiveerde items worden automatisch verborgen, zodat je content veilig kunt voorbereiden voordat die live gaat.

Er zijn twee manieren om content toe te voegen en te bewerken — geen van beide vereist code:

  1. De AI vragen via de chat. Beschrijf de wijziging en de AI past de juiste content aan:
    • "Voeg een getuigenis toe van María González: 'Beste service in de stad', 5 sterren."
    • "Verander de tagline in Business Info naar 'Café de especialidad en la Roma'."
    • "Markeer de laatste vijf contactformuliersverzendingen als gelezen."
  2. Het adminpaneel van je app. Elke gepubliceerde app krijgt een ingebouwd, met inloggen beveiligd adminpaneel waar jij (en medewerkers aan wie je toegang verleent) content en formulierinzendingen direct kunt beheren — een spreadsheetachtige editor per collectie, plus de inzendingen-inbox. Het configureert zichzelf op basis van het live contentmodel van je app, zodat nieuwe collecties er automatisch in verschijnen. Zie Admin Panel.

Beheer je CMS-content via het adminpaneel van je app of de AI — een ingebouwde contenteditor in de builder staat op de roadmap (zie Binnenkort beschikbaar). Een realtime recordbrowser voor live-updating apps is binnenkort beschikbaar.

Je pagina’s lezen content via een set getypeerde hooks in @/hooks/useContent — en de AI schrijft die koppeling voor je. Je beschrijft de pagina; Proyecta genereert de componenten die deze hooks aanroepen op basis van je echte collecties. Je raakt ze zelden zelf aan, maar dit is wat ze doen:

Hook Wat het doet
useCollection('posts') Geeft de gepubliceerde entries van een collectie weer (met optioneel filter/sort/limit).
useEntry('posts', slug) Haalt één gepubliceerde entry op via slug (detailpagina’s).
useSingleton('businessInfo') Leest een singleton (bedrijfsinfo, pagina-content).
useFormSubmit('contactForm') Dient een formulier in en rapporteert validatiefouten.
// A blog index — exactly the kind of code the AI generates for you
import { useCollection } from '@/hooks/useContent';
function BlogList() {
const { data: posts, isLoading } = useCollection('posts', { sort: 'published_at:desc' });
if (isLoading) return <Spinner />;
return posts?.map((post) => <PostCard key={post._id} post={post} />);
}

Wanneer Proyecta getypeerde interfaces voor je collecties genereert, worden de hooks volledig getypeerd (useCollection<Post>('posts')), zodat je editor elk veld automatisch aanvult. Reads worden gehydrateerd bij de eerste render vanuit een gebakken snapshot — pagina’s renderen direct en SEO-vriendelijk, en verversen daarna live op de achtergrond.

Formulieren zijn een eersteklas functionaliteit, niet iets dat de AI handmatig bouwt. Voeg een formulierblok in en het rendert de velden, valideert invoer, dient in en toont een successtatus:

<FormBlock form="contactForm" />

Formulieren zijn ook kant-en-klaar beschikbaar — een contactformulier, een offerteaanvraag, een boekingsformulier, een bestelformulier, een registratieformulier — en Proyecta koppelt het juiste formulier aan je pagina’s. Inzendingen komen binnen in de inbox van het adminpaneel van je app, en de eigenaar krijgt een e-mail zodra er een nieuwe binnenkomt. Zie Forms voor het volledige overzicht.

Content kan worden vertaald in meerdere locales. Velden die als gelokaliseerd zijn gemarkeerd slaan een waarde per taal op, en de leeshooks lossen deze op via een fallbackketen (gevraagde taal → geconfigureerde fallbacks → standaard) wanneer je de actieve locale van de bezoeker doorgeeft:

const { data: posts } = useCollection('posts', { locale: 'es' });

Apps met één taal negeren locales volledig — er is niets te configureren. Zie Internationalization voor het bredere vertaalverhaal.

Een release bundelt meerdere entries zodat ze tegelijk live gaan (of worden gedepubliceerd) — stel een gecoördineerde contentdrop klaar (een lancering, een nieuwe productpagina, een FAQ-update) en activeer alles tegelijk.

Opmerking: Automatisch gepland publiceren is nog niet geïmplementeerd. Een release met een scheduled_at-datum krijgt de status scheduled, maar moet handmatig worden gepubliceerd. Automatisch publiceren op het geplande tijdstip komt binnenkort.

Veelvoorkomende patronen (laat de AI het inrichten)

Section titled “Veelvoorkomende patronen (laat de AI het inrichten)”

Je schrijft dit zelden zelf — beschrijf wat je wilt en Proyecta bouwt het op basis van echte collecties:

  • "Bouw een blog. Elke post heeft een titel, omslagafbeelding, rich-text body, categorie en tags. Openbare routes op /blog en /blog/[slug], nieuwste eerst."
  • "Voeg een FAQ-sectie toe die de eigenaar kan bewerken, gegroepeerd op categorie."
  • "Voeg een lijst van boekbare diensten toe met een offerteaanvraagformulier."
  • "Maak de site tweetalig — Engels en Spaans — met een taalwisselaar."
  • "Vul de getuigenissen aan met vijf realistische recensies voor een koffieshop."

Het CMS is de standaardlocatie voor duurzame content en records. Bepaalde soorten data worden opgeslagen in specifieke systemen:

Soort data Waar het wordt opgeslagen
Content & records (posts, diensten, vermeldingen, FAQ’s, catalogus, boekingen) Proyecta CMS (deze pagina) — de standaard
Realtime / gedragsstatus (live chat, feeds, aanwezigheid, spelstatus) Realtime storebinnenkort beschikbaar
Gebruikersaccounts & inloggen Auth
Producten, bestellingen, abonnementen, betalingen Commerce
Geüploade bestanden & media Files & Media
Statische assets die worden meegebakken in de build de map public/ in je project

Het CMS is de standaard. Een realtime store voor echt realtime gedrag is binnenkort beschikbaar; zelfs dan blijft duurzame content en de commercecatalogus in het CMS staan.

  • Ingebouwde contenteditor in de builder — blader door en bewerk je CMS-collecties rechtstreeks vanuit het builderdashboard (nu: beheer content via het adminpaneel of de AI).
  • Rich-text WYSIWYG-editor — visueel bewerken voor markdown-velden (nu worden ze bewerkt als markdown).
  • Automatisch gepland publiceren — releases die automatisch live gaan op hun geplande tijdstip.
  • Live preview van contentwijzigingen in je app.
  • Contentrollen — editor-rechten scheiden van ontwikkelaarsrechten.