UI Components
Dashboard Widgets
Widget Interface
<?php
namespace Plugins\MyPlugin\Widget;
use App\Core\Widget\WidgetContext;
use App\Core\Widget\WidgetInterface;
use App\Core\Widget\WidgetPosition;
class MyWidget implements WidgetInterface
{
public function __construct(
private readonly MyService $myService,
) {}
public function getName(): string
{
return 'my_widget';
}
public function getDisplayName(): string
{
return 'My Custom Widget';
}
public function getSupportedContexts(): array
{
return [
WidgetContext::DASHBOARD, // Main dashboard
WidgetContext::SERVER_DETAIL, // Server detail page
];
}
public function getPosition(): WidgetPosition
{
return WidgetPosition::RIGHT; // LEFT, CENTER, RIGHT
}
public function getPriority(): int
{
return 50; // Higher = appears first (0-100)
}
public function getColumnSize(): int
{
return 12; // Bootstrap grid: 1-12 (12 = full width)
}
public function getTemplate(): string
{
return '@PluginMyPlugin/widgets/my_widget.html.twig';
}
public function getData(WidgetContext $context, array $contextData): array
{
// Prepare data for template
$data = $this->myService->getWidgetData();
return [
'items' => $data,
'count' => count($data),
'last_updated' => new \DateTimeImmutable(),
];
}
public function isVisible(WidgetContext $context, array $contextData): bool
{
// Control widget visibility
// Example: only show to admins
return $this->security->isGranted('ROLE_ADMIN');
}
}Widget Template
Registering Widgets
Widget Contexts
Widget Positions
Widget Best Practices
Server Tabs
Tab Interface
Tab Template
Context Data Available
Registering Tabs
Related Guides
Last updated