mirror of
https://github.com/filamentphp/filament.git
synced 2026-09-24 15:42:09 +08:00
Split traits
This commit is contained in:
@@ -4,16 +4,40 @@ title: Adding an action to a Livewire component
|
||||
|
||||
## Setting up the Livewire component
|
||||
|
||||
You must use the `InteractsWithActions` trait and implement the `HasActions` interface on your Livewire component class:
|
||||
First, generate a new Livewire component:
|
||||
|
||||
```bash
|
||||
php artisan make:livewire ManageProduct
|
||||
```
|
||||
|
||||
Then, render your Livewire component on the page:
|
||||
|
||||
```blade
|
||||
@livewire('manage-product')
|
||||
```
|
||||
|
||||
Alternatively, you can use a full-page Livewire component:
|
||||
|
||||
```php
|
||||
use App\Http\Livewire\ManageProduct;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('products/{product}/manage', ManageProduct::class);
|
||||
```
|
||||
|
||||
You must use the `InteractsWithActions` and `InteractsWithForms` traits, and implement the `HasActions` and `HasForms` interfaces on your Livewire component class:
|
||||
|
||||
```php
|
||||
use Filament\Actions\Concerns\InteractsWithActions;
|
||||
use Filament\Actions\Contracts\HasActions;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Livewire\Component;
|
||||
|
||||
class ManagePost extends Component implements HasActions
|
||||
class ManagePost extends Component implements HasActions, HasForms
|
||||
{
|
||||
use InteractsWithActions;
|
||||
use InteractsWithForms;
|
||||
|
||||
// ...
|
||||
}
|
||||
@@ -28,11 +52,14 @@ use App\Models\Post;
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Actions\Concerns\InteractsWithActions;
|
||||
use Filament\Actions\Contracts\HasActions;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Livewire\Component;
|
||||
|
||||
class ManagePost extends Component implements HasActions
|
||||
class ManagePost extends Component implements HasActions, HasForms
|
||||
{
|
||||
use InteractsWithActions;
|
||||
use InteractsWithForms;
|
||||
|
||||
public Post $post;
|
||||
|
||||
|
||||
@@ -18,9 +18,6 @@ use InvalidArgumentException;
|
||||
*/
|
||||
trait InteractsWithActions
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use ResolvesDynamicLivewireProperties;
|
||||
|
||||
/**
|
||||
* @var array<string> | null
|
||||
*/
|
||||
|
||||
@@ -5,6 +5,8 @@ namespace Filament\Pages;
|
||||
use Closure;
|
||||
use Filament\Actions\Concerns\InteractsWithActions;
|
||||
use Filament\Actions\Contracts\HasActions;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Support\Exceptions\Halt;
|
||||
use Filament\Tables\Contracts\RendersActionModal;
|
||||
use Illuminate\Contracts\Support\Htmlable;
|
||||
@@ -12,9 +14,10 @@ use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Livewire\Component;
|
||||
|
||||
abstract class BasePage extends Component implements HasActions, RendersActionModal
|
||||
abstract class BasePage extends Component implements HasActions, HasForms, RendersActionModal
|
||||
{
|
||||
use InteractsWithActions;
|
||||
use InteractsWithForms;
|
||||
|
||||
protected static string $layout;
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace Filament\Resources\Pages;
|
||||
|
||||
use Filament\Actions\Action;
|
||||
use Filament\Actions\CreateAction;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Infolists\Infolist;
|
||||
use Filament\Resources\Pages\ListRecords\Tab;
|
||||
@@ -14,8 +15,9 @@ use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class ListRecords extends Page implements Tables\Contracts\HasTable
|
||||
class ListRecords extends Page implements Forms\Contracts\HasForms, Tables\Contracts\HasTable
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use Tables\Concerns\InteractsWithTable {
|
||||
makeTable as makeBaseTable;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace Filament\Resources\RelationManagers;
|
||||
|
||||
use Filament\Facades\Filament;
|
||||
use Filament\Forms;
|
||||
use Filament\Forms\Form;
|
||||
use Filament\Infolists\Infolist;
|
||||
use Filament\Resources\Pages\ViewRecord;
|
||||
@@ -17,8 +18,9 @@ use Illuminate\Support\Facades\Gate;
|
||||
use Illuminate\Support\Str;
|
||||
use Livewire\Component;
|
||||
|
||||
class RelationManager extends Component implements Tables\Contracts\HasTable
|
||||
class RelationManager extends Component implements Forms\Contracts\HasForms, Tables\Contracts\HasTable
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use Tables\Concerns\InteractsWithTable {
|
||||
makeTable as makeBaseTable;
|
||||
}
|
||||
|
||||
@@ -57,5 +57,5 @@ interface HasForms
|
||||
* @param array<string, string> $attributes
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function validate(?array $rules = null, array $messages = [], array $attributes = []): array;
|
||||
public function validate($rules = null, $messages = [], $attributes = []);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,24 @@ use Illuminate\Support\Facades\Route;
|
||||
Route::get('products/{product}', ViewProduct::class);
|
||||
```
|
||||
|
||||
You must use the `InteractsWithInfolists` and `InteractsWithForms` traits, and implement the `HasInfolists` and `HasForms` interfaces on your Livewire component class:
|
||||
|
||||
```php
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Infolists\Concerns\InteractsWithInfolists;
|
||||
use Filament\Infolists\Contracts\HasInfolists;
|
||||
use Livewire\Component;
|
||||
|
||||
class ViewProduct extends Component implements HasInfolists, HasForms
|
||||
{
|
||||
use InteractsWithInfolists;
|
||||
use InteractsWithForms;
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Adding the infolist
|
||||
|
||||
Next, add a method to the Livewire component which accepts an `$infolist` object, modifies it, and returns it:
|
||||
|
||||
@@ -13,9 +13,6 @@ use Filament\Support\Exceptions\Halt;
|
||||
|
||||
trait InteractsWithInfolists
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use ResolvesDynamicLivewireProperties;
|
||||
|
||||
protected bool $hasInfolistsModalRendered = false;
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,7 @@ Route::get('products', ListProducts::class);
|
||||
|
||||
There are 3 tasks when adding a table to a Livewire component class:
|
||||
|
||||
1) Implement the `HasTable` interface and use the `InteractsWithTable` trait.
|
||||
1) Implement the `HasTable` and `HasForms` interfaces, and use the `InteractsWithTable` and `InteractsWithForms` traits.
|
||||
2) Add a `table()` method, which is where you configure the table. [Add the table's columns, filters, and actions](getting-started#columns).
|
||||
3) Make sure to define the base query that will be used to fetch rows in the table. For example, if you're listing products from your `Product` model, you will want to return `Product::query()`.
|
||||
|
||||
@@ -40,6 +40,8 @@ namespace App\Http\Livewire;
|
||||
|
||||
use App\Models\Post;
|
||||
use App\Models\Shop\Product;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Tables\Columns\TextColumn;
|
||||
use Filament\Tables\Concerns\InteractsWithTable;
|
||||
use Filament\Tables\Contracts\HasTable;
|
||||
@@ -47,9 +49,10 @@ use Filament\Tables\Table;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Livewire\Component;
|
||||
|
||||
class ListProducts extends Component implements HasTable
|
||||
class ListProducts extends Component implements HasTable, HasForms
|
||||
{
|
||||
use InteractsWithTable;
|
||||
use InteractsWithForms;
|
||||
|
||||
public function table(Table $table): Table
|
||||
{
|
||||
|
||||
@@ -27,7 +27,6 @@ trait InteractsWithTable
|
||||
use HasColumns;
|
||||
use HasFilters;
|
||||
use HasRecords;
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use CanBeStriped;
|
||||
use CanPollRecords;
|
||||
use HasContent;
|
||||
|
||||
@@ -7,5 +7,6 @@ use Livewire\Component;
|
||||
|
||||
abstract class TableComponent extends Component implements Forms\Contracts\HasForms, Contracts\HasTable
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use Concerns\InteractsWithTable;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
namespace {{ namespace }};
|
||||
|
||||
use App\Models\{{ model }};
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Concerns\InteractsWithTable;
|
||||
use Filament\Tables\Contracts\HasTable;
|
||||
@@ -11,8 +13,9 @@ use Livewire\Component;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class {{ class }} extends Component implements HasTable
|
||||
class {{ class }} extends Component implements HasForms, HasTable
|
||||
{
|
||||
use InteractsWithForms;
|
||||
use InteractsWithTable;
|
||||
|
||||
public function table(Table $table): Table
|
||||
|
||||
@@ -2,14 +2,16 @@
|
||||
|
||||
namespace Filament\Widgets;
|
||||
|
||||
use Filament\Forms;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Illuminate\Contracts\Pagination\Paginator;
|
||||
use Illuminate\Contracts\Support\Htmlable;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
|
||||
class TableWidget extends Widget implements Tables\Contracts\HasTable
|
||||
class TableWidget extends Widget implements Forms\Contracts\HasForms, Tables\Contracts\HasTable
|
||||
{
|
||||
use Forms\Concerns\InteractsWithForms;
|
||||
use Tables\Concerns\InteractsWithTable {
|
||||
makeTable as makeBaseTable;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace Filament\Tests\Tables\Fixtures;
|
||||
|
||||
use Filament\Forms\ComponentContainer;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Concerns\InteractsWithForms;
|
||||
use Filament\Forms\Contracts\HasForms;
|
||||
use Filament\Tables;
|
||||
use Filament\Tables\Table;
|
||||
use Filament\Tests\Models\Post;
|
||||
@@ -12,8 +14,9 @@ use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
|
||||
use Illuminate\Database\Query\Builder;
|
||||
use Livewire\Component;
|
||||
|
||||
class PostsTable extends Component implements Tables\Contracts\HasTable
|
||||
class PostsTable extends Component implements HasForms, Tables\Contracts\HasTable
|
||||
{
|
||||
use InteractsWithForms;
|
||||
use Tables\Concerns\InteractsWithTable;
|
||||
|
||||
public function table(Table $table): Table
|
||||
|
||||
Reference in New Issue
Block a user