versatilelibs/laravel-html

此包的最新版本(v0.1.0)没有可用的许可信息。

为Laravel框架提供的HTML和表单构建工具

v0.1.0 2018-09-24 20:58 UTC

This package is auto-updated.

Last update: 2024-09-25 16:20:59 UTC


README

免责声明(pt_BR)

此仓库是基于laravelcollective/htmlwatson/bootstrap-form修改的版本。为了更好地与其他项目库集成,进行了一些修改。

安装

首先,通过Composer安装此包。编辑项目的composer.json文件以要求versatilelibs/laravel-html

composer require versatilelibs/laravel-html

接下来,将新的提供者添加到config/app.phpproviders数组中

  'providers' => [
    // ...
    Versatile\Html\HtmlServiceProvider::class,
    // ...
  ],

最后,将两个类别名添加到config/app.phpaliases数组中

  'aliases' => [
    // ...
      'Form' => Versatile\Html\FormFacade::class,
      'Html' => Versatile\Html\HtmlFacade::class,
    // ...
  ],

打算在Lumen中安装此包?首先,使此包与Lumen兼容需要对Lumen进行一些核心更改,这可能会削弱Lumen本身的作用。其次,我们认为,如果您需要在应用程序中使用此包,那么您本应使用Laravel。

打开表单

打开表单

{!! Form::open(['url' => 'foo/bar']) !!}
	//
{!! Form::close() !!}

默认情况下,将假设POST方法;然而,您可以指定其他方法

echo Form::open(['url' => 'foo/bar', 'method' => 'put'])

注意:由于HTML表单仅支持POSTGET方法,因此将自动添加一个隐藏的_method字段来欺骗PUTDELETE方法。

您还可以打开指向命名路由或控制器操作的表单

echo Form::open(['route' => 'route.name'])

echo Form::open(['action' => 'Controller@method'])

您还可以传递路由参数

echo Form::open(['route' => ['route.name', $user->id]])

echo Form::open(['action' => ['Controller@method', $user->id]])

如果您的表单将要接受文件上传,请将files选项添加到数组中

echo Form::open(['url' => 'foo/bar', 'files' => true])

CSRF保护

将CSRF令牌添加到表单中

Laravel提供了一种简单的方法来保护您的应用程序免受跨站请求伪造的影响。首先,将随机令牌放置在用户的会话中。如果您使用Form::open方法并带有POSTPUTDELETE,则CSRF令牌将自动添加到您的表单中作为隐藏字段。或者,如果您希望生成隐藏的CSRF字段的HTML,可以使用token方法

echo Form::token();

将CSRF过滤器附加到路由上

Route::post('profile',
    [
        'before' => 'csrf',
        function()
        {
            //
        }
    ]
);

表单模型绑定

打开模型表单

通常,您希望根据模型的内容填充表单。为此,请使用Form::model方法

echo Form::model($user, ['route' => ['user.update', $user->id]])

现在,当您生成表单元素(如文本输入)时,与字段名称匹配的模型值将自动设置为字段值。例如,对于名为email的文本输入,用户模型的email属性将被设置为值。但是,还有更多!如果会话闪存数据中存在与输入名称匹配的项,则它将优先于模型的值。因此,优先级如下所示

  1. 会话闪存数据(旧输入
  2. 当前请求的数据(通过Request::input方法)
  3. 显式传递的值
  4. 模型属性数据

这允许您快速构建表单,不仅可以将模型值绑定到表单上,而且在服务器上发生验证错误时,还可以轻松地重新填充!

注意:当使用Form::model时,请确保使用Form::close关闭表单!

表单模型访问器

Laravel的Eloquent 访问器允许您在返回模型属性之前对其进行操作。这对于定义全局日期格式等操作非常有用。然而,用于显示的日期格式可能与用于表单元素的日期格式不匹配。您可以通过创建两个独立的访问器来解决此问题:一个标准访问器,以及一个表单访问器。

要定义一个表单访问器,请将FormAccessible特质添加到您的模型中,并在模型中创建一个formFooAttribute方法,其中Foo是您希望访问的列的"驼峰"命名。在本例中,我们将定义对date_of_birth属性的访问器。当使用Form::model()尝试预填充表单字段时,HTML表单构建器将自动调用该访问器。

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Versatile\Html\Eloquent\FormAccessible;

class User extends Model
{
    use FormAccessible;

    /**
     * Get the user's date of birth.
     *
     * @param  string  $value
     * @return string
     */
    public function getDateOfBirthAttribute($value)
    {
        return Carbon::parse($value)->format('m/d/Y');
    }

    /**
     * Get the user's date of birth for forms.
     *
     * @param  string  $value
     * @return string
     */
    public function formDateOfBirthAttribute($value)
    {
        return Carbon::parse($value)->format('Y-m-d');
    }
}

标签

生成一个标签元素

echo Form::label('email', 'E-Mail Address');

指定额外的HTML属性

echo Form::label('email', 'E-Mail Address', ['class' => 'awesome']);

注意:创建标签后,任何具有与标签名称匹配的名称的表单元素将自动接收与标签名称匹配的ID。

文本、文本区域、密码和隐藏字段

生成一个文本输入

echo Form::text('username');

指定默认值

echo Form::text('email', 'example@gmail.com');

注意: hiddentextarea方法与text方法具有相同的签名。

生成一个密码输入

echo Form::password('password', ['class' => 'awesome']);

生成其他输入

echo Form::email($name, $value = null, $attributes = []);
echo Form::file($name, $attributes = []);

复选框和单选按钮

生成复选框或单选按钮输入

echo Form::checkbox('name', 'value');

echo Form::radio('name', 'value');

生成已选中的复选框或单选按钮输入

echo Form::checkbox('name', 'value', true);

echo Form::radio('name', 'value', true);

数字

生成数字输入

echo Form::number('name', 'value');

日期

生成日期输入

echo Form::date('name', \Carbon\Carbon::now());

文件输入

生成文件输入

echo Form::file('image');

注意:表单必须已使用将files选项设置为true的方式打开。

下拉列表

生成下拉列表

echo Form::select('size', ['L' => 'Large', 'S' => 'Small']);

生成带有选中默认值的下拉列表

echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], 'S');

生成带有空占位符的下拉列表

这将创建一个没有任何值的<option>元素,作为下拉列表中的第一个选项。

echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], null, ['placeholder' => 'Pick a size...']);

生成分组列表

echo Form::select('animal',[
	'Cats' => ['leopard' => 'Leopard'],
	'Dogs' => ['spaniel' => 'Spaniel'],
]);

生成带有范围的下拉列表

echo Form::selectRange('number', 10, 20);

生成带有月份名称的列表

echo Form::selectMonth('month');

按钮

生成提交按钮

echo Form::submit('Click Me!');

注意:需要创建按钮元素?尝试使用button方法。它具有与submit相同的签名。

自定义宏

注册表单宏

定义自定义表单类助手,称为"宏",非常简单。以下是工作原理。首先,只需使用给定的名称和闭包注册宏即可。

Form::macro('myField', function()
{
	return '<input type="awesome">';
});

现在,您可以使用其名称调用您的宏。

调用自定义表单宏

echo Form::myField();

##自定义组件

注册自定义组件

自定义组件类似于自定义宏,但与使用闭包生成结果HTML不同,组件利用Laravel Blade 模板。对于使用Twitter Bootstrap或任何其他前端框架的开发者,组件可以非常有用,因为这些框架需要额外的标记来正确渲染表单。

让我们构建一个简单的Bootstrap文本输入的表单组件。您可能会考虑在服务提供者的boot方法内部注册您的组件。

Form::component('bsText', 'components.form.text', ['name', 'value', 'attributes']);

注意我们如何引用视图路径components.form.text。此外,我们提供的数组是您组件的一种方法签名。这定义了将传递给您的视图的变量名称。您的视图可能看起来像这样

// resources/views/components/form/text.blade.php
<div class="form-group">
    {{ Form::label($name, null, ['class' => 'control-label']) }}
    {{ Form::text($name, $value, array_merge(['class' => 'form-control'], $attributes)) }}
</div>

自定义组件也可以在Html外观上创建,其方式与在Form外观上创建相同。

提供默认值

在定义自定义组件的方法签名时,您只需为您的数组项提供值,就可以简单地提供默认值,如下所示

Form::component('bsText', 'components.form.text', ['name', 'value' => null, 'attributes' => []]);

调用自定义表单组件

使用上面的示例(特别是提供默认值的那个),您可以这样调用自定义组件

{{ Form::bsText('first_name') }}

这将产生如下所示的HTML输出

<div class="form-group">
    <label for="first_name">First Name</label>
    <input type="text" name="first_name" value="" class="form-control">
</div>

##生成URL

link_to

生成指向给定URL的HTML链接。

echo link_to('foo/bar', $title = null, $attributes = [], $secure = null);

link_to_asset

生成指向给定资产的HTML链接。

echo link_to_asset('foo/bar.zip', $title = null, $attributes = [], $secure = null);

link_to_route

生成指向给定命名路由的HTML链接。

echo link_to_route('route.name', $title = null, $parameters = [], $attributes = []);

link_to_action

生成指向给定控制器操作的HTML链接。

echo link_to_action('HomeController@getIndex', $title = null, $parameters = [], $attributes = []);
```# Forms & HTML

- [Installation](#installation)
- [Opening A Form](#opening-a-form)
- [CSRF Protection](#csrf-protection)
- [Form Model Binding](#form-model-binding)
- [Form Model Accessors](#form-model-accessors)
- [Labels](#labels)
- [Text, Text Area, Password & Hidden Fields](#text)
- [Checkboxes and Radio Buttons](#checkboxes-and-radio-buttons)
- [File Input](#file-input)
- [Number Input](#number)
- [Date Input](#date)
- [Drop-Down Lists](#drop-down-lists)
- [Buttons](#buttons)
- [Custom Macros](#custom-macros)
- [Custom Components](#custom-components)
- [Generating URLs](#generating-urls)

<a name="installation"></a>
## Installation

Begin by installing this package through Composer. Edit your project's `composer.json` file to require `laravelcollective/html`.

    composer require "laravelcollective/html":"^5.4.0"

Next, add your new provider to the `providers` array of `config/app.php`:

```php
  'providers' => [
    // ...
    Versatile\Html\HtmlServiceProvider::class,
    // ...
  ],

最后,将两个类别名添加到config/app.phpaliases数组中

  'aliases' => [
    // ...
      'Form' => Versatile\Html\FormFacade::class,
      'Html' => Versatile\Html\HtmlFacade::class,
    // ...
  ],

打算在Lumen中安装此包?首先,使此包与Lumen兼容需要对Lumen进行一些核心更改,这可能会削弱Lumen本身的作用。其次,我们认为,如果您需要在应用程序中使用此包,那么您本应使用Laravel。

打开表单

打开表单

{!! Form::open(['url' => 'foo/bar']) !!}
	//
{!! Form::close() !!}

默认情况下,将假设POST方法;然而,您可以指定其他方法

echo Form::open(['url' => 'foo/bar', 'method' => 'put'])

注意:由于HTML表单仅支持POSTGET方法,因此将自动添加一个隐藏的_method字段来欺骗PUTDELETE方法。

您还可以打开指向命名路由或控制器操作的表单

echo Form::open(['route' => 'route.name'])

echo Form::open(['action' => 'Controller@method'])

您还可以传递路由参数

echo Form::open(['route' => ['route.name', $user->id]])

echo Form::open(['action' => ['Controller@method', $user->id]])

如果您的表单将要接受文件上传,请将files选项添加到数组中

echo Form::open(['url' => 'foo/bar', 'files' => true])

CSRF保护

将CSRF令牌添加到表单中

Laravel提供了一种简单的方法来保护您的应用程序免受跨站请求伪造的影响。首先,将随机令牌放置在用户的会话中。如果您使用Form::open方法并带有POSTPUTDELETE,则CSRF令牌将自动添加到您的表单中作为隐藏字段。或者,如果您希望生成隐藏的CSRF字段的HTML,可以使用token方法

echo Form::token();

将CSRF过滤器附加到路由上

Route::post('profile',
    [
        'before' => 'csrf',
        function()
        {
            //
        }
    ]
);

表单模型绑定

打开模型表单

通常,您希望根据模型的内容填充表单。为此,请使用Form::model方法

echo Form::model($user, ['route' => ['user.update', $user->id]])

现在,当您生成表单元素(如文本输入)时,与字段名称匹配的模型值将自动设置为字段值。例如,对于名为email的文本输入,用户模型的email属性将被设置为值。但是,还有更多!如果会话闪存数据中存在与输入名称匹配的项,则它将优先于模型的值。因此,优先级如下所示

  1. 会话闪存数据(旧输入
  2. 当前请求的数据(通过Request::input方法)
  3. 显式传递的值
  4. 模型属性数据

这允许您快速构建表单,不仅可以将模型值绑定到表单上,而且在服务器上发生验证错误时,还可以轻松地重新填充!

注意:当使用Form::model时,请确保使用Form::close关闭表单!

表单模型访问器

Laravel的Eloquent 访问器允许您在返回模型属性之前对其进行操作。这对于定义全局日期格式等操作非常有用。然而,用于显示的日期格式可能与用于表单元素的日期格式不匹配。您可以通过创建两个独立的访问器来解决此问题:一个标准访问器,以及一个表单访问器。

要定义一个表单访问器,请将FormAccessible特质添加到您的模型中,并在模型中创建一个formFooAttribute方法,其中Foo是您希望访问的列的"驼峰"命名。在本例中,我们将定义对date_of_birth属性的访问器。当使用Form::model()尝试预填充表单字段时,HTML表单构建器将自动调用该访问器。

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Versatile\Html\Eloquent\FormAccessible;

class User extends Model
{
    use FormAccessible;

    /**
     * Get the user's date of birth.
     *
     * @param  string  $value
     * @return string
     */
    public function getDateOfBirthAttribute($value)
    {
        return Carbon::parse($value)->format('m/d/Y');
    }

    /**
     * Get the user's date of birth for forms.
     *
     * @param  string  $value
     * @return string
     */
    public function formDateOfBirthAttribute($value)
    {
        return Carbon::parse($value)->format('Y-m-d');
    }
}

标签

生成一个标签元素

echo Form::label('email', 'E-Mail Address');

指定额外的HTML属性

echo Form::label('email', 'E-Mail Address', ['class' => 'awesome']);

注意:创建标签后,任何具有与标签名称匹配的名称的表单元素将自动接收与标签名称匹配的ID。

文本、文本区域、密码和隐藏字段

生成一个文本输入

echo Form::text('username');

指定默认值

echo Form::text('email', 'example@gmail.com');

注意: hiddentextarea方法与text方法具有相同的签名。

生成一个密码输入

echo Form::password('password', ['class' => 'awesome']);

生成其他输入

echo Form::email($name, $value = null, $attributes = []);
echo Form::file($name, $attributes = []);

复选框和单选按钮

生成复选框或单选按钮输入

echo Form::checkbox('name', 'value');

echo Form::radio('name', 'value');

生成已选中的复选框或单选按钮输入

echo Form::checkbox('name', 'value', true);

echo Form::radio('name', 'value', true);

数字

生成数字输入

echo Form::number('name', 'value');

日期

生成日期输入

echo Form::date('name', \Carbon\Carbon::now());

文件输入

生成文件输入

echo Form::file('image');

注意:表单必须已使用将files选项设置为true的方式打开。

下拉列表

生成下拉列表

echo Form::select('size', ['L' => 'Large', 'S' => 'Small']);

生成带有选中默认值的下拉列表

echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], 'S');

生成带有空占位符的下拉列表

这将创建一个没有任何值的<option>元素,作为下拉列表中的第一个选项。

echo Form::select('size', ['L' => 'Large', 'S' => 'Small'], null, ['placeholder' => 'Pick a size...']);

生成分组列表

echo Form::select('animal',[
	'Cats' => ['leopard' => 'Leopard'],
	'Dogs' => ['spaniel' => 'Spaniel'],
]);

生成带有范围的下拉列表

echo Form::selectRange('number', 10, 20);

生成带有月份名称的列表

echo Form::selectMonth('month');

按钮

生成提交按钮

echo Form::submit('Click Me!');

注意:需要创建按钮元素?尝试使用button方法。它具有与submit相同的签名。

自定义宏

注册表单宏

定义自定义表单类助手,称为"宏",非常简单。以下是工作原理。首先,只需使用给定的名称和闭包注册宏即可。

Form::macro('myField', function()
{
	return '<input type="awesome">';
});

现在,您可以使用其名称调用您的宏。

调用自定义表单宏

echo Form::myField();

##自定义组件

注册自定义组件

自定义组件类似于自定义宏,但与使用闭包生成结果HTML不同,组件利用Laravel Blade 模板。对于使用Twitter Bootstrap或任何其他前端框架的开发者,组件可以非常有用,因为这些框架需要额外的标记来正确渲染表单。

让我们构建一个简单的Bootstrap文本输入的表单组件。您可能会考虑在服务提供者的boot方法内部注册您的组件。

Form::component('bsText', 'components.form.text', ['name', 'value', 'attributes']);

注意我们如何引用视图路径components.form.text。此外,我们提供的数组是您组件的一种方法签名。这定义了将传递给您的视图的变量名称。您的视图可能看起来像这样

// resources/views/components/form/text.blade.php
<div class="form-group">
    {{ Form::label($name, null, ['class' => 'control-label']) }}
    {{ Form::text($name, $value, array_merge(['class' => 'form-control'], $attributes)) }}
</div>

自定义组件也可以在Html外观上创建,其方式与在Form外观上创建相同。

提供默认值

在定义自定义组件的方法签名时,您只需为您的数组项提供值,就可以简单地提供默认值,如下所示

Form::component('bsText', 'components.form.text', ['name', 'value' => null, 'attributes' => []]);

调用自定义表单组件

使用上面的示例(特别是提供默认值的那个),您可以这样调用自定义组件

{{ Form::bsText('first_name') }}

这将产生如下所示的HTML输出

<div class="form-group">
    <label for="first_name">First Name</label>
    <input type="text" name="first_name" value="" class="form-control">
</div>

##生成URL

link_to

生成指向给定URL的HTML链接。

echo link_to('foo/bar', $title = null, $attributes = [], $secure = null);

link_to_asset

生成指向给定资产的HTML链接。

echo link_to_asset('foo/bar.zip', $title = null, $attributes = [], $secure = null);

link_to_route

生成指向给定命名路由的HTML链接。

echo link_to_route('route.name', $title = null, $parameters = [], $attributes = []);

link_to_action

生成指向给定控制器操作的HTML链接。

echo link_to_action('HomeController@getIndex', $title = null, $parameters = [], $attributes = []);