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.
Collecties en singletons
Section titled “Collecties en singletons”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.
Welke soorten content
Section titled “Welke soorten content”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.
Velden
Section titled “Velden”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. |
Entries, concepten en publiceren
Section titled “Entries, concepten en publiceren”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.
Content beheren (geen code vereist)
Section titled “Content beheren (geen code vereist)”Er zijn twee manieren om content toe te voegen en te bewerken — geen van beide vereist code:
- 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."
- 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.
Hoe je app content leest
Section titled “Hoe je app content leest”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 youimport { 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
Section titled “Formulieren”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.
Lokalisatie
Section titled “Lokalisatie”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.
Releases
Section titled “Releases”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 statusscheduled, 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."
Waar de data van je app wordt opgeslagen
Section titled “Waar de data van je app wordt opgeslagen”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 store — binnenkort 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.
Binnenkort beschikbaar
Section titled “Binnenkort beschikbaar”- 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.