Concepten

Resources

Data één keer gedefinieerd in een .meta-bestand, met admin, API, rechten en geschiedenis.

Een resource is een soort data: projecten, leden, bestellingen, pagina's. Je beschrijft hem één keer in een .meta-bestand, en Nimbly levert vanuit die beschrijving de opslag, de adminschermen, de formulieren, de API, de rechten en de geschiedenis.

Records zijn bestanden

ext/data/projects/
  .meta                 the definition
  4f1c9a2e7b...         one record, as JSON
  9d03b6e1c4...         another record

Elk record is een JSON-bestand met zijn id als naam, een willekeurige reeks zoals 1ztuvo56o5vze6t0 die in elke omgeving hetzelfde blijft. Er is geen databaseserver: een resource kun je als map lezen, kopiëren, in Git versioneren en terugzetten. Waarom Nimbly zo werkt, en wat dat voor een project betekent, staat in Data als bestanden. Elk record krijgt ook uuid, _created, _modified, _created_by en _modified_by, die Nimbly bijhoudt.

De definitie

{
  "name": {"singular": "Project", "plural": "Projects"},
  "fields": {
    "title": {"name": "Title", "type": "text", "required": true},
    "title_slug": {"name": "URL slug", "type": "slug", "source": "title"},
    "sector": {"name": "Sector", "type": "select", "options": {"culture": "Culture", "retail": "Retail"}},
    "published": {"name": "Published", "type": "boolean", "admin_filter": true},
    "cover": {"name": "Cover", "type": "image", "admin_col": false},
    "description": {"name": "Description", "type": "html", "buttons": "bold,italic,anchor", "admin_col": false}
  },
  "index": ["title_slug"],
  "sort": {"field": "title", "order": "asc"}
}

Velden hebben een type (text, html, date, select, image, gallery, file, number, boolean, location en meer), een label, validatie en instellingen voor de admin. Een select kan zijn opties uit een andere resource halen; zo verwijzen resources naar elkaar. De naslag van veldtypen en resource-metadata noemt elke optie.

Wat een definitie je geeft

Je krijgt Waar
Een overzicht met kolommen, zoeken, filters en pagina's /nb-admin/<resource>
Formulieren om toe te voegen en te bewerken, met validatie de admin, en elk formulier dat je op de resource bouwt
Een REST API om te tonen, lezen, maken, wijzigen en verwijderen /api/v1/<resource>
Rechten per handeling en rol view-, create-, edit-, delete- en manage-<resource>
Geschiedenis van elke wijziging, met terugzetten het actiepaneel van het record in de admin
Opzoeken op veldwaarde de lijst index

Data lezen

In een template:

[#data projects filter=published:1 sort=year|numeric|desc limit=12#]
[#repeat data.projects tpl=card-project#]

In PHP leest data_read() één record, vindt data_read_index() records via een geïndexeerd veld, en geeft data_query() een gefilterde, gesorteerde pagina met het totaal. Schrijven gaat via data_create(), data_update() en data_delete(), die valideren, indexen bijwerken en de geschiedenis vastleggen.

Prestaties op schaal

  • Indexen. Een veld in de lijst index krijgt een opzoekpad, zodat een slug in een adres zijn record vindt zonder de resource te lezen.
  • Lijstcache. Filters en sorteringen bewaren de waarden van de betrokken velden in één cachebestand per veld, zodat een pagina met resultaten alleen de records op die pagina leest.
  • Querycache. Queryresultaten worden gecachet en vervallen bij elke schrijfactie, of die nu van de site, de API, Git of een sync komt.
  • Gesplitste mappen. "splitdir": true verdeelt de bestanden van een grote resource over submappen.

Met gesplitste mappen en indexen kan een resource zo'n 100.000 records aan.

Events

Een resource kan aangeven wat er gebeurt nadat een record is gemaakt, gewijzigd of verwijderd: een functie draaien, of een achtergrondjob in de wachtrij zetten, zoals een bevestigingsmail na het versturen van een formulier. Zie Werk op de achtergrond.

Verborgen resources

Een resource waarvan de naam met een punt begint, zoals .config of .content, blijft buiten het data-overzicht van de admin. Nimbly gebruikt ze voor site-instellingen, paginacontent, routes en de jobwachtrij.

Bekijk deze pagina als Markdown