# 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

```text
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](/nl/docs/concepts/data-as-files/). Elk record krijgt ook `uuid`, `_created`, `_modified`, `_created_by` en `_modified_by`, die Nimbly bijhoudt.

## De definitie

```json
{
  "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](/nl/docs/reference/field-types/) en [resource-metadata](/nl/docs/reference/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:

```html
[#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](/nl/docs/guides/jobs/).

## 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.
