Core
Fieldset
HTML fieldset s legendou pro seskupení souvisejících komponent — týž layout ve formuláři i v infolistu.
Na této stránce
Skutečný HTML <fieldset> s <legend>. Sáhni po něm, když pár polí patří k sobě
a to seskupení je součástí významu — adresa, fakturační blok — ne jen vzhledu.
Čtečka obrazovky přečte legendu před každým polem uvnitř, a to je celý důvod, proč
ho upřednostnit před Gridem s nadpisem nad ním.
use NyonCode\WireCore\Foundation\Schema\Fieldset;
Jak to funguje
Fieldset je layoutová komponenta: nenese hodnotu ani state path, takže se dá
přidat nebo odebrat bez dotyku na data. Vykreslí orámovaný box, dá label() do
legendy a děti uvnitř rozloží do gridu.
Bez popisku není legenda. Element <legend> se vypíše jen tehdy, když je popisek
nastavený, takže Fieldset::make('address') a nic dalšího vykreslí orámovaný box
bez nadpisu — což je legitimní přání a překvapení, když jste čekali, že se jméno
stane legendou. Na rozdíl od pole si fieldset ze jména popisek neudělá: napište
->label('Adresa').
Výchozí počet sloupců je 1, ne 2 — fieldset je v první řadě seskupení a až potom grid. Vyhodnocuje se různě podle tvaru, který předáte, a tohle je ta část, kterou je dobré vědět:
- Int projde malou lokální mapou, která rozumí 1, 2, 3 a 4 a přeskládává se
na
sm, pakmd, paklg.columns(6)neodpovídá ničemu a děti se vykreslí v jednom sloupci úplně bez gridové třídy. - Mapa po breakpointech projde tímtéž
ResponsiveGrid, který používáGrid—['default' => 1, 'md' => 3]— s plným rozsahem 1–12.
Ty dva tvary tady tedy nejsou jen dva zápisy téhož: když chcete víc než čtyři sloupce nebo kontrolu nad tím, kde se to přeskládá, předejte mapu.
Děti se před vykreslením filtrují vlastní podmínkou visible() a fieldset se za
skrytým dítětem zavře.
Základní použití
Fieldset::make('address') ->label('Adresa') ->schema([ TextInput::make('street'), TextInput::make('city'), TextInput::make('zip'), ])
Rozložení skupiny
Fieldset::make('address') ->label('Adresa') ->columns(3) ->schema([ TextInput::make('street')->columnSpanFull(), TextInput::make('city'), TextInput::make('zip'), ])
Ulice zabere celý řádek, město a PSČ si rozdělí další. Na cokoli přes čtyři sloupce nebo na jiný bod přeskládání použijte tvar s mapou:
Fieldset::make('address') ->label('Adresa') ->columns(['default' => 1, 'lg' => 6]) ->schema([...])
Vypnutí celé skupiny
disabled() je ze společného layoutového povrchu a propíše se na každé pole
uvnitř — jedna podmínka místo téže podmínky na každém poli:
Fieldset::make('billing') ->label('Fakturační adresa') ->disabledWhen('same_as_shipping') ->schema([ TextInput::make('billing_street'), TextInput::make('billing_city'), ])
Rozšířený příklad
Dva fieldsety ve skutečném Livewire hostu, kde se druhý vypne, jakmile je přepínač nad ním zapnutý:
use Livewire\Component;use NyonCode\WireCore\Foundation\Schema\Fieldset;use NyonCode\WireForms\Components\TextInput;use NyonCode\WireForms\Components\Toggle;use NyonCode\WireForms\Forms\Form;use NyonCode\WireForms\Forms\WithForms; class EditCustomer extends Component{ use WithForms; public ?array $data = []; public function form(Form $form): Form { return $form ->statePath('data') ->model(Customer::class) ->schema([ Fieldset::make('shipping') ->label('Doručovací adresa') ->columns(2) ->schema([ TextInput::make('ship_street')->columnSpanFull(), TextInput::make('ship_city'), TextInput::make('ship_zip'), ]), Toggle::make('same_as_shipping')->live(), Fieldset::make('billing') ->label('Fakturační adresa') ->columns(2) ->disabledWhen('same_as_shipping') ->schema([ TextInput::make('bill_street')->columnSpanFull(), TextInput::make('bill_city'), TextInput::make('bill_zip'), ]), ]); } public function save(): void { $this->form->save(); }}
Přepínač je live(), protože disabledWhen se vyhodnocuje při renderu — bez toho
by se fakturační blok nevypnul až do dalšího round tripu.
Fieldset API
->columns(int|array $columns) // 1 (výchozí). int rozumí jen 1–4; // na cokoli jiného ['default' => 1, 'lg' => 6]->getColumns(): int|array
Všechno ostatní — label(), schema(), visible(), disabled(),
columnSpan() — je společný layoutový povrch. Viz
Společné API layoutů.