Validation
This example illustrates the use of Validation Rules and Data Update.
You can switch the availablity of each Ice cream flavor.
Validation Rules
-
• The price must be in "#,## €" format, and between 2,00 € and 5,00 €.
-
• Each flavor can only appear once.
-
• Valid flavors are: chocolate, vanilla, strawberry, coconut, mint, and caramel.
ID
|
🍦 Flavor
|
Price
|
In Stock
|
---|---|---|---|
1
|
|
|
|
2
|
|
|
|
3
|
|
|
|
Disclaimer: Table data is randomly generated for
illustrative purposes only. The information here is not a reflection of the actual market and does
not constitute business, financial, or medical advice.
<?php namespace App\Livewire\Examples\ValidationTable; use App\Models\Icecream;use App\Rules\EuroCurrencyBetween2and5;use Illuminate\Database\Eloquent\Builder;use Illuminate\Support\Facades\Validator;use Illuminate\Support\Number;use PowerComponents\LivewirePowerGrid\Column; use PowerComponents\LivewirePowerGrid\Facades\PowerGrid;use PowerComponents\LivewirePowerGrid\PowerGridComponent;use PowerComponents\LivewirePowerGrid\PowerGridFields; final class ValidationTable extends PowerGridComponent{ public string $tableName = 'validation-table'; public array $flavor; public array $price_in_eur; public array $in_stock; public bool $showErrorBag = true; public function setUp(): array { return [ PowerGrid::header() ->showSearchInput(), PowerGrid::footer() ->showPerPage() ->showRecordCount(), ]; } public function datasource(): ?Builder { return Icecream::query(); } public function fields(): PowerGridFields { return PowerGrid::fields() ->add('id') ->add('flavor') ->add('in_stock') ->add('price_in_eur', fn ($icecream) => Number::currency($icecream->price, in: 'EUR', locale: 'pt_PT')); } public function columns(): array { return [ Column::make('ID', 'id'), Column::make('🍦 Flavor', 'flavor') ->sortable() ->editOnClick(hasPermission: true) ->searchable(), Column::make('Price', 'price_in_eur') ->editOnClick(hasPermission: true), Column::make('In Stock', 'in_stock') ->toggleable(), ]; } protected function rules() { return [ 'flavor.*' => [ 'required', 'in:chocolate,vanilla,strawberry,coconut,mint,caramel', ], 'in_stock.*' => [ 'required', 'boolean', ], 'price_in_eur.*' => [ new EuroCurrencyBetween2and5, ], ]; } protected function validationAttributes() { return [ 'flavor.*' => 'Ice cream flavor', 'price_in_eur.*' => 'Ice cream price', ]; } protected function messages() { return [ 'flavor.*.in' => 'Valid flavors: :values', ]; } public function onUpdatedEditable(string|int $id, string $field, string $value): void { $this->withValidator(function (\Illuminate\Validation\Validator $validator) use ($id, $field) { if ($validator->errors()->isNotEmpty()) { $this->dispatch('toggle-'.$field.'-'.$id); } })->validate(); if ($field === 'price_in_eur') { $field = 'price'; $value = (new \NumberFormatter('pt-PT', \NumberFormatter::CURRENCY)) ->parse(preg_replace('/\s+/', "\u{A0}", $value)); } Icecream::query()->find($id)->update([ $field => e($value), ]); } public function onUpdatedToggleable(string|int $id, string $field, string $value): void { Icecream::query()->find($id)->update([ $field => e($value), ]); $this->skipRender(); }}
Code highlighting provided by Torchlight.dev