lilessam / eloquent-fields
为 Laravel 5.5 提供的简单 Eloquent 模型字段生成器包
Requires
- php: >=7.1.0
- illuminate/support: ~5.0
This package is not auto-updated.
Last update: 2024-09-29 04:37:09 UTC
README
Laravel Eloquent 字段生成器包
此包实际上包含一个辅助函数和一个特质。其基本目标是减少开发者编写 Eloquent 模型创建和更新表单标记所花费的时间。
基本思想是在您的模型中使用 FormGenerator
特质,并编写一个包含字段偏好的小数组。然后您可以使用辅助函数生成创建或更新表单。
安装
通过 composer
composer require lilessam/eloquent-fields dev-master
然后在您的模型中使用特质 Lilessam\EloquentFields\Traits\FormGenerator
,如下所示
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Lilessam\EloquentFields\Traits\FormGenerator; class Fee extends Model { use FormGenerator; }
如何使用?
通过在您的模型中定义一个名为 $fields
的静态数组,其结构应如下示例。
public static $fields = [ 'field_name_attribute' => [ // Field name attribute should be the column name in DB as well to retreive its value in update form generation. 'label' => 'اسم الحقل', // Field Label. 'input' => 'input', // Field Type. 'type' => 'text' // Field Input Type. ], ];
这将生成一个包含此字段的 bootstrap form-group
div。然后您可以在视图文件中生成创建表单字段,如下所示
<form class="form-horizontal" method="post"> {!! generate_fields('App\Fee') !!} {!! csrf_field() !!} <button type="submit" class="btn btn-primary">حفظ!</button> </form>
您可以通过传递一个包含对象 ID 的第二个参数来创建更新表单字段。
<form class="form-horizontal" method="post"> {!! generate_fields('App\Fee', 1) !!} {!! csrf_field() !!} <button type="submit" class="btn btn-primary">حفظ!</button> </form>
因此,这实际上将生成 ID 为 1 的行的更新表单字段。
完整指南
$fields 数组编写规则。
- 必须提供
label
。 - 必须提供
input
,可以是input
、select
或textarea
。
如果 input
索引是 input
,您必须提供 type
索引以提供输入类型,如 text
、number
、date
等。
如果 input
类型是 select
,您可以提供一个 options
索引,其中将包含选择下拉选项的数组。或者您可以提供一个 relation
索引,它将从 Eloquent 模型中的关系获取选项。
关系数组
该包目前支持三种 Eloquent 关系。您必须在关系数组中提供一个 type
索引,以根据以下指定关系类型:
belongsTo
的类型将是one
,因为我们在这种情况下将只选择一个选项。hasMany
或belongsToMany
:它们的类型将是many
,因为我们将选择多个值。
如果关系数组中的 type
索引是 one
,您将需要提供
model
索引,它将是关系模型。column
是外键。selectFrom
将是我们在关系模型中显示的列。valueFrom
将是关系模型中的列,它将是选择下拉选项的值。
如果关系数组中的 type
索引是 many
,您将需要提供
name
索引,它将是关系的名称。例如,如果我的模型是User
,并且它有多个Role
,则关系的名称将是roles
或您在User
模型中创建的任何关系的名称。
您还需要提供 selectFrom
和 valueFrom
。
如果输入是 select
,您可以提供一个 valueFallback
,它将是一个静态方法,返回下拉列表中的所有选项,然后您需要提供一个 valueCallback
,它将返回所选选项集合。
其他偏好
在您的所有字段规范中,有多种额外的东西可以非常有用。
label_classes
,这是标签类的属性值。您可以覆盖默认类,默认类为control-label col-md-4
。input_div_classes
,这是包含输入代码的div的类属性。默认值为col-md-6
。input_classes
:这是输入本身的类属性。默认值为form-control
。input_id
,这是输入本身的id属性。默认值为字段名。inject_attributes
,允许您向输入添加额外的属性。它只接受字符串并将其放入输入标签中。
示例。
一个普通文本字段
'name' => [ 'label' => 'Your name', 'input' => 'input', 'type' => 'text' ],
一个数字字段
'age' => [ 'label' => 'Your age', 'input' => 'input', 'type' => 'number' ],
如果模型属于一个角色,并且我们想要为角色创建一个选择字段。
'role_id' => [ 'label' =>'Role', 'input' => 'select', 'relation' => [ 'model' => 'App\Role', 'type' => 'one', 'column' => 'role_id', 'selectFrom' => 'name', 'valueFrom' => 'id', // This is how selectFrom and valueFrom works // <option value="{{ $role->id }}">{{ $role->name }}</option> ], ],
如果模型属于多个角色呢?
'roles[]' => [ 'label' => 'Roles', 'input' => 'select', 'relation' => [ 'name' => 'roles', 'model' => 'App\Role', 'type' => 'many', 'selectFrom' => 'name', 'valueFrom' => 'id' ], 'inject_attributes' => 'multiple' ],
用户模型的$字段数组的完整示例。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Lilessam\EloquentFields\Traits\FormGenerator; class User extends Model { use FormGenerator; public static $fields = [ 'name' => [ 'label' => 'Your name', 'input' => 'input', 'type' => 'text', ], 'age' => [ 'label' => 'Your age', 'input' => 'input', 'type' => 'number', ], 'roles[]' => [ 'label' => 'Roles', 'input' => 'select', 'relation' => [ 'name' => 'roles', 'model' => 'App\Role', 'type' => 'many', 'selectFrom' => 'name', 'valueFrom' => 'id', ], 'inject_attributes' => 'multiple' ], ]; public function roles() { return $this->belongsToMany('App\Role'); } }
valueCallbacks和valueFallbacks的示例。
public static $fields = [ 'exception_ids[]' => [ 'label' => 'المنتجات المستثناة', 'input' => 'select', 'valueCallback' => 'getExceptionsValues', 'valueFallback' => 'getAllProducts', 'selectFrom' => 'name_ar', 'valueFrom' => 'id', 'inject_attributes' => 'multiple' ], ]; public function getExceptionsValues() { $results = []; $exception_ids = $this->exception_ids ? json_decode($this->exception_ids) : []; foreach ($exception_ids as $exception_id) { $product = Product::find($exception_id); $results[] = $product; } return $results; } public static function getAllProducts() { return Product::latest()->get(); }
手动belongsTo
关系的示例,包括createValueCallbacks和updateValueFallbacks。
/** * The attributes that are building the model forms. * * @var array */ public static $fields = [ 'name_ar' => [ 'label' => 'الاسم بالعربية', ], 'name_en' => [ 'label' => 'الاسم بالإنجليزية', ], 'category_id' => [ 'label' => 'التصنيف الأساسي', 'input' => 'select', 'options' => [ '' => 'لا تصنيف', ], 'selectFrom' => 'name_ar', 'valueFrom' => 'id', 'valueCallback' => 'getCurrentValue', // Can be replaced with 'column' => 'category_id' for belongsTo relation 'updateValueFallback' => 'getUpdateCategories', 'createValueFallback' => 'getAllCategories', ], ]; /** * Get dropdown categories for EloquentFields. * * @return self */ public function getUpdateCategories() { return static::where('id', '!=', $this->id)->get(); } /** * Get all dropdown categories for EloquentFields Creation. * * @return self */ public static function getAllCategories() { return static::latest()->get(); } /** * Get Current value for the manual relation. * @return mixed */ public function getCurrentValue() { return $this->category_id; }
然后您只需调用generate_fields('App\User')
来生成创建表单字段,或者调用generate_fields('App\User', 1)
来生成id为1的用户的更新表单字段。
请注意,您可以向generate_fields
传递第三个参数,以排除一个或多个字段在表单中生成。
因此,如果我们调用generate_fields('App\User', null, 'age')
,将创建一个没有age
字段的创建表单。您也可以传递一个数组,例如,generate_fields('App\User', null, ['age', 'roles'])
将创建一个没有角色和年龄字段的创建表单。