webid/druid

Laravel Filament 基础 CMS

资助包维护!
web-id-fr

0.1.0 2024-04-05 15:21 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

什么是 Dru^ID CMS?

Dru^ID 是一个构建在 Laravel 应用程序之上的轻量级内容管理系统。您可以在现有的 Laravel 项目中安装它而不会破坏一切,或者从全新的安装开始。这更像是为开发者提供的工具箱,而不是一个一键安装的拥有成千上万主题和插件的 CMS。

基本上,您将获得一个基于 Filament 的管理面板,您可以在其中进行编辑。

  • 页面
  • 文章
  • 导航菜单
  • 可重用块

您还可以在代码库中找到管理和处理多语言和导航菜单功能的辅助工具和服务。

要求

安装

⚠️ 为了安装 Dru^ID CMS,您首先需要一个带有 Filament Curator 管理员的 Laravel Filament 运行安装。

请按照以下安装过程操作

composer require webid/druid"
php artisan druid:install

创建第一个管理员

php artisan filament:install --panels
php artisan make:filament-user

https://filamentphp.com/docs/3.x/panels/installation

打开 app/Providers/Filament/AdminPanelProvider.php 文件,并在 $panel->default()->id('admin') 后添加以下代码

->discoverResources(
        in: base_path('vendor/webid/druid/src/Filament/Resources'),
        for: 'Webid\\Druid\\Filament\\Resources'
    )
    ->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
    ->discoverPages(
        in: base_path('vendor/webid/druid/src/Filament/Pages'),
        for: 'Webid\\Druid\\Filament\\Pages'
)

自定义 config/cms.php 文件,特别是如果您需要启用多语言功能。在编写内容之前选择默认语言更好。

加载演示数据集

如果您想要加载演示数据集,只需在新安装中运行以下命令

php artisan druid:demo

管理面板

Dru^ID 是基于 Filament 包构建的,这意味着默认情况下,您将找到管理面板在 /admin 路由下。

Filament 文档 将帮助您创建第一个管理员,如果您还没有在项目中使用它。

登录后,您可以创建导航菜单、页面、文章、分类和可重用组件。

页面和文章

页面和文章内容基于文本、文本 + 图片、分隔符、引语等组件。其中一些包含在 Dru^ID 包本身中,但您可以使用 Filament 字段系统轻松创建自己的组件。

可重用组件

当您需要在多个内容中显示完全相同的组件时,例如调用操作组件,您可以一次性配置它,之后在您喜欢的任何地方多次使用。这就是我们所说的可重用组件。

导航菜单

您可以在管理面板中手动将内容分组和嵌套在导航菜单中。您可以选择内部内容(页面和文章)和外部 URL。您可以将菜单项嵌套到 3 个级别,以实现高级菜单使用。

Druid Facade

多语言辅助工具

导航菜单辅助工具

设置辅助工具

服务

NavigationMenuManager

在管理面板中配置了您的导航菜单后,您可以通过使用Webid\Druid\Services\NavigationMenuManager\NavigationMenuManager类作为依赖项或使用Helpers部分中描述的导航菜单助手来访问它。

一旦您有了菜单管理器实例,您可以使用以下方法通过slug和lang请求菜单。

$mainMenu = $menuManager->getBySlug('main');

如果您使用多语言功能,可以为多个语言使用相同的菜单slug,因此您可以使用getCurrentLocale()助手函数来动态调用方法。

$mainMenuInCurrentLanguage = $menuManager->getBySlugAndLang('main', getCurrentLocale());

语言切换器

在多语言功能中,您当然需要显示一个语言切换器组件,以帮助用户重定向到另一种语言中的等效内容(只有当这种等效内容存在时)。

为此,您可以使用Webid\Druid\Services\LanguageSwitcher类作为依赖项或使用Helpers部分中描述的getLanguageSwitcher()助手。

您将获得包含当前URL等效其他语言的详细信息和表示当前语言的关键字的集合。

渲染 & 模板化

Dru^ID默认启用了一组前端路由,以帮助您节省时间。

  • 页面(Models/Page)详情视图可通过URLhomepage/{the-page-slug}或(如果启用多语言功能)homepage/{lang}/{the-page-slug}访问。
  • 帖子(Models/Post)详情视图可通过URLhomepage/{blog-prefix}/{the-post-slug}或(如果启用多语言功能)homepage/{blog-prefix}/{lang}/{the-post-slug}访问。

默认情况下,这些视图使用基本的Blade模板进行渲染,您可以在项目resources/views/vendor/druid目录中覆盖它。您也可以选择通过更改config/cms.php文件中的views.type参数来渲染JsonResource

创建新的组件类型

  1. 创建一个实现Webid\Druid\Components\ComponentInterface接口的类。
  2. 添加接口所需的所有方法。
  3. config/cms.php配置文件中注册您的组件。

您当然可以创建一个自定义包,添加一个或多个组件并将其提供给社区。

扩展默认设置和页面/帖子字段

在您的应用程序中的任何地方(例如在Service Provider、Middleware中),您都可以覆盖默认管理行为,以涉及表单字段。

以下示例将向您展示如何添加额外的设置字段。

/** @var FilamentSettingsFieldsBuilder $fieldsBuilder */
$fieldsBuilder = $this->app->make(FilamentSettingsFieldsBuilder::class);

$fieldsBuilder->addField(
    TextInput::make('a_first_field') // A Filament field as explained in Filament documentation
        ->label(__('A first field'))
        ->required(),
    'a_first_field' // A key to help fields targeting
);

$fieldsBuilder->addField(
    TextInput::make('a_second_field')
        ->label(__('A second field'))
        ->required(),
    'a_second_field',
    'tabs.application', // Here we provide the target path structure where we want our field to show up
    // In the settings form, we have a tabs group named `tabs`. One of the tabs is named `application` 
    before: 'another_field' // We can specify a `before` or `after` param to put the new field in a specific spot
);

定义默认主页的技巧

我们决定不在包中提供默认主页路由,因为我们认为让开发者选择定义方式更好。以下是定义默认主页路由在您的routes/web.php文件中的简单方法。

您可以使用Settings模型来存储主页ID并在控制器中检索它。

    HomepageController.php

    public function index(): View
    {
        /** @var Settings|null $page */
        $page = Druid::getSettingByKey('homepage_id');

        if (is_null($page)) {
            abort(404);
        }

        $homepage = $this->pageRepository->findOrFail($page->value);

        if (Druid::isMultilingualEnabled()) {
            $homepage->loadMissing('translations');
        }

        return view('druid::page.page', [
            'page' => PageResource::make($homepage)->toObject(),
        ]);
    }


    routes/web.php

    Route::get('/', [HomepageController::class, 'index'])->name('homepage');

计划任务

Dru^ID附带一个计划任务,该任务检查文章是否具有状态scheduled_published,并在发布日期达到时发布它们。

要启用此功能,您需要为此命令添加一个计划。

druid:publish-scheduled-posts

Laravel 11文档中添加命令到调度器:[https://laravel.net.cn/docs/11.x/scheduling#defining-schedules](https://laravel.net.cn/docs/11.x/scheduling#defining-schedules)

致谢

许可

MIT许可证(MIT)。请参阅许可文件以获取更多信息。