K

Core

Rozšiřování povrchů

Přidání vlastních typů sloupců, filtrů a akcí, tlačítka na povrchy, které nevlastníte, a pipes tvarující každý dotaz tabulky.

Na této stránce

Tři věci, kterými plugin mění, co vykresluje cizí kód: registruje typy, které pak framework umí postavit podle jména, přidává tlačítka a akce na povrchy, které nevlastní, a staví pipes před dotaz, který každá tabulka pouští. Každá z nich je registr, ne patch.

Registry typů sloupců, filtrů a akcí

Pluginy mohou zaregistrovat aliasy tříd pro plugin-aware buildery, admin nástroje, schema importéry nebo integrace balíčků.

public function register(PluginManager $manager): void
{
$manager->addColumnType('money', \App\Tables\Columns\MoneyColumn::class);
$manager->addFilterType('date-range', \App\Tables\Filters\DateRangeFilter::class);
$manager->addActionType('workflow', \App\Tables\Actions\WorkflowAction::class);
}

Čtěte registry z manageru:

$columns = app(PluginManager::class)->getColumnTypes();
$filters = app(PluginManager::class)->getFilterTypes();
$actions = app(PluginManager::class)->getActionTypes();

Komponenty Wire Table stále přijímají normální instance přímo:

return $table
->columns([
MoneyColumn::make('total'),
])
->filters([
DateRangeFilter::make('created_at'),
]);

Registry typů jsou metadatové registry. Automaticky nevykreslí sloupec, filtr ani akci podle aliasu, dokud váš vlastní builder nebo balíček registr nekonzumuje.

Přidávání tlačítek a akcí

Většina tlačítek ve Wire tabulkách jsou akce:

Umístění v UI Třída/API
Řádkové tlačítko Action v Table::actions()
Tlačítko hromadného toolbaru BulkAction v Table::bulkActions()
Tlačítko hlavičkového toolbaru HeaderAction v Table::headerActions()
Tlačítko uvnitř buňky tabulky ButtonColumn v Table::columns()
Prosté Blade tlačítko <x-wire::button>

Pluginy automaticky neinjektují tlačítka do každé tabulky. Obvyklý vzor je zaregistrovat table makro v boot() a nechat každou tabulku se přihlásit. Makro by se mělo sloučit s existujícími akcemi místo jejich nahrazení. Makrovatelné jsou i Form, Column, Field a Filter, takže ten samý vzor funguje o úroveň níž — Column::macro() dá každému typu sloupce slovo, které neměl.

Makro hlavičkového tlačítka

use App\Services\InvoiceExportService;
use NyonCode\WireCore\Actions\HeaderAction;
use NyonCode\WireCore\Core\Plugin\Contracts\Plugin;
use NyonCode\WireCore\Core\Plugin\PluginManager;
use NyonCode\WireTable\Table;
 
final class BillingPlugin implements Plugin
{
public function getId(): string
{
return 'billing';
}
 
public function register(PluginManager $manager): void
{
//
}
 
public function boot(PluginManager $manager): void
{
Table::macro('withInvoiceExportButton', function (): static {
return $this->headerActions([
...$this->getHeaderActions(),
 
HeaderAction::make('export-invoices')
->label('Export invoices')
->icon('download')
->action(fn () => app(InvoiceExportService::class)->queue()),
]);
});
}
}

Použijte tlačítko na tabulkách, které ho potřebují:

public function table(Table $table): Table
{
return $table
->model(Invoice::class)
->withInvoiceExportButton()
->columns([
// ...
]);
}

Makro řádkového tlačítka

use NyonCode\WireCore\Actions\Action;
use NyonCode\WireTable\Table;
 
Table::macro('withAuditTrailButton', function (): static {
return $this->actions([
...$this->getActions(),
 
Action::make('audit-trail')
->label('Audit')
->icon('history')
->url(fn ($record) => route('audit.show', [
'type' => get_class($record),
'id' => $record->getKey(),
])),
]);
});

Makro hromadného tlačítka

use Illuminate\Support\Collection;
use NyonCode\WireCore\Actions\BulkAction;
use NyonCode\WireTable\Table;
 
Table::macro('withBulkArchiveButton', function (): static {
return $this->bulkActions([
...$this->getBulkActions(),
 
BulkAction::make('archive-selected')
->label('Archive selected')
->icon('archive')
->requiresConfirmation()
->action(fn (Collection $records) => $records->each->archive()),
]);
});

Makro sloupce s tlačítkem v buňce

Použijte ButtonColumn, když je tlačítko součástí viditelných sloupců každého řádku spíš než oblasti řádkových akcí.

use NyonCode\WireTable\Columns\ButtonColumn;
use NyonCode\WireTable\Table;
 
Table::macro('withPreviewButtonColumn', function (): static {
return $this->columns([
...$this->getColumns(),
 
ButtonColumn::make('preview')
->buttonIcon('eye')
->buttonLabel('Preview')
->actionUrl(fn ($record) => route('records.preview', $record)),
]);
});

Pro příkazy preferujte akce. Použijte ButtonColumn, když tlačítko potřebuje sedět mezi ostatními sloupci nebo když je jeho stav přirozeně sloupcový. Pro odkazy v buňce použijte actionUrl(). Pro Livewire volání v buňce použijte livewireAction() a implementujte tu metodu na Livewire table komponentě.

Query pipes

Pluginy mohou zaregistrovat instance query pipe s managerem. Vykonání dotazu tabulky připojí plugin pipes za výchozí query pipeline.

use Closure;
use Illuminate\Database\Eloquent\Builder;
use NyonCode\WireCore\Core\Query\Contracts\QueryPipe;
use NyonCode\WireCore\Core\Query\QueryPlan;
 
final class ApplyTenantScope implements QueryPipe
{
public function handle(Builder $builder, QueryPlan $plan, Closure $next): Builder
{
$builder->where('tenant_id', auth()->user()->tenant_id);
 
return $next($builder, $plan);
}
}

Zaregistrujte ho z pluginu:

public function register(PluginManager $manager): void
{
$manager->addQueryPipe('tenant', new ApplyTenantScope());
}

Získejte registrované pipes pro vlastní query executor:

$pipes = app(PluginManager::class)->getQueryPipes();

Výchozí pořadí query pipe tabulky:

Pořadí Pipe
1 ApplyScopes
2 ApplySoftDeletes
3 ApplyRelations
4 ApplySearch
5 ApplyFilters
6 ApplySorting
7 ApplyAggregates
8 ApplyEagerLoads
9+ Plugin pipes

Použijte table modifyQueryUsing(), když změna patří jedné tabulce. Použijte query pipe, když stavíte znovupoužitelné query chování, které má běžet jako součást sdílené query planner/executor pipeline.

Související

  • Pluginy — třída, která registruje
  • Hooky — druhá polovina téhož životního cyklu
  • Vlastní pole — jak napsat typ, který pak registr drží
  • Zdroje dat — kde query pipe skončí