Formuláře
Select
Dropdown select se statickými nebo dynamickými options, hledáním a multi-selectem.
Na této stránce
Dropdown select se statickými nebo dynamickými options, hledáním a multi-selectem.
use NyonCode\WireForms\Components\Select;
Mobil. Dropdown/hledací panel se otevře jako bottom sheet pod nakonfigurovaným breakpointem (searchable selecty zůstanou plovoucím panelem ve výchozím stavu, aby vyhledávací box zůstal použitelný). Přepište per pole pomocí
->sheetOnMobile()/->mobileBreakpoint('md')— viz mobilní prezentace.
Základní použití
Select::make('role') ->options([ 'admin' => 'Administrator', 'editor' => 'Editor', 'user' => 'User', ])
Dynamické options
Select::make('category_id') ->options(fn () => Category::pluck('name', 'id')->toArray()) ->placeholder('Choose category')
Options z enumu
Předejte třídu PHP enumu přímo místo pole — case se rozvinou na
mapu value => label. Klíč je backing hodnota (nebo název case pro unit enumy)
a label pochází z getLabel() enumu, když implementuje kontrakt
Foundation\Contracts\Enum\HasLabel, s fallbackem na headline z názvu case.
use NyonCode\WireCore\Foundation\Contracts\Enum\HasLabel; enum Status: string implements HasLabel{ case Draft = 'draft'; case Published = 'published'; public function getLabel(): ?string { return match ($this) { self::Draft => 'Draft', self::Published => 'Published', }; }} Select::make('status')->options(Status::class)// → ['draft' => 'Draft', 'published' => 'Published']
Enum bez HasLabel stále funguje — z názvu case se udělá headline pro label
(LowPriority → Low Priority). Closura vracející třídu enumu se rozvine také.
Automatická validace. Jednohodnotový Select (nebo Radio), jehož options pocházejí
z enumu, je automaticky omezen na tyto hodnoty pravidlem in: — odeslání
mimo enum je odmítnuto, aniž byste ho museli znovu uvádět. Přeskočí se pro multiple() selecty
(stav pole) a když deklarujete vlastní pravidlo in: / Rule::in() / Rule::enum().
Stejná zkratka
->options(Enum::class)funguje naRadio,CheckboxList, tableSelectColumna tableSelectFilter.
Vyhledávatelné
Select::make('user_id') ->options(fn () => User::pluck('name', 'id')->toArray()) ->searchable() ->noSearchResultsMessage('No users found') ->searchPrompt('Type to search...') ->loadingMessage('Loading...')
Remote hledání
Místo filtrování přednačteného seznamu v prohlížeči resolvujte shody na serveru, jak uživatel píše:
Select::make('author_id') ->getSearchResultsUsing(fn (string $search) => User::where('name', 'like', "%{$search}%")->limit(50)->pluck('name', 'id')->all() ) ->getOptionLabelUsing(fn ($value) => User::find($value)?->name)
getSearchResultsUsing()implikujesearchable()a vrací mapuvalue => label.getOptionLabelUsing()(single) /getOptionLabelsUsing()(multiple) resolvují label(y) pro aktuální výběr, takže trigger zůstane čitelný i když vybraná option nebyla nikdy přednačtena.preload()dychtivě naplní remote seznam při renderu (spustí search callback s prázdným výrazem) místo čekání na první stisk klávesy.
Hostitel musí vystavit search endpoint — jakákoli WithForms komponenta nebo table
action modal to dělá. BelongsToSelect dostane remote hledání
řízené relací automaticky.
Create & Edit options
Nechte uživatele vytvořit novou option — nebo editovat vybranou — z modalu bez opuštění formuláře:
Select::make('category_id') ->options(fn () => Category::pluck('name', 'id')->all()) ->createOptionForm([ TextInput::make('name')->required(), ]) ->createOptionUsing(fn (array $data) => Category::create($data)->getKey()) ->editOptionForm([ TextInput::make('name')->required(), ]) ->fillEditOptionUsing(fn ($value) => Category::find($value)->only('name')) ->updateOptionUsing(fn ($value, array $data) => Category::find($value)->update($data))
Prvek „+ Create" (a pro vybranou hodnotu „Edit") se objeví v patičce panelu comboboxu a otevře izolovaný modal. Validace drží modal otevřený s chybami; při úspěchu se nová hodnota vybere (přidá u multi-selectu).
createOptionUsing()vrací hodnotu nové option — skalární klíč nebo model, jehož klíč se použije.- Editace cílí na jedinou vybranou option, takže není dostupná na
multiple(). createOptionModalHeading()/editOptionModalHeading()přizpůsobí nadpisy.- Funguje v samostatných
WithFormskomponentách i uvnitř table action modalů. - Aby nově vytvořená hodnota vykreslila label, spárujte s
getOptionLabelUsing()nebo přednačteným seznamem options. - Vytvořená/editovaná option se okamžitě sloučí do otevřeného comboboxu (hostitel
odesílá browser události
select-option-created/select-option-updated) — žádné obnovení stránky není potřeba.
Reaktivita
Combobox se váže deferred ve výchozím stavu. Přidejte live(), když na výběr reagují jiná pole
— afterStateUpdated(), visibleWhen() souseda nebo Form::live() —
aby se výběr option synchronizoval na server při kliknutí místo čekání na další
roundtrip:
Select::make('type') ->options([...]) ->live() ->afterStateUpdated(fn ($state, $set) => $set('label', ucfirst((string) $state)))
Multi-select
Select::make('tags') ->multiple() ->maxItems(5) ->minItems(1) ->options([...])
Relace
Select::make('author_id') ->relationship('author', 'name') ->searchable()
Nativní vs vlastní
Každý Select se ve výchozím stavu vykresluje přes vlastní combobox, takže searchable a
non-searchable selecty sdílejí jeden design — searchable() jen přidá
in-panel search input. Použijte native() pro nativní
<select> element prohlížeče.
Select::make('country') ->searchable() // combobox se search inputem ->native() // vynutit nativní <select> prohlížeče
Boolean select
Select::make('active') ->boolean() // Yes/No options
Disabled options
Vykreslit konkrétní options jako nevybíratelné:
Select::make('status') ->options([ 'draft' => 'Draft', 'review' => 'In Review', 'published' => 'Published', 'archived' => 'Archived', ]) ->disabledOptions(['archived'])
Dynamické disabled options:
Select::make('tier') ->options(Plan::pluck('name', 'id')->toArray()) ->disabledOptions(fn () => Plan::unavailable()->pluck('id')->toArray())
Metody
| Metoda | Typ | Popis |
|---|---|---|
options(array|string|Closure) |
array | Statické, dynamické nebo enum-class options (value => label) |
searchable() |
bool | Zapnout hledání options |
multiple() |
bool | Povolit více výběrů |
native(bool $native = true) |
bool | Použít nativní <select> prohlížeče místo comboboxu (výchozí: false) |
maxItems(int|null) |
int | Maximum vybraných položek (multi-select) |
minItems(int|null) |
int | Minimum vybraných položek (multi-select) |
disabledOptions(array|Closure) |
array | Klíče options vykreslené jako disabled |
noSearchResultsMessage(string|null) |
string | Zpráva, když hledání nic nenajde |
loadingMessage(string|null) |
string | Zpráva během načítání options |
searchPrompt(string|null) |
string | Prompt zobrazený v hledacím boxu |
boolean() |
— | Zkratka pro Yes/No options |
relationship(string, string) |
— | Načíst options z relace |
getSearchResultsUsing(Closure) |
— | Remote hledání: resolvovat shody na serveru (implikuje searchable()) |
getOptionLabelUsing(Closure) / getOptionLabelsUsing(Closure) |
— | Resolvovat label(y) pro aktuální výběr |
preload() |
bool | Dychtivě naplnit remote seznam options při renderu |
createOptionForm(array|Closure) / createOptionUsing(Closure) |
— | Vytvořit novou option z modalu |
editOptionForm(array|Closure) / fillEditOptionUsing(Closure) / updateOptionUsing(Closure) |
— | Editovat vybranou option z modalu |
createOptionModalHeading(string) / editOptionModalHeading(string) |
string | Nadpisy modalu |
placeholder(string|Closure) |
string | Label prázdné/blank option |
disabled(bool|Closure) |
bool | Znepřístupnit select |
required() |
— | Označit jako povinné |
live() |
— | Spustit Livewire update při změně |
Label, hint, tooltip a další sdílené metody viz Společné API pole.