ziffmedia / nova-select-plus
适用于简单和复杂选择输入的 Nova 选择字段
Requires
- php: ^8.0
- laravel/nova: ^4.0
- dev-master
- v2.1.0-beta.1
- v2.0.6
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.3-beta.1
- v2.0.2
- v2.0.1
- v2.0.0
- v1.0.11
- v1.0.10
- 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
- dev-develop-2.1
- dev-develop-2.1-field-ids
- dev-dependabot/npm_and_yarn/postcss-8.4.31
- dev-dependabot/npm_and_yarn/word-wrap-1.2.4
- dev-improve_field_style
- dev-support-1.x
- dev-feature-create-on-the-fly
This package is auto-updated.
Last update: 2024-09-16 20:49:42 UTC
README
安装
composer require ziffmedia/nova-select-plus
版本与兼容性
- 版本
^1.0
支持 Nova 2-3 - 版本
^2.0
支持 Nova 4(包含 Vue 3、暗黑模式支持等)
描述与用例
此 Nova 组件是为了满足 Nova 内置 <select>
组件之外的使用场景而构建的。以下是一些你可能想要使用 SelectPlus
(使用 vue-select
)而不是简单 Select
的情况
表单屏幕上的 BelongsToMany 和 MorphsToMany 选择
默认的 Nova 体验是对于 BelongsToMany
和 MorphsToMany
,有一个独立的 UI 屏幕来通过 "Pivot" 模型来附加/分离和同步关系。对于简单的关系(没有额外的 pivot 值或 pivot 表中的唯一值仅用于排序的关系),将此选择移至表单工作流程而不是独立工作流程是有益的。
选项的 Ajax 加载
对于有几十到几百个选项的选择,仅在需要它的屏幕上加载完整的选项列表(即表单屏幕)会更高效。
对于 Ajax 选项有两种选择,默认是在表单加载时加载所有选项。第二种是允许进行完整的选项搜索(在这种情况下,你可以编写自己的 Ajax 搜索解析器)。
简单 Pivot/BelongsToMany 关系的重新排序
通过 ->reorderable()
,你可以启用 SelectPlus
字段可重新排序。这允许在 BelongsToMany->sync()
时刻,填充一个有用的排序关系的 pivot 值。
用法
use ZiffMedia\NovaSelectPlus\SelectPlus;
// setup model like normal: public function statesLivedIn() { return $this->belongsToMany(State::class, 'state_user_lived_in')->withTimestamps(); } // add Nova Resource Field SelectPlus::make('States Lived In', 'statesLivedIn', State::class),
选项与示例
->label(string|closure $attribute)
选择不同的属性作为标签
默认:'name'
SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->label('code')
如果提供闭包,它将被调用,并可以使用值。此外,输出可能是 HTML,因为组件将在前端上 v-html
输出
// Using php 7.4 short functions: SelectPlus::make('States Visited', 'statesVisited', State::class) ->label(fn ($state) => $state->name . " <span class=\"text-xs\">({$state->code})</span>")
->usingIndexLabel()
& ->usingDetailLabel()
默认是生成索引和详细屏幕上项目的数量
如果提供 string 名称,则提取名称属性并以逗号连接
SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->usingIndexLabel('name'),
如果提供闭包,它将被调用,并将使用值。如果值是字符串,则将其放置
SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->usingIndexLabel(fn($models) => $models->first()->name ?? ''),
如果返回数组,则索引和详细屏幕将生成 <ol>
或 <ul>
列表
SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->usingIndexLabel(fn($models) => $models->pluck('name')),
->reorderable(string $pivotOrderAttribute)
- 多个选择的可重新排序能力
// assuming in the User model: public function statesVisited() { return $this->belongsToMany(State::class, 'state_user_visited') ->withPivot('order') ->orderBy('order') ->withTimestamps(); } // inside the Nova resource: SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->reorderable('order'),
->optionsQuery(closure)
- 应用更改到选项查询对象的能力
// inside the Nova resource (exclude all states that start with C) SelectPlus::make('States Lived In', 'statesLivedIn', State::class) ->optionsQuery(function (Builder $query) { $query->where('name', 'NOT LIKE', 'C%'); })
- 注意:这将应用在所有
ajaxSearchable()
功能性之前,它不会替换它,但会与ajaxSearchable()
一起应用,如果存在的话
->ajaxSearchable(string|closure|true)
值的 Ajax 搜索
给定一个字符串,模型将通过提供的属性进行资源搜索,使用 WHERE LIKE。给定回调,将返回一个 Collection 以填充下拉列表
SelectPlus::make('States Visited', 'statesVisited', State::class) ->ajaxSearchable(function ($search) { return StateModel::where('name', 'LIKE', "%{$search}%")->limit(5); })