pta/formbuilder

此包最新版本(1.0.4)没有提供许可证信息。

从 SQL 模式自动生成表单定义

1.0.4 2017-06-09 17:49 UTC

README

表单生成器会动态生成针对任何给定模型的 '创建' 表单和 '更新' 表单。表单生成器会拉取模型的表模式,并将表单字段映射到模式类型,以确定如何生成表单。

安装

要安装,请在命令行中运行 composer require pta/formbuilder

或您可以将以下内容手动添加到您的 composer.json 文件中

"require": {
        "pta/formbuilder": "0.2.*",
    }

服务提供者

您需要在 app.php 配置文件中的提供者数组中添加 Pta\Formbuilder\Providers\FormBuilderServiceProvider::class,

门面

如果您想在视图中使用门面,需要将 'FormBuilder'=> Pta\FormBuilder\Facades\FormBuilder::class, 添加到 app.php 配置文件中的门面数组中。

用法

要使用 FormBuilder,请使用 Pta\Formbuilder\Lib\ModelSchemaBuilder 扩展您的模型。

在您想要显示模型表单的视图中,键入

{!! FormBuilder::buildForm('Namespace\To\Models\ModelName', 'Method', 'Named Route', 'FormType', ID, 'translation namespace') !!}

'ID' 和 'translation namespace' 可以是 NULL 值。

示例

此表单将创建一个新用户

{!! FormBuilder::buildForm('Pta\Formbuilder\Models\User', 'POST', 'User.Create', 'create') !!}

此表单将更新 ID 为 1 的用户

{!! FormBuilder::buildForm('Pta\Formbuilder\Models\User', 'POST', 'User.Update', 'update', 1) !!}

表单是通过针对每种输入类型的一系列部分视图构建的,并且根据它是 '创建' 还是 '更新' 表单而有所不同。

表单的 HTML 基于 Bootstrap 3,并且可以完全自定义。发布视图并按需自定义它们。

使用翻译

FormBuilder 允许您传递一个命名空间路径以使用表单标签的翻译文件。例如,我可以为以下 User 模型配置一个翻译命名空间

{!! FormBuilder::buildForm('Pta\Formbuilder\Models\User', 'POST', 'User.Update', 'update', 1, 'Pta\Formbuilder\User::') !!}

如果我们想使用 '创建' 表单的翻译文件,我们需要像以下这样调整上面的创建示例

{!! FormBuilder::buildForm('Pta\Formbuilder\Models\User', 'POST', 'User.Create', 'create', null, 'Pta\Formbuilder\User::') !!}

我们需要为 ID 值传递一个 NULL 值。

发布视图

php artisan vendor:publish --provider="Pta\Formbuilder\Providers\FormBuilderServiceProvider" --tag="views"

覆盖默认行为

在配置文件中,我们有几个地方可以调整默认行为。

发布配置

php artisan vendor:publish --provider="Pta\Formbuilder\Providers\FormBuilderServiceProvider" --tag="config"

为模型定义命名空间

FormBuilder 配置允许您为模型定义命名空间

'entity' => [
        'namespace' => 'App\\',
    ],

在您在配置中定义了模型的命名空间之后,您可以执行以下操作

{!! FormBuilder::buildForm('User', 'POST', 'User.Create', 'create', null, 'Pta\Formbuilder\User::') !!}

如果您有多个地方有模型(例如,多个使用 FormBuilder 的包),您仍然可以为构建表单所依据的模型定义一个完全限定命名空间类名。默认情况下,它将检查传递的模型是否存在。如果 formbuilder 找不到它,它将尝试使用您传递的命名空间路径 + 模型名称来查找模型。

默认标签

配置文件中有一个标签数组。这个数组是 列名 => 标签 的形式。编辑配置文件以调整或添加更多标签。

您可以通过在模型中声明一个 protected $formLabels 数组来按模型调整此列表。

    /*
    |--------------------------------------------------------------------------
    | Default Field Labels
    |--------------------------------------------------------------------------
    |
    | This option allows you to define what labels to use as defaults based on
    | standard column name formats. Add or modify to fit your implementation.
    | To override these values on a per model basis, create an array in
    | your Model with the name of $formLabels
    |
    */
    'labels' => [
        'email'             => 'Email Address',
        'email2'            => 'Secondary Email Address',
        'first_name'        => 'First Name',
        'last_name'         => 'Last Name',
        'username'          => 'Username',
        'password'          => 'Password',
        'middle_initial'    => 'Middle Initial',
        'gender'            => 'Gender',
        'address1'          => 'Address',
        'address'           => 'Address',
        'address2'          => 'Address Continued',
        'city'              => 'City',
        'state'             => 'State',
        'zip'               => 'Zip Code',
        'country'           => 'Country',
        'phone'             => 'Phone Number',
        'fax'               => 'Fax Number',
        'dob'               => 'Date of Birth',
        'tos'               => 'Terms of Service',
    ],

默认跳过的表单字段

您可能不希望每个列都显示在您的表单上。配置文件中有一个 'fields' 数组,其中包含我们不想创建表单元素的列名。

    /*
    |--------------------------------------------------------------------------
    | Default Fields to skip populating on form
    |--------------------------------------------------------------------------
    |
    | This option allows you to define what fields/columns to ignore when
    | building out a form. To override these values on a per model basis,
    | create an array in your Model with the name of $skipFields
    |
    */
    'fields' => [
        'created_at',
        'deleted_at',
        'active',
        'updated_at',
        'permissions',
        'last_login',
        'password_date',
        'remember_token',
        'customer_id',
        'all',
    ],

通过从列表中添加或删除项目来更改表单行为。您还可以在模型中声明 $skipFields,并为每个模型分配要跳过的列数组。

默认表单输入映射

在配置中,我们还有一个将列类型映射到输入类型的数组。

    /*
    |--------------------------------------------------------------------------
    | Default mapping of column types to form types
    |--------------------------------------------------------------------------
    |
    | This option allows you to define the mapping of inputs field types    from
    | the schema to form input types. Example: Varchar is a string, so defaults
    | to Input etc. To override these values on a per model basis, create
    | an array in your Model with the name of $formInputs
    |
    */
    'inputs' => [
        'hidden'            => 'Hidden',
        'varchar'           => 'Input',
        'int'               => 'Input',
        'date'              => 'DateInput',
        'tinyint'           => 'CheckBox',
        'text'              => 'Text',
        'smallint'          => 'CheckBox'
    ],

调整此数组或添加新字段以适应您的实现。

进一步定制

如果您有一个需要更多定制映射的数据库字段,您可以通过声明一个以 FB_ 开头的列名公共方法来轻松重载默认字段类型。这会让 FormBuilder 知道它是一个 FB 方法。

例如,这是一个下拉列表。如果您与另一个模型有关联,例如一对一关系,您可能希望为 'Int' 数据库字段提供一个 'select' 字段。通常,'Int' 类型将默认为常规输入字段。

public function FB_school_id()
{
    return new SelectField(new School, 'id', 'name');
}

第一个参数是您想要使用以填充下拉列表的模型的新实例。第二个参数是您想要用作 <option id="$id"> 标签的 'ID' 的列名。第三个参数是您想要用作填充 <option id="$id">{{ $name }}</option> 标签的名称。

传递闭包

如果您想向 SelectField 传递自定义数据而不是实例中 "school" 的所有数据,您也可以向 SelectField 传递闭包。

public function FB_department_id()
    {
        $department = new Department; 
        return new SelectField($department, 'name', function() use ($department) {
            if(is_subclass_of($department, 'Illuminate\Database\Eloquent\Model')){ 
                return $department->where('active',1)->get(array('id','name'));
            }
            return false;
        });
    }

如果您想为 select 字段定义静态选项,您也可以向 SelectField 传递集合。

    public function FB_active()
    {
        $collection = \collect([(object)['name' => 'No', 'id' => "0"],(object)['name'=>'Yes', 'id' => "1"]]);
        return new SelectField(null, 'name', function() use ($collection) {
            return $collection;
        });
    }

添加表单字段

要添加不属于您的表架构的表单字段,请添加以下受保护数组

    protected $addFields = [
        'form_input_id',
    ];

除了添加此数组之外,您还需要在模型中提供一个名为 FB_form_input_id() 的方法来匹配您添加的新表单字段。如果您添加了一个字段但没有为该字段提供方法,则 FormBuilder 将引发错误。

这应该允许您自定义表单布局,或者简单地使用默认值。