lilessam/eloquent-fields

为 Laravel 5.5 提供的简单 Eloquent 模型字段生成器包

dev-master 2017-12-19 15:28 UTC

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 数组编写规则。
  1. 必须提供 label
  2. 必须提供 input,可以是 inputselecttextarea

如果 input 索引是 input,您必须提供 type 索引以提供输入类型,如 textnumberdate 等。

如果 input 类型是 select,您可以提供一个 options 索引,其中将包含选择下拉选项的数组。或者您可以提供一个 relation 索引,它将从 Eloquent 模型中的关系获取选项。

关系数组

该包目前支持三种 Eloquent 关系。您必须在关系数组中提供一个 type 索引,以根据以下指定关系类型:

  1. belongsTo 的类型将是 one,因为我们在这种情况下将只选择一个选项。
  2. hasManybelongsToMany:它们的类型将是 many,因为我们将选择多个值。

如果关系数组中的 type 索引是 one,您将需要提供

  • model 索引,它将是关系模型。
  • column 是外键。
  • selectFrom 将是我们在关系模型中显示的列。
  • valueFrom 将是关系模型中的列,它将是选择下拉选项的值。

如果关系数组中的 type 索引是 many,您将需要提供

  • name 索引,它将是关系的名称。例如,如果我的模型是 User,并且它有多个 Role,则关系的名称将是 roles 或您在 User 模型中创建的任何关系的名称。

您还需要提供 selectFromvalueFrom

如果输入是 select,您可以提供一个 valueFallback,它将是一个静态方法,返回下拉列表中的所有选项,然后您需要提供一个 valueCallback,它将返回所选选项集合。

其他偏好

在您的所有字段规范中,有多种额外的东西可以非常有用。

  1. label_classes,这是标签类的属性值。您可以覆盖默认类,默认类为control-label col-md-4
  2. input_div_classes,这是包含输入代码的div的类属性。默认值为col-md-6
  3. input_classes:这是输入本身的类属性。默认值为form-control
  4. input_id,这是输入本身的id属性。默认值为字段名。
  5. 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'])将创建一个没有角色和年龄字段的创建表单。

如果您发现问题,请不要犹豫,提交一个pull request或发布一个issue。