marshmallow / nova-flexible
基于 WhiteCube 的 flexible 包,为 Laravel Nova 提供灵活的内容和重复字段
Requires
- php: ^8.0
- laravel/framework: ^8.0|^9.0|^10.0|^11.0
- laravel/nova: ^4.0
- marshmallow/helpers: ^2.14.0
- nova-kit/nova-packages-tool: ^1.3.1
Requires (Dev)
- phpunit/phpunit: ^9.5
- dev-master
- v2.9.0
- v2.8.3
- v2.8.2
- v2.8.1
- v2.8.0
- v2.7.6
- v2.7.5
- v2.7.4
- v2.7.3
- v2.7.2
- v2.7.1
- v2.7.0
- v2.6.2
- v2.6.1
- v2.6.0
- v2.5.2
- v2.5.1
- v2.5.0
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.0
- v2.2.3
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.1
- v2.1.0
- v2.0.0
- v1.8.3
- v1.8.2
- v1.8.1
- v1.8.0
- v1.7.2
- v1.7.1
- v1.7.0
- v1.6.5
- v1.6.4
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.1
- v1.5.0
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.2.12
- v0.2.11
- v0.2.10
- v0.2.9
- v0.2.8
- v0.2.7
- v0.2.6
- v0.2.5
- v0.2.4
- v0.2.3
- v0.2.2
- v0.2.1
- v0.2.0
- v0.1.16
- v0.1.15
- v0.1.14
- V0.1.13
- v0.1.12
- v0.1.11
- v0.1.10
- v0.1.9
- v0.1.8
- v0.1.7
- v0.1.6
- v0.1.5
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
- dev-hotfix/field-load
- dev-hotfix/loading
- dev-hotfix/media-function
- dev-dependabot/npm_and_yarn/vue/compiler-sfc-3.4.20
- dev-dependabot/npm_and_yarn/sass-1.71.1
- dev-dependabot/npm_and_yarn/sass-loader-14.1.1
- dev-dependabot/npm_and_yarn/postcss-8.4.35
- dev-dependabot/npm_and_yarn/vue/babel-plugin-jsx-1.2.1
- dev-dependabot/npm_and_yarn/autoprefixer-10.4.17
- dev-dependabot/npm_and_yarn/follow-redirects-1.15.4
- dev-dependabot/npm_and_yarn/tailwindcss-3.4.1
- dev-dependabot/npm_and_yarn/vue-loader-17.4.2
- dev-dependabot/github_actions/overtrue/phplint-9.1
- dev-dependabot/github_actions/actions/checkout-4
- dev-293-create-a-command-that-generates-a-full-contact-form
- dev-version-1
- dev-development
This package is auto-updated.
Last update: 2024-09-17 10:06:11 UTC
README
Marshmallow Nova Flexible
这是从 whitecube/nova-flexible-content
包中派生出来的。我们这样分支是为了在这个包中构建自己的功能,使其更符合我们客户的需要。
安装
composer require marshmallow/nova-flexible
php artisan vendor:publish --provider="Marshmallow\Nova\Flexible\FieldServiceProvider"
要使用 MarshmallowMediaLayout,此包需要 'spatie/laravel-medialibrary',请参阅 spatie 网站 上的安装说明。对于 Nova 使用 'marshmallow/advanced-nova-media-library' 并遵循 github 页面 上的说明。
目录
命令
创建布局
要创建一个新的布局,您可以运行以下命令。
php artisan make:flex Element\\Counter --livewire
创建模板
php artisan make:flex Forms\\Newsletter --template=newsletter php artisan make:flex Forms\\Contact --template=form
准备
Nova 资源
您可以使用 getFlex()
方法获取此包提供的所有布局以及您自己创建的布局。如果您想手动将灵活字段添加到 Nova 资源中,请参阅本说明中的手动使用部分。
class Page extends Resource { use \Marshmallow\Nova\Flexible\Nova\Traits\HasFlexable; public function fields(Request $request) { return [ // ... $this->getFlex(), // ... ]; } }
模型
确保您的模型通过添加此内容到模型字段中正确地转换这些数据。
class Page extends Model { use \Marshmallow\Nova\Flexible\Concerns\HasFlexible; protected $casts = [ /** * 'layout' in the example below references the field * in the model where the json is stored. */ 'layout' => \Marshmallow\Nova\Flexible\Casts\FlexibleCast::class, ]; }
自定义
布局类上的标题
有时很难看出哪个组是什么,因为所有项目看起来都一样。您可以通过从字段中获取一个值来显示在组概述中。默认情况下,将使用 title
字段,但它可以被覆盖。
// Layout class // In a layout class you just set the $titleFromContent property to the field name you // wish it shows. protected $titleFromContent = 'title';
自定义布局上的标题
/** * For custom layout, we need to add a 4th parameter. This should be a callable and call the setTitleFromContent method. */ ->addLayout( 'Mr. Mallow', 'mr_mallow', [ Text::make('Title', 'title'), Text::make('Sub title', 'sub_title'), // ... ], function ($layout) { return $layout->setTitleFromContent('sub_title'); } ) /** * You can also use a callback to build your title. */ ->addLayout( 'Mr. Mallow', 'mr_mallow', [ Text::make('Title', 'title'), Date::make('Date', 'date'), Textarea::make('Content', 'content'), // ... ], function ($layout) { return $layout->resolveTitleUsing(function ($title, $date, $content) { return $title . ' ' . Carbon::parse($date)->format('Y-m-d'); }); } )
配置方法
创建灵活字段后,您可以调用加载配置方法来更改灵活字段的操作行为。以下是一些示例。
$this->getFlex(__('Layout'), 'layout') ->loadConfig([ 'simpleView' => null, 'allowedToCreate' => ['allowed' => true|false], 'allowedToDelete' => ['allowed' => true|false], 'allowedToChangeOrder' => ['allowed' => true|false], 'simpleMenu' => null, 'button' => ['label' => 'Button Label'], 'fullWidth' => ['fullWidth' => true|false], 'limit' => ['limit' => 3], ]),
助手
您可以使用以下方法覆盖许多默认值。
Flexible::make(__('Marshmallow'), 'marshmallow') ->addLayout(__('Mr. Mallow'), 'mr_mallow', [ // ]) // Don't use the component selector but a simple dropdown menu ->simpleMenu() // Use the full with of the nova container ->fullWidth() // Collapse all layouts when they are loaded ->collapsed() // Change the text in the add more layouts button ->button(__('Add comment')) // Disable deleting items ->deletionNotAllowed();
致谢
见 https://github.com/whitecube/nova-flexible-content - Whitecube
版权 (c) 2020 marshmallow。
许可证
布局集合
由 FlexibleCast
转换和 HasFlexible
特性返回的集合扩展了原始的 Illuminate\Support\Collection
。这些自定义布局集合公开了一个 find(string $name)
方法,该方法返回具有给定布局 $name
的第一个布局。
布局实例
布局是一种 伪模型。它们使用 Laravel 的 HasAttributes
特性,这意味着您可以为布局的属性定义访问器和修改器。此外,还可以使用以下方法访问布局的属性
name()
返回布局的名称。
title()
返回布局的标题(在 Nova 中显示)。
key()
返回布局的唯一键(布局的唯一标识符)。
进一步了解
当使用灵活内容字段时,您很快就会遇到一些使用案例,其中上述基本描述是不够的。这就是我们以可扩展的方式开发此包的原因,这使得它能够轻松地向字段及其输出添加自定义行为和能力。
自定义布局类
有时,addLayout
定义可能会变得相当长,或者你可能希望它们与其他 Flexible
字段共享。解决这个问题的方法是提取你的布局到一个自己的类中。有关更多信息,请参阅文档。
预定义预设类
除了可重用的布局类之外,你还可以为你的Flexible字段创建Preset
类。这些类允许你在任何需要的地方重用整个Flexible字段。它们还使你的Flexible字段动态化变得更容易,例如,如果你想有条件地添加布局。最重要的是,如果你有很多addLayout
定义,它们还可以帮助你清理Nova资源类。有关更多信息,请参阅文档。
自定义解析器类
默认情况下,字段利用模型表的JSON列
。在某些情况下,你真的很想使用这个字段,但出于某种原因,JSON属性并不是最佳选择。例如,你可能想将值存储在另一个表中(这意味着你将使用Flexible Content字段而不是传统的BelongsToMany或HasMany字段)。不用担心,我们为你解决了这个问题!
通过创建自己的解析器类来告诉字段如何存储和检索其内容,该类基本上只包含两个简单的方法:get
和 set
。有关更多信息,请参阅文档。
与nova-page一起使用
也许你已经听说过我们的其他包之一,nova-page,这是一个Nova工具,允许你编辑静态页面,如“关于”页面(或类似页面),而无需为它单独声明模型。很多时候,Flexible Content Field都很有用。不要担心,这两个包配合得很好!首先创建一个nova页面模板,并将Flexible Content添加到模板的字段中。
如文档中所述,你可以在blade视图中使用{{ Page::get('attribute') }}
访问nova-page的静态内容。当你这样请求灵活内容时,它返回一个描述灵活内容的原始JSON字符串,这当然不是非常有用。相反,你可以在你的页面模板上实现Marshmallow\Nova\Flexible\Concerns\HasFlexible
特质,这将暴露Page::flexible('attribute')
门面方法,并处理灵活内容的转换。
namespace App\Nova\Templates; // ... use Marshmallow\Nova\Flexible\Concerns\HasFlexible; class Home extends Template { use HasFlexible; // ... }
💖 赞助
如果你的生产应用程序依赖于这个包,请考虑赞助我们!这是帮助我们一起继续做我们喜欢做的事情——制作优秀的开源软件的最佳方式。
贡献
请随意提出更改建议,请求新功能或自己修复错误。我们确信还有很多改进可以做出,我们将非常乐意合并有用的pull请求。
谢谢!
单元测试
当添加新功能或修复错误时,请添加相应的单元测试。当前的测试集有限,但添加的每个单元测试都会提高包的质量。
通过调用composer test
来运行PHPUnit。
用❤️为开源制作
在Marshmallow,我们每天工作中大量使用开源软件。因此,当我们有机会回馈一些东西时,我们感到非常兴奋!
希望您会喜欢我们提供的这个小小的贡献,如果您在项目中发现它有用,我们非常愿意听到您的反馈。关注我们的Twitter以获取更多更新!