marshmallow/nova-flexible

基于 WhiteCube 的 flexible 包,为 Laravel Nova 提供灵活的内容和重复字段

v2.9.0 2024-08-17 10:02 UTC

README

alt text

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字段)。不用担心,我们为你解决了这个问题!

通过创建自己的解析器类来告诉字段如何存储和检索其内容,该类基本上只包含两个简单的方法:getset有关更多信息,请参阅文档

与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以获取更多更新!