webdevjohn/selectboxes

优雅地创建HTML表单中使用的Selectboxes。

v1.0.2 2023-05-03 11:51 UTC

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>