PHP code example of bezhansalleh / filament-plugin-essentials
1. Go to this page and download the library: Download bezhansalleh/filament-plugin-essentials library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
bezhansalleh / filament-plugin-essentials example snippets
namespace YourVendor\YourPlugin;
use BezhanSalleh\PluginEssentials\Concerns\Plugin;
use Filament\Contracts\Plugin;
class YourPlugin implements Plugin
{
use Plugin\HasNavigation;
use Plugin\HasLabels;
use Plugin\HasGlobalSearch;
use Plugin\WithMultipleResourceSupport; // For multi-forResource plugins
public static function make(): static
{
return app(static::class);
}
public function getId(): string
{
return 'your-plugin';
}
// ... rest of plugin implementation
}
namespace YourVendor\YourPlugin\Resources;
use BezhanSalleh\PluginEssentials\Concerns;
use Filament\Resources\Resource;
class UserResource extends Resource
{
use Concerns\Resource\HasNavigation;
use Concerns\Resource\HasLabels;
use Concerns\Resource\HasGlobalSearch;
protected static ?string $model = User::class;
// Required: Link resource to plugin
public static function getEssentialsPlugin(): ?YourPlugin
{
return YourPlugin::get();
}
// ... rest of forResource implementation
}
class YourPlugin implements Plugin
{
use HasNavigation, HasLabels, HasGlobalSearch;
protected function getPluginDefaults(): array
{
return [
// Global defaults (apply to all resources)
'navigationGroup' => 'Your Plugin',
'navigationIcon' => 'heroicon-o-puzzle-piece',
'modelLabel' => 'Item',
'pluralModelLabel' => 'Items',
'globalSearchResultsLimit' => 25,
// Resource-specific defaults (optional)
'resources' => [
UserResource::class => [
'modelLabel' => 'User',
'pluralModelLabel' => 'Users',
'navigationIcon' => 'heroicon-o-users',
'globalSearchResultsLimit' => 50,
],
PostResource::class => [
'modelLabel' => 'Post',
'pluralModelLabel' => 'Posts',
'navigationIcon' => 'heroicon-o-document-text',
'navigationSort' => 10,
],
],
];
}
}
use YourVendor\YourPlugin\YourPlugin;
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
YourPlugin::make()
->navigationLabel('Custom Label')
->navigationIcon('heroicon-o-star')
->modelLabel('Custom Item')
->globalSearchResultsLimit(30),
]);
}
YourPlugin::make()
// Configure UserResource
->forResource(UserResource::class)
->navigationLabel('Users')
->modelLabel('User')
->globalSearchResultsLimit(25)
// Configure PostResource
->forResource(PostResource::class)
->navigationLabel('Posts')
->modelLabel('Article')
->globalSearchResultsLimit(10)
YourPlugin::make()
->navigationLabel(fn() => 'Users (' . User::count() . ')')
->navigationBadge(fn() => User::whereNull('email_verified_at')->count())
->modelLabel(fn() => auth()->user()->isAdmin() ? 'Admin User' : 'User')
use BezhanSalleh\PluginEssentials\Concerns\Plugin; // plugin
use BezhanSalleh\PluginEssentials\Concerns\Resource; // forResource
$plugin
->navigationLabel('Label') // string|Closure|null
->navigationIcon('heroicon-o-home') // string|Closure|null
->activeNavigationIcon('heroicon-s-home') // string|Closure|null
->navigationGroup('Group') // string|Closure|null
->navigationSort(10) // int|Closure|null
->navigationBadge('5') // string|Closure|null
->navigationBadgeColor('success') // string|array|Closure|null
->navigationParentItem('parent.item') // string|Closure|null
->slug('custom-slug') // string|Closure|null
->registerNavigation(false); // bool|Closure
protected function getPluginDefaults(): array
{
return [
'navigationLabel' => 'Your Label',
'navigationIcon' => 'heroicon-o-home',
'activeNavigationIcon' => 'heroicon-s-home',
'navigationGroup' => 'Your Group',
'navigationSort' => 10,
'navigationBadge' => null,
'navigationBadgeColor' => null,
'navigationParentItem' => null,
'slug' => null,
'registerNavigation' => true,
];
}
$plugin
->modelLabel('Model') // string|Closure|null
->pluralModelLabel('Models') // string|Closure|null
->recordTitleAttribute('name') // string|Closure|null
->titleCaseModelLabel(false); // bool|Closure
protected function getPluginDefaults(): array
{
return [
'modelLabel' => 'Item',
'pluralModelLabel' => 'Items',
'recordTitleAttribute' => 'name',
'titleCaseModelLabel' => true,
];
}
$plugin
->globallySearchable(true) // bool|Closure
->globalSearchResultsLimit(50) // int|Closure
->forceGlobalSearchCaseInsensitive(true) // bool|Closure|null
->splitGlobalSearchTerms(false); // bool|Closure
protected function getPluginDefaults(): array
{
return [
'globallySearchable' => true,
'globalSearchResultsLimit' => 50,
'forceGlobalSearchCaseInsensitive' => null,
'splitGlobalSearchTerms' => false,
];
}
$plugin->cluster(MyCluster::class); // string|Closure|null
protected function getPluginDefaults(): array
{
return [
'cluster' => null,
];
}
$plugin->parentResource(ParentResource::class); // string|Closure|null
protected function getPluginDefaults(): array
{
return [
'parentResource' => null,
];
}
$plugin
->scopeToTenant(true) // bool|Closure
->tenantRelationshipName('organization') // string|Closure|null
->tenantOwnershipRelationshipName('owner'); // string|Closure|null
protected function getPluginDefaults(): array
{
return [
'scopeToTenant' => true,
'tenantRelationshipName' => null,
'tenantOwnershipRelationshipName' => null,
];
}
class YourPlugin implements Plugin
{
use HasNavigation;
use WithMultipleResourceSupport;
}
// Usage:
$plugin
->forResource(UserResource::class)
->navigationLabel('Users')
->forResource(PostResource::class)
->navigationLabel('Posts');