Languages

Version

Theme

导航栏

Clusters

简介

Cluster 是面板中的一种层级结构,允许你将资源自定义页面分组在一起。它有助于将面板组织成逻辑部分,并有助于缩减面板侧边栏的大小。

使用 Cluster 时,会发生以下情况:

  • 导航栏中添加了一个新的导航项,该导航项是指向 Cluster 中第一个资源或页面的链接。
  • 资源或页面的各个导航项在主导航栏中不再可见。
  • Cluster 中的每个资源或页面都会添加一个新的子导航 UI,其中包含 Cluster 中资源或页面的导航项。
  • Cluster 中的资源和页面将获得一个新的 URL,并以 Cluster 名称为前缀。如果你正确生成了指资源页面的 URL,则此更改应该会自动处理。
  • Cluster 的名称位于 Cluster 中所有资源和页面的面包屑导航中。点击它,你将转到 Cluster 中的第一个资源或页面。

创建 Cluster

在创建第一个 Cluster 之前,必须告诉面板 Cluster 类的位置。除了配置中的 discoverResources()discoverPages() 等方法外,还可以使用 discoverClusters()

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
        ->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
        ->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\\Filament\\Clusters');
}

现在,你以使用 php artisan make:filament-cluster 命令创建 Cluster:

php artisan make:filament-cluster Settings

这将会在 app/Filament/Cluster 目录中创建一个新的 Cluster 类:

<?php

namespace App\Filament\Clusters;

use BackedEnum;
use Filament\Clusters\Cluster;
use Filament\Support\Icons\Heroicon;

class Settings extends Cluster
{
    protected static string | BackedEnum | null $navigationIcon = Heroicon::OutlinedSquares2x2;
}

$navigationIcon属性默认已经定义了,因为你很可能希望立即对其进行自定义。所有其他导航属性和方法也可使用,包括 $navigationLabel$navigationSort$avigationGroup。它们用于自定义 Cluster 的主导航项,与为资源或页面自定义该导航项一样。

将资源和页面添加到 Cluster

要将资源和页面添加到 Cluster,你只需在资源或页面类中定义 $cluster 属性,并将其设置为你创建的 Cluster 类:

use App\Filament\Clusters\Settings;

protected static ?string $cluster = Settings::class;

使用 Cluster 的面板的代码结构推荐

使用 Cluster 时,推荐将所有资源和页面移到与 Cluster 同名的目录。比如,以下是一个使用名为 Settings 的 Cluster 的面板的目录结构,其中包含一个 ColorResource 和两个自定义页面:

.
+-- Clusters
|   +-- Settings.php
|   +-- Settings
|   |   +-- Pages
|   |   |   +-- ManageBranding.php
|   |   |   +-- ManageNotifications.php
|   |   +-- Resources
|   |   |   +-- ColorResource.php
|   |   |   +-- ColorResource
|   |   |   |   +-- Pages
|   |   |   |   |   +-- CreateColor.php
|   |   |   |   |   +-- EditColor.php
|   |   |   |   |   +-- ListColors.php

这只是推荐,并非强制要求。你可以随意地构建你的面板的结构,只要 Cluster 中的资源和页面使用 $cluster 属性即可。这只是一个建议,可以帮助你保持面板井然有序。

当面板中存在 Cluster,并且使用 make:filament-resourcemake:filament-page 命令生成新的资源或页面时,系统会询问你是否要根据这些准则在集群目录中创建这些资源或页面。如果选择了,Filament 还会为资源或页面类分配正确的 $cluster 属性。如果没有这样做,你将需要自己定义 $cluster 属性

设置 Cluster 中所有页面的子导航位置

子导航默认渲染在每个页面的开头。你可以针对每个页面进行自定义,也可以通过设置 $subNavigationPosition 属性一次性为整个 Cluster 进行自定义。该属性值可以是 SubNavigationPosition::StartSubNavigationPosition::EndSubNavigationPosition::Top,以将子导航渲染为标签页:

use Filament\Pages\Enums\SubNavigationPosition;

protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::End;

自定义 Cluster 的面包屑导航

Cluster 的名称存在于 Cluster 中所有资源和页面的面包屑导航中。

你可以在 Cluster 类中使用 $clusterBreadcrumb 属性自定义面包屑名称:

protected static ?string $clusterBreadcrumb = 'cluster';

此外,可以使用 getClusterBreadcrumb() 来定义面包屑的动态名称:

public static function getClusterBreadcrumb(): string
{
    return __('filament/clusters/cluster.name');
}
Edit on GitHub

Still need help? Join our Discord community or open a GitHub discussion

Previous
用户菜单