glacom / nova-flexible-content
Laravel Nova 的灵活内容与重复字段。
Requires
- php: ^7.3|^8.0
- laravel/framework: ^8.0|^9.0|^10.0
- laravel/nova: ^4.0
- nova-kit/nova-packages-tool: ^1.3.1
Requires (Dev)
- laravel/pint: ^1.2
- phpunit/phpunit: ^9.5
README
一个简单且完整的 Laravel Nova 灵活字段,非常适合重复和灵活的字段组。
快速开始
以下是一个快速入门指南,帮助您尽快开始。请参阅完整的文档:https://whitecube.github.io/nova-flexible-content
安装
composer require whitecube/nova-flexible-content
用法
灵活字段允许轻松管理可重复和可排序的字段组。与 Laravel Nova 的少数现有解决方案不同,此解决方案对这些组内允许使用的字段没有约束。这意味着您可以使用所有 Laravel Nova 字段类型,也可以使用任何社区制作的字段。
添加布局
布局代表可以在灵活字段内部重复的一组字段。您可以根据需要添加任意数量的布局。如果只定义了一个布局,则字段将像简单的重复字段一样行为。通过添加更多布局,您将获得灵活内容。这两个概念与 Wordpress ACF 插件的同类产品相似。
您可以使用以下方法在灵活字段中添加布局
addLayout(string $title, string $name, array $fields)
$name
参数用于在字段值中存储选择的布局。请谨慎选择,您可能需要用它来识别您应用程序中的布局。
use Glacom\NovaFlexibleContent\Flexible; /** * Get the fields displayed by the resource. * * @param \Illuminate\Http\Request $request * @return array */ public function fields(Request $request) { return [ // ... Flexible::make('Content') ->addLayout('Simple content section', 'wysiwyg', [ Text::make('Title'), Markdown::make('Content') ]) ->addLayout('Video section', 'video', [ Text::make('Title'), Image::make('Video Thumbnail', 'thumbnail'), Text::make('Video ID (YouTube)', 'video'), Text::make('Video Caption', 'caption') ]) ]; }
自定义按钮标签
您可以通过以下方式更改默认的“添加布局”按钮文本
Flexible::make('Content') ->button('Add something amazing!');
在视图中使用灵活值
如果您正在使用 Laravel 6 及以下版本,或者不想使用类型转换,请使用具有 HasFlexible 特性的模型访问器 使用 HasFlexible trait。
Laravel 7 带来了自定义类型转换,灵活内容字段是它们的完美用例。该字段将值存储为单个 JSON 字符串,这意味着在您的应用程序中使用之前需要解析该字符串。这可以通过使用此包中的 FlexibleCast
类轻松完成
namespace App; use Illuminate\Database\Eloquent\Model; use Glacom\NovaFlexibleContent\Value\FlexibleCast; class MyModel extends Model { protected $casts = [ 'flexible-content' => FlexibleCast::class ]; }
默认情况下,FlexibleCast
类将收集基本的 Layout
实例。如果您想将布局映射到 自定义布局实例,这也是可能的。首先,通过运行 php artisan flexible:cast MyFlexibleCast
创建一个自定义灵活类型转换。这将创建位于 App\Casts
目录中的文件。
然后轻松地将您的自定义布局类映射到适当的键
namespace App\Casts; class MyFlexibleCast extends FlexibleCast { protected $layouts = [ 'wysiwyg' => \App\Nova\Flexible\Layouts\WysiwygLayout::class, 'video' => \App\Nova\Flexible\Layouts\VideoLayout::class, ] }
如果您需要更多控制,您可以通过覆盖 getLayoutMappings
方法 来代替。
布局集合
由 FlexibleCast
类型转换和 HasFlexible
特性返回的集合扩展了原始的 Illuminate\Support\Collection
。这些自定义布局集合公开了一个 find(string $name)
方法,它返回第一个具有给定布局 $name
的布局。
布局实例
布局是一种“假模型”。它们使用 Laravel 的 HasAttributes
特性,这意味着您可以定义布局属性的访问器和修改器。此外,您还可以使用以下方法访问布局的属性
name()
返回布局的名称。
title()
返回布局的标题(在 Nova 中显示)。
key()
返回布局的唯一键(布局的唯一标识符)。
进一步了解
当使用灵活内容字段时,您很快会发现,上述基本描述的内容还不够。这就是我们以可扩展的方式开发了此包,使其能够轻松地为字段及其输出添加自定义行为和/或功能。
自定义布局类
有时,addLayout
定义可能会相当长,或者您可能希望它们与其他Flexible
字段共享。答案是提取您的布局到自己的类中。查看更多文档信息。
预定义预设类
除了可重用的布局类,您还可以进一步创建用于您的灵活字段的Preset
类。这些类允许您在任何地方重用整个灵活字段。它们还使您的灵活字段更加动态,例如,如果您想有条件地添加布局。最重要的是,它们还可以清理您的Nova资源类,如果您的灵活字段有许多addLayout
定义的话。查看更多文档信息。
自定义解析器类
默认情况下,字段利用了模型表的JSON列
。在某些情况下,您可能非常希望使用此字段,但由于某种原因,JSON属性并不是最佳选择。例如,您可能希望将值存储在另一个表中(这意味着您将使用灵活内容字段而不是传统的BelongsToMany或HasMany字段)。不用担心,我们已经为您想到了!
通过创建自己的解析器类来告诉字段如何存储和检索其内容,该类基本上只包含两个简单的方法:get
和set
。查看更多文档信息。
与nova-page一起使用
也许您已经听说过我们的其他包之一,nova-page,这是一个允许编辑静态页面(如“关于”页面或类似页面)而不需要为它单独声明模型的Nova工具。灵活内容字段通常会派上用场。别担心,这两个包配合得很好!首先创建一个nova页面模板,并将灵活内容添加到模板的字段中。
如文档中所述,您可以使用{{ Page::get('attribute') }}
在blade视图中访问nova-page的静态内容。当以这种方式请求灵活内容时,它返回一个描述灵活内容的原始JSON字符串,这当然不是非常有用。相反,您只需在您的页面模板上实现Glacom\NovaFlexibleContent\Concerns\HasFlexible
特质,这将暴露Page::flexible('attribute')
门面方法,并负责转换灵活内容。
namespace App\Nova\Templates; // ... use Glacom\NovaFlexibleContent\Concerns\HasFlexible; class Home extends Template { use HasFlexible; // ... }
💖 赞助
如果您在生产应用中依赖此包,请考虑赞助我们!这是帮助我们继续做我们热爱的事情的最佳方式:制作优秀的开源软件。
贡献
请随时提出更改建议、请求新功能或自行修复错误。我们确信还有许多可以改进的地方,我们将非常高兴合并有用的拉取请求。
谢谢!
单元测试
在添加新功能或修复错误时,请添加相应的单元测试。当前的测试集有限,但添加的每个单元测试都将提高软件包的质量。
通过调用 composer test
运行PHPUnit。
用❤️为开源制作
在 Whitecube,我们每天工作中使用大量开源软件。所以,当我们有机会回馈时,我们非常兴奋!
我们希望您会喜欢我们的小小贡献,如果您在项目中觉得它有用,我们非常愿意 听到您的反馈。在 Twitter 上关注我们,获取更多更新!