表单构建器
建议编辑介绍
描述表单字段可能是一项具有挑战性的任务,但使用 Orchid\Screen\Builder
,您可以轻松修改和重用表单字段,只需一个构建器即可生成 HTML
代码。
要构建表单,您需要提供字段定义以及可能的数据源:
use Orchid\Screen\Builder;
use Orchid\Screen\Fields\Input;
// 使用字段定义初始化表单构建器
$builder = new Builder([
Input::make('name'),
]);
// 生成表单的 HTML 代码
$html = $builder->generateForm();
数据绑定
要指定元素的值,您必须指定数据源。通过提供指定的键,数据将自动替换相应的字段。
例如:
use Orchid\Screen\Builder;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Repository;
$fields = [
Input::make('name'),
];
$repository = new Repository([
'name' => 'Alexandr Chernyaev',
]);
$builder = new Builder($fields, $repository);
$html = $builder->generateForm();
也可以使用 dot
-notation 访问嵌套对象。
$fields = [
Input::make('name.ru'),
];
$repository = new Repository([
'name' => [
'en' => 'Alexandr Chernyaev',
'ru' => 'Александр Черняев',
],
]);
$builder = new Builder($fields, $repository);
$html = $builder->generateForm();
您还可以使用 setLanguage
方法设置所需的语言和前缀:
$fields = [
Input::make('name'),
];
$repository = new Repository([
'en' => [
'name' => 'Alexandr Chernyaev',
],
'ru' => [
'name' => 'Александр Черняев',
]
]);
$builder = new Builder($fields, $repository);
$builder->setLanguage('en');
$html = $builder->generateForm();
创建字段
每个字段只是视图上的一个设置,用于将数据传递给模板。
以下是如何使用 Field
类创建自定义输入字段的示例。
namespace App\Orchid\Fields;
use Orchid\Screen\Field;
class CustomField extends Field
{
/**
* Blade 模板
*
* @var string
*/
protected $view = '';
/**
* 默认属性值。
*
* @var array
*/
protected $attributes = [];
/**
* 特定标签可用的属性。
*
* @var array
*/
protected $inlineAttributes = [];
}
view
属性由 blade 决定。
attributes
列出默认值,inlineAttributes
定义 HTML 格式的键,例如:
名字: <input type="text" name="name"><br>
在这个例子中,内联属性是直接在标签中指定的类型和名称。
而 make()
方法只是为了快速方便地初始化,
因为任何应该添加或修改数据的表单都必须具备它。
我们只需更新创建的类并添加 blade 模板,使用上面的示例:
{{ $title }}: <input {{ $attributes }}><br>
为了尝试新的字段,您必须使用内置的 render()
方法:
$input = CustomField::make('name');
$html = $input->render(); // html 字符串
html
变量将包含刚刚指定的模板,尝试添加一些元素:
$input = CustomField::make('name')
->title('你的名字是什么?')
->placeholder('Sheldon Cooper')
->value('Alexandr Chernyaev');
$html = $input->render();
刷新页面后,新的标题会显示在页面上,
而不是默认的,但占位符和值没有应用。
这是因为它们没有在 inlineAttributes
中指定,修复如下:
/**
* 特定标签可用的属性。
*
* @var array
*/
protected $inlineAttributes = [
'name',
'type',
'placeholder',
'value'
];
之后,每个属性都会在我们的模板中绘制出来。