Tabulka
Vlastní třída filtru
Pro znovupoužitelné, složité filtry rozšiřte základní třídu Filter.
Na této stránce
Pro znovupoužitelné, složité filtry rozšiřte základní třídu Filter.
Kostra
namespace App\Wire\Filters; use NyonCode\WireTable\Filters\Filter;use Illuminate\Database\Eloquent\Builder; class MyFilter extends Filter{ // Vlastní vlastnosti protected string $myOption = 'default'; // Fluent setter public function myOption(string $value): static { $this->myOption = $value; return $this; } // Getter (pro Blade pohled) public function getMyOption(): string { return $this->myOption; } // Přepsat apply logiku public function apply(Builder $query, mixed $value): Builder { if (empty($value)) { return $query; } // Vaše vlastní logika dotazu return $query->where(...); } // Vlastní Blade pohled (volitelné) — přepište render() a nasměrujte na svůj pohled. // Pohled dostane 'filter' (tuto instanci) a 'value' (aktuální stav). public function render(mixed $value = null): string { if (! $this->canView()) { return ''; } return view('filters.my-filter', ['filter' => $this, 'value' => $value])->render(); }}
Příklad: Filtr JSON Contains
namespace App\Wire\Filters; use NyonCode\WireTable\Filters\SelectFilter;use Illuminate\Database\Eloquent\Builder; // Rozšiřuje SelectFilter, takže dědí ->options()/->searchable()/->native().class JsonContainsFilter extends SelectFilter{ protected string $jsonPath = ''; public function jsonPath(string $path): static { $this->jsonPath = $path; return $this; } public function apply(Builder $query, mixed $value): Builder { if (empty($value)) { return $query; } $column = $this->getColumn(); if ($this->jsonPath) { return $query->whereJsonContains("{$column}->{$this->jsonPath}", $value); } return $query->whereJsonContains($column, $value); }}
Použití:
JsonContainsFilter::make('permissions') ->column('settings') ->jsonPath('permissions') ->options(['admin' => 'Admin', 'edit' => 'Edit', 'view' => 'View'])
Příklad: Filtr geo poloměru
namespace App\Wire\Filters; use NyonCode\WireTable\Filters\Filter;use Illuminate\Database\Eloquent\Builder; class GeoRadiusFilter extends Filter{ protected float $defaultRadius = 10.0; protected string $latColumn = 'latitude'; protected string $lngColumn = 'longitude'; public function radius(float $km): static { $this->defaultRadius = $km; return $this; } public function coordinates(string $lat, string $lng): static { $this->latColumn = $lat; $this->lngColumn = $lng; return $this; } public function apply(Builder $query, mixed $value): Builder { if (empty($value['lat']) || empty($value['lng'])) { return $query; } $lat = (float) $value['lat']; $lng = (float) $value['lng']; $radius = (float) ($value['radius'] ?? $this->defaultRadius); // Haversinův vzorec (vrací km) $haversine = "(6371 * acos( cos(radians(?)) * cos(radians({$this->latColumn})) * cos(radians({$this->lngColumn}) - radians(?)) + sin(radians(?)) * sin(radians({$this->latColumn})) ))"; return $query ->whereRaw("{$haversine} <= ?", [$lat, $lng, $lat, $radius]); } public function getDefaultRadius(): float { return $this->defaultRadius; } public function render(mixed $value = null): string { if (! $this->canView()) { return ''; } return view('filters.geo-radius', ['filter' => $this, 'value' => $value])->render(); }}