Appunti Screencast Livewire
Contenuto degli appunti dallo screencast del sito ufficiale di Livewire:
- Utilità
- Test
- Form Notification
- Custom Form Input + Trix e Flatpickr
- File Upload + Filepond
- Data Table
Utilità
I componenti posso essere delle pagine intere: Route::get('...',full/qualified/path/component::class)
Si possono rinominare e spostare i file con livewire:move "nome" "cartella.nuovonome“.
Nei metodi dei componenti si possono fare i return redirect().
Quando bisogna mostrare condizionalmente div fratelli, é meglio racchiuderli in un div esterno.
Se si dichiara $rules si può usare validate() senza argomenti.
Si puó dichiarare public ModelName $modelName; per non importare tutti gli attributi a mano.
ModelName::make() crea un’istanza vuota.
Per salvare le modifiche -> $modelName->save()
Si puó accedere alla proprietá dei componenti Livewire tramite Alpine con $wire.nome.
Nei file Blade si può usare $attributes->wire('nomeAttributo').
x-data="{ open: @entangle($attributes->wire('model')) }"
Per risparmiare request inutili, come quelle per aprire/chiudere modal, si può usare wire:model.defer.
wire:init permette di eseguire una funzione non appena il componente viene renderizzato.
Test
php artisan make:test
Se si agisce sul database, ricordarsi di usare use RefreshDatabase.
Livewire::test('nome.component')
->set(var,val)
->call('method')
->assert(...);
Tra tutti i test si comina con:
x_page_contains_livewire_component(){
$this->get($url)->assertSeeLivewire('nome');
}
Form Notification
$model->refresh() sincronizza il contenuto della variabile con il database.
updated($field) intercetta l’input di una properità specifica.
$this->dispatchBrowserEvent('nome') è un browser event ascoltabile con addEventListener.
$this->emit('nome') è un evento livewire e si può ascoltare in Alpine con Livewire.on('nome',fn).
Entrambi i tipi di evento hanno event.detail.
Un’altra opzione per gestire gli eventi è : usare $emitSelf in Livewire + @this.on() in Livewire.
Si usa x-on:nomevento.window per ascoltare un evento window level.
Nei componenti Livewire, le notifiche si fanno con session()->flash().
Per evitare che i componenti nascosti flashino durante il caricamento della pagina si puó usare style="display: none".
Custom Form Input
wire:model = $dispatch('input', val)
wire:model.lazy = $dispatch('change', val)
Con x-init si possono configurare le librerire js e si può usare $refs.name per riferirsi agli elementi.
Con Alpine si possono emettere custom event con $dispatch('nome').
Se si usa wire:ignore non funzionano i wire:model negli elementi figli.
Se si usa alpine si può evitare wire:ignore.
A volte nei custom input conviene aggiungere wire:model.debounce
Trix
<div
x-data = "{
value: @entangle($attributes->wire('model'))
}"
x-init="
$refs.trix.editor.loadHTML(value);
$watch('value', value => document.activeElement !== $refs.trix && $refs.trix.editor.loadHTML(value))
"
x-on:trix-change="value = $event.target.value"
wire:ignore
>
<input id="x" type="hidden">
<trix-editor x-ref="trix" input="x"></trix-editor>
</div>
Flatpickr
Coming soon...
File Upload
Per i test si può usare UploadedFile::fake().
La preview del file si può caricare con $var->temporaryUrl().
Label Hack : click su label = click su input hidden ( quest’ultimo con sr-only e @focus ring con Alpine).
Un’alternativa a questo trucco è utilizzare $refs.nome.click()/submit().
Filepond
<div
wire:ignore
x-data="{
name: '{{ $attributes->wire('model')->value() }}',
}"
x-init="
$nextTick(() => {
FilePond.create($refs.{{ $attributes->get('ref') ?? 'input' }});
FilePond.setOptions({
allowMultiple: {{ $attributes->has('multiple') ? 'true' : 'false' }},
server: {
process:(fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
@this.upload(name, file, load, error, progress);
},
revert: (filename, load) => {
@this.removeUpload(name, filename, load)
},
},
allowImagePreview: {{ $attributes->has('allowImagePreview') ? 'true' : 'false' }},
imagePreviewMaxHeight: {{ $attributes->has('imagePreviewMaxHeight') ? $attributes->get('imagePreviewMaxHeight') : '256' }},
allowFileTypeValidation: {{ $attributes->has('allowFileTypeValidation') ? 'true' : 'false' }},
acceptedFileTypes: {!! $attributes->get('acceptedFileTypes') ?? 'null' !!},
allowFileSizeValidation: {{ $attributes->has('allowFileSizeValidation') ? 'true' : 'false' }},
maxFileSize: {!! $attributes->has('maxFileSize') ? "'".$attributes->get('maxFileSize')."'" : 'null' !!}
});
})
"
>
<input type="file" x-ref="{{ $attributes->get('ref') ?? 'input' }}" />
</div>
Questo componenete blade può interagire con Spatie Media Library:
collect($this->images)->each( fn($image) =>
$this->product->addMedia($image->getRealPath())
->toMediaCollection('gallery')
);
Data Table
Aggiungere protected $queryString = [ 'par1', 'par2', ... ] al componente Livewire permette di aggiungere gli attributi nella querystring.
Per i filtri si aggiunge la proprietà $filters[] a cui si associano gli input con il parametro lazy.
Per il sorting si usano le proprietà $field e $direction.
I filtri possono essere reimpostati alla stato iniziale con $this->reset($filters).
Nei cicli for e se si fa paginazione bisogna ricordarsi di specificare
key="ref-{{ $id }}"agli elementi per non rischiare di rimpiazzarne il contenuto.
Radio Italia
Radio Kiss Kiss
Radio Cuore
RadioAnimati