lcharette / uf_formgenerator
UserFrosting V5 的表单生成器
Requires
- php: ^8.0
- userfrosting/framework: ~5.1.0
- userfrosting/sprinkle-core: ~5.1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- league/factory-muffin: ^3.0
- league/factory-muffin-faker: ^2.0
- phpstan/phpstan: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpstan/phpstan-strict-rules: ^1.0
- phpunit/phpunit: ^9.5
- userfrosting/theme-adminlte: ^5.0
README
此Sprinkle提供了辅助类、Twig模板和JavaScript插件,用于根据UserFrosting的验证模式生成HTML表单、模态框和确认模态框。
帮助和贡献
如果您需要使用此Sprinkle的帮助或发现任何错误,请随时提交问题或提交拉取请求。您通常可以在UserFrosting聊天中找到我,以获得直接支持。
版本和UserFrosting支持
安装
要将FormGenerator安装到您的Sprinkle中
-
通过Composer安装FormGenerator
composer require lcharette/uf_formgenerator "~5.1.0"
-
将
UserFrosting\Sprinkle\FormGenerator\FormGenerator
添加到您的Sprinkle Recipe sprinkle方法中。 -
要使用前端助手,首先安装npm依赖项
npm install --save @lcharette/formgenerator@~5.1.0
-
然后添加此条目到您的
webpack.config.js
中的sprinkles
列表FormGenerator: require('@lcharette/formgenerator/webpack.entries'),
-
您想使用前端助手的每个模板文件,请将此行添加到
{% block scripts_page %}
{{ encore_entry_script_tags('widget.formGenerator') }}
-
运行
php bakery bake
完成Sprinkle的安装。
或者,您可以在应用程序的主要js文件中全局添加 @lcharette/formgenerator/app/assets/js/widget-formGenerator.js
。
工作示例
public/
目录作为FormGenerator的示例。您可以克隆此存储库,并像任何UserFrosting 5 Sprinkle一样安装它
composer install
php bakery bake
php -S localhost:8080 -t public
此演示未链接到任何数据库表,因此更改实际上不会保存 ;)
功能和用法
在开始使用 FormGenerator 之前,您应该阅读主UserFrosting指南,以熟悉 验证模式:(https://learn.userfrosting.com/routes-and-controllers/client-input/validation)
表单生成
在模式中定义字段
此Sprinkle使用UserFrosting用于验证表单数据的模式来构建表单。为此,只需将一个新的 form
键添加到在 schema
文件中找到的字段。
例如,这是一个用于验证创建 project
的表单的简单 schema
。表单将包含 name
、description
和 status
字段。
{ "name" : { "validators" : { "length" : { "min" : 1, "max" : 100 }, "required" : { "message" : "PROJECT.VALIDATE.REQUIRED_NAME" } } }, "description" : { "validators" : {} }, "status" : { "validators" : { "member_of" : { "values" : [ "0", "1" ] }, "required" : { "message" : "PROJECT.VALIDATE.STATUS" } } } }
注意:FormGenerator与json和YAML模式一起使用。
在此阶段,在典型的UserFrosting设置中,您会进入控制器和Twig文件,手动创建您的HTML表单。如果您只有两到三个字段,这可能会很轻松,但如果有一打或更多的字段,那就很痛苦。这就是FormGenerator在新的 form
属性的帮助下介入的地方。让我们将它添加到我们的 project
表单中
{ "name" : { "validators" : { "length" : { "min" : 1, "max" : 100 }, "required" : { "message" : "VALIDATE.REQUIRED_NAME" } }, "form" : { "type" : "text", "label" : "NAME", "icon" : "fa-flag", "placeholder" : "NAME" } }, "description" : { "validators" : {}, "form" : { "type" : "textarea", "label" : "DESCRIPTION", "icon" : "fa-pencil", "placeholder" : "DESCRIPTION", "rows" : 5 } }, "status" : { "validators" : { "member_of" : { "values" : [ "0", "1" ] }, "required" : { "message" : "VALIDATE.STATUS" } }, "form" : { "type" : "select", "label" : "STATUS", "options" : { "0" : "Active", "1" : "Disabled" } } } }
让我们更仔细地看看 name
字段
"form" : { "type" : "text", "label" : "PROJECT.NAME", "icon" : "fa-flag", "placeholder" : "PROJECT.NAME" }
在这里,您可以看到我们为这个name
字段定义了type
、label
、icon
和placeholder
的值。您可以定义任何标准的表单属性,以及icon
、label
和default
属性。如果需要,您的模式中还可以定义data-*
属性。对于
当然,可以使用翻译键来定义label
和placeholder
属性的值。
目前,FormGenerator支持以下表单元素:
- 文本(以及HTML5标准支持的任何输入:数字、tel、密码等)
- 多行文本框
- 下拉列表
- 复选框
- 隐藏字段
- 警告(在表单中显示静态警告框)
控制器部分
一旦在schema json或yaml文件中定义了字段,就需要在控制器中加载该模式。
首先要做的是将FormGenerator的Form
类添加到您的"使用"列表中:use UserFrosting\Sprinkle\FormGenerator\Form;
接下来,在加载模式并设置validator
的地方,您只需添加新的表单创建
// Load validator rules $schema = new RequestSchema("schema://project.json"); $validator = new JqueryValidationAdapter($schema, $this->translator); // Create the form $form = new Form($schema, $project);
在这个例子中,$project
可以包含字段的默认值(或当前值)。也可以直接传递从数据库中通过eloquent获取的数据集合。第二个参数也可以省略,以创建一个空表单。
最后一步是将字段发送到Twig。在返回给模板的变量列表中,添加fields
变量
$view->render($response, "pages/myPage.html.twig", [ "fields" => $form->generate(), "validators" => $validator->rules('json', true) ]);
Twig模板部分
现在,在myPage.html.twig
中显示表单的时间到了!
<form name="MyForm" method="post" action="/Path/to/Controller/Handling/Form"> {% include "forms/csrf.html.twig" %} <div id="form-alerts"></div> <div class="row"> <div class="col-sm-8"> {% include 'FormGenerator/FormGenerator.html.twig' %} </div> </div> <div class="row"> <button type="submit" class="btn btn-block btn-lg btn-success">Submit</button> </div> </form>
就是这样!不需要手动列出所有字段。在fields
变量中定义的字段将由FormGenerator/FormGenerator.html.twig
显示。请注意,这只会加载字段,而不是表单本身。需要手动添加<form>
标签和submit
按钮。
模态表单
如果您想在模态窗口中显示表单,怎么办?FormGenerator让这变得更容易!基本上是三个步骤
- 设置您的表单模式(如上所述)
- 在控制器中设置表单
- 从模板中调用模态
在控制器中设置表单
有了您的模式,是时候创建一个控制器和路由来加载您的模态。控制器代码将与任何基本的UserFrosting模态一样,加上上面的$form
部分以及在render
部分的一个更改。例如
$view->render($response, "FormGenerator/modal.html.twig", [ "box_id" => $get['box_id'], "box_title" => "PROJECT.CREATE", "submit_button" => "CREATE", "form_action" => '/project/create', "fields" => $form->generate(), "validators" => $validator->rules('json', true) ]);
如您所见,您不需要渲染自己的Twig模板,只需指定FormGenerator的模态模板即可。这个模板需要以下变量
box_id
:这应该是$get['box_id']
。这是由JavaScript代码用来实际显示模态的。box_title
:模态的标题。submit_button
:提交按钮的标签。可选。默认为SUBMIT
(本地化)。form_action
:表单将发送到的路由fields
:字段。应该是$form->generate()
validators
:客户端验证器
从模板中调用模态
所以到了这个阶段,您有一个在/path/to/controller
路由上显示模态的控制器。是时候显示那个模态了。再次,两步
首先,定义一个链接或按钮,当点击时将调用模态。例如
<button class="btn btn-success js-displayForm" data-formUrl="/path/to/controller">Create</button>
这里的重要部分是data-formUrl
属性。这是将加载您表单的路由。js-displayForm
在这里用于将按钮绑定到动作。
其次,加载FormGenerator JavaScript小部件。将其添加到您的Twig文件中
{% block scripts_page %}
{{ assets.js('js/FormGenerator') | raw }}
{% endblock %}
默认情况下,formGenerator
插件会将一个form modal
绑定到每个带有js-displayForm
类的元素。
模态确认
FormGenerator的一个特点是可以使用简单的HTML5属性向您的页面添加确认模态。这个过程与添加模态表单类似,无需创建任何控制器或路由。
让我们看看我们的project
的删除按钮/确认
<a href="#" class="btn btn-danger js-displayConfirm" data-confirm-title="Delete project ?" data-confirm-message="Are you sure you want to delete this project?" data-confirm-button="Yes, delete project" data-post-url="/project/delete"><i class="fa fa-trash-o"></i> Delete</a>
(请注意,数据属性的内容可以是翻译键)
如果尚未完成,请确保将FormGenerator资源包含在您的模板中。
{% block scripts_page %}
{{ assets.js('js/FormGenerator') | raw }}
{% endblock %}
默认情况下,formGenerator
插件会将一个confirmation modal
绑定到每个带有js-displayConfirm
类的元素。
高级使用
在PHP中定义属性
setInputArgument
表单字段输入属性也可以从PHP中添加或编辑。这在动态定义Select输入选项时很有用。为此,只需使用setInputArgument($inputName, $property, $data)
方法。例如,向clients
选择添加一个列表
// Get clients from the db model $clients = Clients::all(); $form = new Form($schema); $form->setInputArgument('clients', 'options', $clients);
setData
如果您想一旦创建表单实例就设置表单值,可以使用setData($data)
方法
$form = new Form($schema); $form->setData($clients, $project);
setValue
与setData
方法类似,您可以使用setValue($inputName, $value)
方法设置特定输入值
$currentClient = ... $form = new Form($schema, $project); $form->setValue('clients', $currentClient);
setFormNamespace
当处理同一页面上的多个表单或动态数量的输入(您可以使用4.1中的新Loader
系统来构建动态模式!)时,使用setFormNamespace($namespace)
方法将表单元素包装在数组中很有用。这也可以使输入名称使用点语法。
例如,$form->setFormNamespace("data");
将所有输入名称从<input name="foo" [...] />
转换为<input name="data[foo]" [...] />
。
registerType
如果您想覆盖或添加新元素类型,
首先,您需要创建元素本身。此类需要扩展UserFrosting\Sprinkle\FormGenerator\Element\Input
类。在那里您可以定义默认属性,并进行其他转换。例如,要定义新的Date
元素类型
<?php namespace UserFrosting\Sprinkle\MySprinkle\Element; use UserFrosting\Sprinkle\FormGenerator\Element\Input; class Date extends Input { protected function applyTransformations(): void { $this->element = array_merge([ 'class' => 'myDateElement', 'value' => $this->getValue(), 'name' => $this->name, 'id' => 'field_' . $this->name, 'date-foo' => //... ], $this->element); } }
接下来,您需要注册您的Date
元素类型。如果date
类型已注册,则将被您的自定义类覆盖。
$form = new Form($schema, $project); $form->registerType('date', UserFrosting\Sprinkle\MySprinkle\Element\Date::class);
JavaScript插件
默认情况下,formGenerator
插件会将一个form modal
绑定到每个带有js-displayForm
类的元素,并将一个confirmation modal
绑定到每个带有js-displayConfirm
类的元素。您可以
选项
以下选项可用
只需传递一个包含这些选项的对象即可
mainAlertElement
(jQuery元素)。主页面中显示主要警告的元素。默认为$('#alerts-page')
。redirectAfterSuccess
(布尔值)。如果设置为true,表单提交或确认成功时页面将重新加载。默认为true
。
示例
$(".project-edit-button").formGenerator({redirectAfterSuccess: false});
事件
您可以监听FormGenerator返回的一些事件。这些事件可以在模态显示或表单成功发送时应用一些操作。例如,这可以与redirectAfterSuccess
在false
上一起使用,以便在表单成功提交时刷新页面上的数据。
formSuccess.formGenerator
displayForm.formGenerator
显示确认.formGenerator
确认成功.formGenerator
错误.formGenerator
示例
$(".project-edit-button").on("formSuccess.formGenerator", function () { // Refresh data });
运行测试
FormGenerator 包含一些单元测试。在提交新的 Pull Request 之前,您需要确保所有测试都通过。在您的 UserFrosting 安装中添加了 sprinkle 之后,只需执行 php bakery test FormGenerator
命令即可运行测试。
许可证
由 Louis Charette 提供。版权所有 (c) 2020,根据 MIT 许可证,可在个人和商业软件中免费使用。