Core
Enumy
Kontrakty, které enum implementuje, aby si pojmenoval vlastní popisek, barvu a ikonu — stav popsaný jednou, čtený každým povrchem.
Na této stránce
Stavový enum ví, jak se jmenuje, jakou má barvu a jakou nese ikonu. Když to řekne na sobě, a jednou, nemusí si badge sloupec, entry v infolistu a select držet každý vlastní mapu týchž tří faktů — a právě tyhle mapy se rozejdou při prvním přidaném stavu.
Enumy
PHP enumy nelze stringifikovat pomocí (string) $enum, přesto Eloquent enum casty předávají surovou
instanci každému zobrazovacímu a stavovému povrchu. EnumResolver je jediný kanonický vlastník, který
normalizuje takové hodnoty; navazující balíčky (table, forms, infolists, exports) na něj delegují
místo re-enkódování (string) $enum nebo lokálních match map.
use NyonCode\WireCore\Foundation\Support\EnumResolver; EnumResolver::scalar($value); // backed enum → ->value, unit enum → název case, jinak passthroughEnumResolver::label($value); // getLabel() → metoda label() → headline(název case); ne-enum passthroughEnumResolver::display($value); // label() + array/JSON → kompaktní JSON; (string)-safe všudeEnumResolver::color($value); // HasColor → getColor(), jinak nullEnumResolver::icon($value); // HasIcon → getIcon(), jinak nullEnumResolver::isEnum($value); // bool — je to instance enumu? EnumResolver::isEnumClass($value); // bool — je to enum class-string?EnumResolver::options(Status::class); // [value => label] mapa z case enumuEnumResolver::normalizeOptions($value); // třída enumu → options() mapa; pole projdou skrz
Použijte scalar() pro klíče map, porovnání a copy hodnoty; display() (nebo label()), kdekoli se
hodnota zobrazuje. Ne-enum hodnoty vždy projdou beze změny, takže je bezpečné helpery volat na
cokoli.
options() pohání zkratku „enum jako možnosti“ ve stylu Filamentu: jakýkoli povrch postavený na možnostech —
form Select / Radio / CheckboxList (přes sdílený trait WireForms\Concerns\HasOptions),
table SelectColumn a SelectFilter, plus generický Column::editable() / filterable() /
filterAsSelect() — přijímá ->options(Status::class) a deleguje rozvinutí sem. Každý case
klíčuje přes scalar() a popisek řeší stejným kanonickým label(), takže možnost čte
identicky jako odpovídající display buňka. Jednohodnotové formulářové pole, jehož možnosti pocházejí z enumu,
také získá automatické in: validační pravidlo (viz Formuláře → Select).
Čím soubor je — rodina, ne formát
Každá plocha, která ukazuje soubor, musí nejdřív odpovědět na jednu otázku: je tu obrázek, a když ne, co to vlastně je? Šest míst si na to odpovídalo samo a všech šest odpovídalo stejně chudě — obrázek, nebo jedna šedá ikona dokumentu — takže katalog, ceník, smlouva a archiv pro tiskárnu vypadaly jako čtyři totožné šedé obdélníky.
FileKind je jediný vlastník té odpovědi. Jeho případy jsou rodiny, ne
formáty, a každý si nese odstín ze sdílené palety a ikonu ze sdílené sady —
takže do žádného z těch dvou slovníků nepřibývá nic nového.
use NyonCode\WireCore\Foundation\Enums\FileKind; FileKind::for('application/pdf'); // FileKind::Document // FileKind::for(null, 'cenik-q1.xlsx'); // Spreadsheet — z názvu, když MIME chybíFileKind::for('application/octet-stream', 'a.zip');// Archive — z názvu, když MIME nic neříkáFileKind::for('text/plain', 'export.csv'); // Spreadsheet — co by řekl každý, kdo to otevře FileKind::extensionOf('cenik.ods'); // 'ODS' — nápis, z názvu samotného souboruFileKind::extensionOf('report.final version'); // null — tohle není přípona, tak ji nevypisuj
Rozhoduje MIME typ, protože se čte z uloženého souboru, ne z toho, co o něm
tvrdil prohlížeč. Název se použije přesně ve dvou případech, oba skutečné: MIME
typ je null — řádky zapsané dřív, než se zaznamenával — nebo je to jeden z té
hrstky, co platí skoro na cokoli (application/octet-stream, text/plain), a
tedy nerozhoduje nic.
Rodina není nápis. XLSX a ODS jsou obojí Spreadsheet a nesmí obě hlásit
„XLSX“, takže písmena na dlaždici jsou z názvu souboru. Název bez použitelné
přípony spadne zpátky na název rodiny.
| Případ | Barva | Případ | Barva |
|---|---|---|---|
Image |
violet | Presentation |
orange |
Video |
pink | Archive |
yellow |
Audio |
teal | Code |
slate |
Document |
blue | Other |
gray |
Spreadsheet |
green |
Slovník je uzavřený. Takový, který si aplikace může přepsat, je takový, na
který se žádný balíček nemůže spolehnout — Spreadsheet musí znamenat tabulku —
takže co se netrefí, je Other, a vykreslí se jako vlastní přípona souboru na
neutrálním podkladu.
Opt-in enum kontrakty
Enum použitý jako cast může implementovat kterýkoli z těchto pro řízení bohatšího vykreslení. Žijí pod
Foundation\Contracts\Enum\ a jsou odlišné od builder-facing Foundation\Contracts\HasLabel
/ HasIcon (které nesou fluent settery pro komponenty).
| Kontrakt | Metoda | Efekt |
|---|---|---|
Enum\HasLabel |
getLabel(): ?string |
Zobrazovací povrch vykreslí tento popisek místo výchozího headline názvu case |
Enum\HasColor |
getColor(): string|Color|null |
BadgeColumn / IconColumn / IconEntry automaticky resolvují barvu |
Enum\HasIcon |
getIcon(): string|Icon|null |
Stejné povrchy automaticky resolvují ikonu |
use NyonCode\WireCore\Foundation\Colors\Color;use NyonCode\WireCore\Foundation\Contracts\Enum\HasColor;use NyonCode\WireCore\Foundation\Contracts\Enum\HasLabel; enum OrderStatus: string implements HasColor, HasLabel{ case Pending = 'pending'; case Paid = 'paid'; public function getLabel(): ?string { return ucfirst($this->value); } public function getColor(): string|Color|null { return $this === self::Paid ? Color::Success : Color::Warning; }}
Použití na úrovni sloupce viz Table → Enum a JSON casty.
Související
- Barvy a Ikony — slovníky, které enum jmenuje
- BadgeColumn — pořadí rozhodování, kterého se enum účastní
- Enum a JSON casty — co sloupec udělá s přetypovanou hodnotou
- Workflow a přechody — enumy jako stavy záznamu