Formuláře
ViewField
Váš vlastní Blade view vykreslený v toku schématu, se stavem pole předaným dovnitř.
Na této stránce
Váš vlastní Blade partial, vykreslený ve schématu tam, kde by bylo pole. Sáhni
po ViewFieldu, když je to, co potřebujete ukázat, víc než řádek textu — náhled
právě editované objednávky, graf, mapa, vlastní malá komponenta — a radši to
napíšete v Blade, než abys stavěl vlastní pole.
use NyonCode\WireForms\Components\Display\ViewField;
Jak to funguje
ViewField je zobrazovací komponenta: vykresluje výstup a nikdy se neváže na stav formuláře. Žádná state path, žádná validace, nic se neodesílá.
View vyhrává nad content. Vykreslený markup se nejdřív ptá na getView()
a na getContent() spadne, jen když žádný view nastavený není. Komponenta, která
má obojí, tedy ukáže view a řetězec tiše ignoruje — nastavte jedno, nebo druhé.
Partial se @includeuje, nevykresluje se izolovaně. Plynou z toho dvě věci
a ta druhá je ta užitečná:
- Cokoli drží
viewData(), přijde jako proměnné, takže['total' => 120]je v partialu$total. - Blade
@includenavíc předává obklopující scope, takže$field— samotnýViewField— je k dispozici, aniž byste ho předávali. Tak se partial dostane k$field->getLabel()nebo k metodám vaší vlastní podtřídy.
viewData() může být closure, vyhodnocovaná při každém čtení, a právě to dovolí
partialu ukázat něco, co závisí na aktuálním stavu, ne na tom, co platilo při
deklaraci schématu.
escape() se čte pozpátku a stojí za to přečíst to dvakrát. Nastavuje
„vykreslit jako HTML“ na opak svého argumentu a ta property začíná na false:
- Obsah se ve výchozím stavu escapuje. Nic se volat nemusí.
->escape()— argument má výchozítrue— tedy nedělá vůbec nic.->escape(false)je to, co surové HTML zapne.
Týká se to jen fallbacku přes content(). Partial vykreslený přes view() je
Blade a escapuje si, co si escapuje sám.
Základní použití
ViewField::make('preview') ->label('Náhled') ->view('forms.order-preview')
{{-- resources/views/forms/order-preview.blade.php --}}<div class="rounded border border-gray-200 p-3 text-sm dark:border-gray-700"> <p class="font-medium">{{ $field->getLabel() }}</p> <p>{{ $lines }} položek · {{ $total }}</p></div>
Předání dat
ViewField::make('preview') ->view('forms.order-preview') ->viewData(fn (): array => [ 'lines' => count($this->data['items'] ?? []), 'total' => number_format($this->orderTotal(), 2), ])
Closure místo pole, aby ta čísla byla ta, co jsou zrovna na obrazovce. Aby se
přepočítávala, jak uživatel píše, potřebují pole, na kterých závisí, live().
Bez view
ViewField s content() a bez view() je Placeholder
s obráceným přepínačem escapování. Na tohle použijte radši Placeholder;
ViewField sáhni tehdy, když je tam partial.
Rozšířený příklad
Formulář objednávky ve skutečném Livewire hostu, kde partial ukazuje náhled toho, co se právě staví:
use Livewire\Component;use NyonCode\WireCore\Foundation\Schema\Grid;use NyonCode\WireForms\Components\Display\ViewField;use NyonCode\WireForms\Components\Select;use NyonCode\WireForms\Components\TextInput;use NyonCode\WireForms\Forms\Form;use NyonCode\WireForms\Forms\WithForms; class BuildOrder extends Component{ use WithForms; public ?array $data = []; public function form(Form $form): Form { return $form ->statePath('data') ->model(Order::class) ->schema([ Grid::make()->columns(2)->schema([ Select::make('product_id') ->options(Product::pluck('name', 'id')) ->live() ->required(), TextInput::make('quantity') ->numeric() ->default(1) ->live() ->required(), ViewField::make('preview') ->label('Náhled objednávky') ->view('forms.order-preview') ->viewData(fn (): array => [ 'product' => Product::find($this->data['product_id'] ?? null), 'quantity' => (int) ($this->data['quantity'] ?? 0), ]) ->columnSpanFull(), ]), ]) ->successMessage('Objednávka odeslána'); } public function save(): void { $this->form->save(); }}
Oba vstupy jsou live(), a právě to nechá náhled jít za nimi: view field nemá čím
reagovat sám — překreslí se, když se překreslí formulář.
ViewField API
->view(string $view) // Blade view; vyhrává nad content()->viewData(array|Closure $data) // proměnné pro view, vyhodnocené při čtení->content(string|Closure|null $content) // fallback, když není view; ve výchozím stavu escapovaný->escape(bool $condition = true) // OBRÁCENĚ: escape(false) zapne surové HTML, escape() nedělá nic->getView(): ?string->getViewData(): array->getContent(): ?string->isHtmlContent(): bool
Popisky, pomocný text, viditelnost a columnSpan() jsou sdílený povrch komponent —
viz Společné API pole. Validace, live() a výchozí
hodnoty neplatí: view field žádný stav nedrží.
Související
- Placeholder — řádek textu, ve výchozím stavu escapovaný
- Html — řetězec markupu bez partialu za sebou
- Vlastní pole — když ta věc hodnotu držet potřebuje
- Reaktivní pole — proč pole, která sleduje, potřebují
live()