webdevjohn / selectboxes
优雅地创建HTML表单中使用的Selectboxes。
v1.0.2
2023-05-03 11:51 UTC
Requires
- php: ^8.0
- laravel/framework: ^8.0||^9.0||^10.0
This package is auto-updated.
Last update: 2024-09-03 14:38:07 UTC
README
简介
选择框包是为了提供一个简单的方式来创建HTML表单中选择框中的数据而创建的。此包还通过将选择框数据封装在专用的可重用类中来帮助简化代码。
示例问题
处理需要多个选择框的表单时可能会很痛苦,因为create()方法中定义的选择框也必须在控制器的edit()方法中重新定义。以下示例中,您还需要导入5个eloquent模型:Artist, Genre, Label, Format, Tag。这开始变得复杂。
use App\Models\Artist;
use App\Models\Format;
use App\Models\Genre;
use App\Models\Label;
use App\Models\Tag;
public function create()
{
return View('cms.basedata.tracks.create', [
'selectBoxes' => [
'artistList' => Artist::orderBy('artist_name')
->pluck('artist_name', 'id')
->toArray(),
'genreList' => array_merge(
[0 => 'Please Select...'],
Genre::orderBy('genre')->pluck('genre', 'id')->toArray()
),
'labelList' => array_merge(
[0 => 'Please Select...'],
Label::orderBy('label')->pluck('label', 'id')->toArray()
),
'formatList' => array_merge(
[0 => 'Please Select...'],
Format::orderBy('format')->pluck('format', 'id')->toArray(),
),
'tagList' => Tag::orderBy('tag')->pluck('tag', 'id')
]
]);
}
示例解决方案
使用选择框包时,上述示例可以重构为以下内容
// The model import use statements are no longer needed.
public function create()
{
return View('cms.basedata.tracks.create', [
'selectBoxes' => $this->selectBoxes->get(),
]);
}
安装
可以使用以下命令通过composer安装此包
composer require webdevjohn/selectboxes
用法
您可以直接创建选择框组或直接使用SelectBoxService。
创建选择框组
当需要在表单上创建多个选择框时,请创建选择框组。这可以帮助您简化代码,因为选择框组可以在创建和更新记录时重复使用(例如,控制器中的create()和edit()方法)。
运行以下Artisan命令以创建选择框组
php artisan group:make {name}
默认情况下,新创建的组将创建在
App\Services\SelectBoxes\Groups
您可以通过在创建组时指定可选的第二个参数来覆盖默认命名空间
php artisan group:make {name} {namespace}
定义选择框
namespace App\Services\SelectBoxes\Groups;
use App\Models\Artist;
use App\Models\Format;
use App\Models\Genre;
use App\Models\Label;
use App\Models\Tag;
use Webdevjohn\SelectBoxes\SelectBoxService;
class DemoSelectBoxGroup extends SelectBoxService
{
public function get(): array
{
return [
'artistList' => $this->createFrom(Artist::class)
->display('artist_name')
->orderBy('artist_name')
->asArray(placeHolder: false),
'genreList' => $this->createFrom(Genre::class)
->display('genre')
->orderBy('genre')
->asArray(),
'labelList' => $this->createFrom(Label::class)
->display('label')
->orderBy('label')
->asArray(),
'formatList' => $this->createFrom(Format::class)
->display('format')
->orderBy('format')
->asArray(),
'tagList' => $this->createFrom(Tag::class)
->display('tag')
->orderBy('tag')
->asArray(placeHolder: false),
];
}
}
可用方法
注意。必须调用asArray()或asJson()以返回结果。
使用选择框组
您可以使用构造函数或方法注入来注入选择框组。
public function __construct(
protected DemoSelectBoxGroup $selectBoxes
) {}
然后使用$selectBoxes实例变量的get()方法创建选择框。
public function create()
{
return View('cms.basedata.tracks.create', [
'selectBoxes' => $this->selectBoxes->get(),
]);
}
这将按以下格式将数据推送到视图
array:1 [▼
"selectBoxes" => array:5 [▼
"artistList" => array:1378 [▶]
"genreList" => array:12 [▶]
"labelList" => array:484 [▶]
"formatList" => array:4 [▶]
"tagList" => array:26 [▶]
]
]
在Blade文件中访问选择框
<label for="genre_id">Genre: </label>
<select name="genre_id">
@foreach($selectBoxes['genreList'] as $key => $value)
<option value="{{$key}}" {{ (old('genre_id') == $key) ? "selected='selected" : ""}}>{{ $value }}</option>
@endforeach
</select>