Declared legal values — four methods, two stored shapes, cardinality is the contract.
A field whose legal values are declared: label/value pairs carried in the registry, offered by the editor, enforced at the write boundary. One family, four methods — and underneath them, exactly two stored shapes, decided by cardinality:
| Method | Picks | Stores | The template asks |
|---|---|---|---|
| Select | one of N | the value, a string |
=== 'sold_out' |
| Radio | one of N | the value, a string |
=== 'sold_out' |
| Checkboxes | any of N | a json list |
.includes('press') |
| Multi-select | any of N | a json list |
.includes('press') |
Methods in a row store identically — swap Select for Radio and no
template changes. Methods across rows do not: cardinality is the
contract, the method is the affordance, and the stored shape follows
the first, never the second. A checkboxes field with
max_items: 1 still stores a list, because
what a field stores must never depend on a setting a template cannot
see.
The name is ProcessWire's, and so is the shape of the family: one Options concept, the input widget decided per field.
A field's option list is not the options namespace. The namespace
(see Fields) holds render configuration — width,
alignment, variant — and is fenced out of SEO and social surfaces. A
field's options are the choices its value may take, and the field
lives wherever it is assigned, content included. Same word, two jobs —
the possessive tells them apart: the field's options versus the
asset's options.
Every option is a pair. The value is what gets stored, compared and queried; the label is what an author reads. Rewording a label is free and changes no record; changing a value is a migration, because every stored row still holds the old one.
sold_out | Sold out ← value | label
past | Past
The option list lives on the field, so every assignment of it offers the
same choices — declare Status once and every content type that uses it
agrees on what a status is. In the admin, the two stored shapes surface
as two field types: Select and Select (multiple), each taking
the same one-option-per-line list.