dewsign/nova-spaces

Laravel Nova 的空间

安装: 306

依赖: 0

建议者: 0

安全性: 0

星级: 1

关注者: 3

分支: 2

公开问题: 0

类型:

v1.2.1 2020-02-07 10:35 UTC

This package is auto-updated.

Last update: 2024-09-07 21:00:57 UTC


README

创建 "空间" 来在您的网站各处显示,这些空间可以填充自定义块。

安装

composer require dewsign/nova-spaces

php artisan migrate

使用方法

要开始使用,您需要创建您的第一个空间区域。例如,侧边栏或促销。您可以自由地组织文件,或者如果您愿意,可以使用示例中的约定。

我们简单地将默认 Nova 文件夹用于注册我们的新空间,因为它会自动加载。

// app/Nova/SidebarSpace.php

namespace App\Nova;

use Dewsign\NovaSpaces\Nova\Space;

class SidebarSpace extends Space
{
    public static $zone = 'sidebar';

    public static function label()
    {
        return __('Sidebar Items');
    }
}

使用 $zone 可以在数据库和代码中区分不同的空间区域,避免了为每个新的空间区域需要新表。

您的新空间区域现在应该在 Nova 中可用,默认的自定义链接项是唯一选项。

输出空间(Blade)

我们目前不假设您希望如何呈现空间。虽然计划在将来提供一些围绕常见用法的辅助函数。现在,请像访问任何其他 Eloquent 模型一样访问 Dewsign\NovaSpaces\Models\Space 模型,以检索您所需的空间项。

以下是一个基本的内联 blade 示例。

@foreach(Space::active()->whereZone('sidebar')->get() as $spaceItem)
    {!! $spaceItem->view !!}
    {!! or !!}
    <a href="{{ $spaceItem->action }}">{{ $spaceItem->label }}</a>
@endforeach

您可以通过 spaces 关系访问任何子项。

@foreach($spaceItem->spaces as $item)
    {!! $item->view !!}
@endforeach

扩展

您可以通过创建一些新文件并加载它们来创建自己的空间项类型。简而言之,您需要

  • 一个完整的 Eloquent 模型,包括迁移/数据库
  • 一个 Nova 资源来管理内容
  • 一个 blade 视图来呈现项
// app/Space/Models/Section.php

use Dewsign\NovaSpaces\Models\SpaceItem;

class Section extends SpaceItem
{
    public static $repeaterBlockViewTemplate = 'space.section';

    public function resolveAction()
    {
        return $this->link_url;
    }

    public function resolveLabel($model = null)
    {
        return $model->title ?? $this->heading;
    }
}
// database/migrations/your_migration.php

Schema::create('space_sections', function (Blueprint $table) {
    $table->increments('id');
    $table->string('heading')->nullable();
    $table->text('content')->nullable();
    $table->string('link_url')->nullable();
    $table->string('link_title')->nullable();
    $table->timestamps();
});
// app/Space/Nova/Section.php

...
use Dewsign\NovaSpaces\Nova\Items\SpaceItem;

class Section extends SpaceItem
{
    public static $model = App\Space\Models\Section::class;

    public static $title = 'heading';

    public static $search = [
        'heading',
        'content',
        'link_url',
    ];

    public static function label()
    {
        return __('Section');
    }

    public function fields(Request $request)
    {
        return [
            Text::make('Heading'),
            Markdown::make('Content'),
            Text::make('Link Url'),
            Text::make('Link Title'),
        ];
    }
}

最后,通过 novaspaces 配置加载新的空间项

return [
    "repeaters" => [
        ...
        \App\Space\Nova\Section::class,
    ],
];