outl1ne/nova-page-manager

Laravel Nova 的页面和区域管理器。

资助包维护!
outl1ne


README

Latest Version on Packagist Total Downloads

Laravel Nova 包允许您为前端应用程序创建和管理页面和区域。

要求

- PHP >=8.0
- laravel/nova ^4.13

特性

  • 带有自定义字段的页面和区域管理
  • 多语言支持

截图

Form (dark)

安装

使用 Composer 在 Laravel Nova 项目中安装包并运行迁移

# Install package
composer require outl1ne/nova-page-manager

# Run automatically loaded migrations
php artisan migrate

发布 nova-page-manager 配置文件并按需编辑

php artisan vendor:publish --provider="Outl1ne\PageManager\NPMServiceProvider" --tag="config"

NovaServiceProvidertools() 方法中注册工具

// in app/Providers/NovaServiceProvider.php

public function tools()
{
    return [
        // ...
        new \Outl1ne\PageManager\PageManager()
          ->withSeoFields(fn () => []), // Optional
    ];
}

使用方法

创建模板

可以使用以下 Artisan 命令创建模板

php artisan npm:template {className}

这将询问您一些额外的详细信息,并在 App\Nova\Templates 中创建一个基本模板。

基本模板公开了一些可覆盖的函数

// Name displayed in CMS
public function name(Request $request)
{
    return parent::name($request);
}

// Fields displayed in CMS
public function fields(Request $request): array
{
    return [];
}

// Resolve data for serialization
public function resolve($page): array
{
    // Modify data as you please (ie turn ID-s into models)
    return $page->data;
}

// Page only
// Optional suffix to the route (ie {blogPostName})
public function pathSuffix() {
    return null;
}

注册模板

所有模板都必须在 config/nova-page-manager.php 文件中注册。

// in /config/nova-page-manager.php

// ...
'templates' => [
    'pages' => [
        'home-page' => [
            'class' => '\App\Nova\Templates\HomePageTemplate',
            'unique' => true, // Whether more than one page can be created with this template
        ],
    ],
    'regions' => [
        'header' => [
            'class' => '\App\Nova\Templates\HeaderRegionTemplate',
            'unique' => true,
        ],
    ],
],
// ...

定义语言环境

语言环境在配置文件中定义。

// in /config/nova-page-manager.php

// ...
'locales' => [
  'en' => 'English',
  'et' => 'Estonian',
],

// OR

'locales' => function () {
  return Locale::all()->pluck('name', 'key');
},

// or if you wish to cache the configuration, pass a function name instead:

'locales' => NPMConfiguration::class . '::locales',
// ...

向前端页面添加链接

要显示实际页面的链接,请添加或覆盖 config/nova-page-manager.php 中的 base_url 键的闭包。

// in /config/nova-page-manager.php

'base_url' => 'https://webshop.com', // Will add slugs to the end to make the URLs

// OR

'base_url' => function ($page) {
  return env('FRONTEND_URL') . '/' . $page->path;
},

覆盖模型和资源

您可以通过在配置文件中设置新类来覆盖页面/区域模型或资源。

高级使用

不可翻译的面板

在某些情况下,翻译面板的子字段而不是整个面板可能更合理。这是可能的,但因为这个功能非常新且实验性,所以被视为“高级用法”,而且它的开发者体验是有疑问的。

您可以创建一个不可翻译的面板如下

// In your PageTemplate class

public function fields() {
  return [
    Panel::make('Some panel', [
      Text::make('Somethingsomething'),
      Text::make('Sub-translatable', 'subtranslatable')
        ->translatable(),
    ])
    ->translatable(false),
  ];
}

这将创建一个包含 __ 的键,在页面数据对象中。这意味着页面数据最终看起来可能像这样

[
  '__' => [
    'somethingsomething' => 'your value',
    'subtranslatable' => [
      'en' => 'eng value',
      'et' => 'et value'
    ]
  ],
  'en' => [],
  'et' => [],
]

辅助函数

辅助函数可以在 Outl1ne\PageManager\Helpers\NPMHelpers 类中找到。

NPMHelpers::getPagesStructure()

在其模板类上调用 resolve() 并返回所有页面作为一个树,子页面递归地嵌套在 children 数组键中。

NPMHelpers::getPages()

在其模板类上调用 resolve() 并返回所有页面。返回一个数组数组。

NPMHelpers::getRegions()

在其模板类上调用 resolve() 并返回所有区域。返回一个数组数组。

NPMHelpers::getPageByTemplate($templateSlug)

通过模板的 slug(来自配置文件)查找单个页面,在其模板类上调用 resolve() 并返回它。

NPMHelpers::getPagesByTemplate($templateSlug)

getPageByTemplate 相同,但返回页面数组。

NPMHelpers::formatPage($page)

在页面的模板类上调用 resolve() 并以数组形式返回页面。

NPMHelpers::formatRegion($region)

在区域的模板类上调用 resolve() 并以数组形式返回区域。

本地化

可以使用以下命令发布翻译文件

php artisan vendor:publish --provider="Outl1ne\PageManager\ToolServiceProvider" --tag="translations"

您可以通过创建一个新的带有语言名称的翻译文件(例如 et.json)并将现有 en.json 中的 JSON 复制进去,将您的翻译添加到 resources/lang/vendor/nova-page-manager/

致谢

许可证

Nova 页面管理器是开源软件,许可协议为 MIT 许可证。[查看许可证](https://github.com/outl1ne/nova-page-manager/blob/HEAD/LICENSE.md)