esign/nova-flexible
Composer 安装命令:
composer require esign/nova-flexible
包简介
Flexible Content & Repeater Fields for Laravel Nova base on the flexible package from WhiteCube.
README 文档
README
This is a fork from the package of whitecube/nova-flexible-content and marshmallow/nova-flexible.
This is forked so we can build our own functionalities in to this and make it optimal for our customers.
Installation
composer require esign/nova-flexible-content
Quick start
Here's a very condensed guide to get you started asap. See the full docs at https://whitecube.github.io/nova-flexible-content
To use the MarshmallowMediaLayout, this packages requires 'spatie/laravel-medialibrary', see the insturctions for installation on the spatie website For Nova use 'marshmallow/advanced-nova-media-library' and follow the instructions on the github page
Table of Contents
Commands
Create layout
To create a new layout you can run the command below.
php artisan make:flex Element\\Counter --livewire
Create templates
php artisan make:flex Forms\\Newsletter --template=newsletter php artisan make:flex Forms\\Contact --template=form
Prepare
Nova Resource
You can use the getFlex() method to get all the layouts that are provided with this package and the layouts that you created yourself. If you want to manualy add flexibles to your Nova resource, please reference the manual usage section of this readme.
class Page extends Resource { use \Marshmallow\Nova\Flexible\Nova\Traits\HasFlexable; public function fields(Request $request) { return [ // ... $this->getFlex(), // ... ]; } }
Models
Make sure your model will cast this data correctly by adding this to the field of your model.
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, ]; }
Customize
Title on Layout classes
Sometimes its very hard to see which group is what because all items look the same. It is possible to get a value from one of the fields to be displayed in the group overview. By default the title field will be used but it can be overriten.
// Layout class // In a layout class you just set the $titleFromContent property to the field name you // wish it shows. protected $titleFromContent = 'title';
Title on custom layouts
/** * 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'); }); } )
Config Methods
You can call a load config method once you've created your flexible field to change the behaviour of the flexible field. Below you will find some examples.
$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], ]),
Helpers
You can overrule a lot of defaults with the methods below.
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();
Credits
See https://github.com/whitecube/nova-flexible-content - Whitecube
Copyright (c) 2020 marshmallow.
License
The Layouts Collection
Collections returned by the FlexibleCast cast and the HasFlexible trait extend the original Illuminate\Support\Collection. These custom layout collections expose a find(string $name) method which returns the first layout having the given layout $name.
The Layout instance
Layouts are some kind of fake models. They use Laravel's HasAttributes trait, which means you can define accessors & mutators for the layout's attributes. Furthermore, it's also possible to access the Layout's properties using the following methods:
name()
Returns the layout's name.
title()
Returns the layout's title (as shown in Nova).
key()
Returns the layout's unique key (the layout's unique identifier).
Going further
When using the Flexible Content field, you'll quickly come across of some use cases where the basics described above are not enough. That's why we developed the package in an extendable way, making it possible to easily add custom behaviors and/or capabilities to Field and its output.
Custom Layout Classes
Sometimes, addLayout definitions can get quite long, or maybe you want them to be shared with other Flexible fields. The answer to this is to extract your Layout into its own class. See the docs for more information on this.
Predefined Preset Classes
In addition to reusable Layout classes, you can go a step further and create Preset classes for your Flexible fields. These allow you to reuse your whole Flexible field anywhere you want. They also make it easier to make your Flexible fields dynamic, for example if you want to add Layouts conditionally. And last but not least, they also have the added benefit of cleaning up your Nova Resource classes, if your Flexible field has a lot of addLayout definitions. See the docs for more information on this.
Custom Resolver Classes
By default, the field takes advantage of a JSON column on your model's table. In some cases, you'd really like to use this field, but for some reason a JSON attribute is just not the way to go. For example, you could want to store the values in another table (meaning you'll be using the Flexible Content field instead of a traditional BelongsToMany or HasMany field). No worries, we've got you covered!
Tell the field how to store and retrieve its content by creating your own Resolver class, which basically just contains two simple methods: get and set. See the docs for more information on this.
Usage with nova-page
Maybe you heard of one of our other packages, nova-page, which is a Nova Tool that allows to edit static pages such as an "About" page (or similar) without having to declare a model for it individually. More often than not, the Flexible Content Field comes in handy. Don't worry, both packages work well together! First create a nova page template and add a flexible content to the template's fields.
As explained in the documentation, you can access nova-page's static content in your blade views using {{ Page::get('attribute') }}. When requesting the flexible content like this, it returns a raw JSON string describing the flexible content, which is of course not very useful. Instead, you can simply implement the Marshmallow\Nova\Flexible\Concerns\HasFlexible trait on your page Templates, which will expose the Page::flexible('attribute') facade method and will take care of the flexible content's transformation.
namespace App\Nova\Templates; // ... use Marshmallow\Nova\Flexible\Concerns\HasFlexible; class Home extends Template { use HasFlexible; // ... }
💖 Sponsorships
If you are reliant on this package in your production applications, consider sponsoring us! It is the best way to help us keep doing what we love to do: making great open source software.
Contributing
Feel free to suggest changes, ask for new features or fix bugs yourself. We're sure there are still a lot of improvements that could be made, and we would be very happy to merge useful pull requests.
Thanks!
Unit tests
When adding a new feature or fixing a bug, please add corresponding unit tests. The current set of tests is limited, but every unit test added will improve the quality of the package.
Run PHPUnit by calling composer test.
Made with ❤️ for open source
At Marshmallow we use a lot of open source software as part of our daily work. So when we have an opportunity to give something back, we're super excited!
We hope you will enjoy this small contribution from us and would love to hear from you if you find it useful in your projects. Follow us on Twitter for more updates!
esign/nova-flexible 适用场景与选型建议
esign/nova-flexible 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 748 次下载、GitHub Stars 达 0, 最近一次更新时间为 2024 年 12 月 06 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「group」 「Flexible」 「nova」 「layout」 「laravel」 「repeat」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 esign/nova-flexible 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 esign/nova-flexible 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 esign/nova-flexible 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A Laravel Nova card that shows you your system information.
Edit your .env file in Laravel directly from the command line.
A Laravel Nova card.
A Laravel Nova package for publishable fields
A Laravel Nova package for translatable fields
Provides a PHP interface for The AAM Group's RESTful API.
统计信息
- 总下载量: 748
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 24
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-12-06