Orchestra 平台 HTML 组件


README

HTML 组件扩展了 Illuminate\Html 的功能,增加了链式表单和表格构建器的额外功能。这一系列功能是 Orchestra 平台扩展的基础,允许将操作附加到任何现有的表单或表格。

tests Latest Stable Version Total Downloads Latest Unstable Version License Coverage Status

版本兼容性

安装

要通过 composer 安装,请在终端运行以下命令

composer require "orchestra/html"

配置

接下来,在 config/app.php 中添加服务提供者。

'providers' => [

    // ...

    Orchestra\Html\HtmlServiceProvider::class,
],

别名

您可能需要将以下内容添加到 config/app.php 中的类别名

'aliases' => [

    // ...

    'Form' => Orchestra\Support\Facades\Form::class,
    'HTML' => Orchestra\Support\Facades\HTML::class,
    'Table' => Orchestra\Support\Facades\Table::class,
],

使用方法

Orchestra\Html\HtmlBuilder 是对 Illuminate\Html\HtmlBuilder 的微小改进。

建议仅在需要在视图外操作 HTML 时使用它,否则使用 html 更好(且更快)。

创建 HTML

使用以下代码在您的库/扩展中创建 HTML 标签

return HTML::create('p', 'Some awesome information');

将返回 <p>一些很棒的信息</p>

您可以通过添加第三个参数来自定义 HTML 属性。

return HTML::create('p', 'Another awesomeness', ['id' => 'foo']);

将返回 <p id="foo">另一种很棒的东西</p>

原始 HTML 实体

标记一个字符串以避免转义。

return HTML::link('foo', HTML::raw('<img src="foo.jpg">'));

将返回 <a href="foo"><img src="foo.jpg"></a>

这也可以通过动态方式完成。

return HTML::link('foo', HTML::image('foo.jpg'));

装饰 HTML

装饰方法允许开发者将 HTML 属性集合定义为 HTML::attributes 方法,同时可以添加默认属性数组作为第二个参数。

return HTML::decorate(['class' => 'foo'], ['id' => 'foo', 'class' => 'span5']);

将返回 array('class' => 'foo span5', 'id' => 'foo');

它还支持在需要时替换默认属性。

return HTML::decorate(['class' => 'foo !span5'], ['class' => 'bar span5']);

将返回 array('class' => 'foo bar');,注意当我们在第一个参数中给出 !span5 时,会排除 span5

表单

使用 Orchestra 的 HTML 包创建表单非常简单。让我们开始吧。

创建新表单

要创建新表单,使用 Form::of() 方法。第一个参数是一个字符串,用于定义表单的目的

return Form::of('users');
表单属性

要自定义表单属性,在 FormGrid 实例上调用 attributes($attributes) 方法

return Form::of('users', function ($form) {
    $attributes = [
        'method' => 'PATCH',
        'id'     => 'user-login-form',
        'class'  => 'form-horizontal',
    ];

    $form->attributes($attributes);
});
指定表单布局

要指定表单布局,在 FormGrid 实例上调用 layout($view) 方法

return Form::of('users', function ($form) {
    $form->layout('layouts.form');
});
添加字段

要向我们的表单添加字段,我们将传递一个闭包到第二个参数,并在注入的 FormGrid 上调用 fieldset() 方法。以下是一个示例

return Form::of('users', function ($form) {
    $form->fieldset(function ($fieldset) {
        $fieldset->control('input:text', 'username');
        $fieldset->control('input:email', 'email');
        $fieldset->control('input:password', 'password');
    });
});
可用字段
// A text field
$form->control('input:text', 'name');

// A password field
$form->control('input:password', 'name');

// A file field
$fieldset->control('input:file', 'name');

// A textarea filed
$form->control('textarea', 'name');

// A select field
$form->control('select', 'name')
    ->options(['one', 'two', 'three']);
添加标签到字段

要向表单控件添加标签,请使用 label() 方法

$form->fieldset(function ($fieldset) {
    $form->control('input:text', 'username')
        ->label('Username');

    $form->control('input:email', 'email')
        ->label('Email');

    $form->control('input:password', 'password')
        ->label('Password');
});
添加字段的默认值

要向字段添加默认值,请使用表单控件的 value() 方法

$form->fieldset(function ($fieldset) {
    $form->control('input:text', 'username')
        ->label('Username')
        ->value(Auth::user()->username);

    $form->control('input:email', 'email')
        ->label('Email')
        ->value(Auth::user()->email);

    $form->control('input:password', 'password')
        ->label('Password');
});
更改提交按钮标签

要更改提交按钮标签,修改 FormGrid 属性 submit 如下

return Form::of('users', function ($form) {
    // The form submit button label
    $form->submit = 'Save';

    $form->fieldset(function ($fieldset) {
        $form->control('input:text', 'username');
        $form->control('input:email', 'email');
        $form->control('input:password', 'password');
    });
});
自定义表单控件属性

要自定义表单控件的属性,在控件上调用 attributes($attributes) 方法

$attributes = [
    'placeholder' => 'Enter your username',
    'class'       => 'form-control',
];

$form->control('input:text', 'username')
    ->attributes($attributes);
自定义表单控件本身
$form->control('input:email', 'email', function ($control) {
    $control->field(function ($row) {
        return "<input type='email' name="email" value='$row->email'>";
    });
});

您还可以创建一个 Renderable

use Illuminate\Contracts\Support\Renderable;

class EmailAddressField implements Renderable
{
    public function __construct($name, $value)
    {
        $this->name = $name;
        $this->value = $value;
    }

    public function render()
    {
        return sprintf('<input type="email" name="%s" value="%s">', $this->name, $this->value);
    }
}

然后您可以简单地通过以下方式注册它

$form->control('input:email', 'email', function ($control) {
    $control->field(function ($row) {
        return new EmailAddressField('email', $row->email);
    });
});
显示您的表单

要显示您的表单,只需在视图中使用未转义的blade标签显示它即可

public function index()
{
    $form = Form::of('users', function ($form) {
        $form->fieldset(function ($fieldset) {
            $form->control('input:text', 'username');
            $form->control('input:email', 'email');
            $form->control('input:password', 'password');
        });
    });

    return view('index', compact('form'));
}
// In index.blade.php

{!! $form !!}