表单构建器

建议编辑

介绍

描述表单字段可能是一项具有挑战性的任务,但使用 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'
];

之后,每个属性都会在我们的模板中绘制出来。

我们的朋友