[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

使用fuelphp的fieldset快速、优雅、广泛地批量生成输入表单

你好。
我是Mandai,负责Wild 开发团队。
在我们公司,我们经常使用fuelphp
这次我想传达的是fieldset的精髓。
FuelPHP的版本已确认为1.7.2。

 

什么是字段集?

我认为fieldset是fuelphp高速发展的产物,但令人惊讶的是日本似乎很少有文章对其进行深入探讨。
有很多文章说我尝试使用它一段时间了。
fieldset 是一种根据模型中定义的信息使用单一方法创建表单的机制,
如果您使用的是使用标准 Twitter bootstrap 的 Web 应用程序,则
无需编写 HTML 即可轻松输出表单部分。

一旦你仔细绘制了模型,你就可以依靠fieldset的动力并一次性创建它,所以
如果你有很多输入屏幕并且末班车将固定一段时间,请考虑这一点并享受与如果你能弄清楚的话,我将不胜感激。

 

所以我们也写一个模型。

使用 fieldset 时,表单生成所需的所有信息都被推送到 $_properties 中。
这里不仅可以写输入类型,还可以写验证,以集中管理表单信息。
作为示例,让我们使用假设图书注册屏幕的模型创建一个 Model_Book 类。

我准备了如下的图书表。

创建表 `books` ( `id` int(10) unsigned NOT NULL AUTO_INCRMENT, `title` varchar(512) NOT NULL, `author` varchar(256) NOT NULL, `price` int(10) unsigned NOT NULL, ` isbn` varchar(13) DEFAULT '',`released_at` 日期 DEFAULT '0000-00-00',`type` tinyint(2) DEFAULT NULL,`created_at` 时间戳 NOT NULL DEFAULT '0000-00-00 00:00: 00', `updated_at` 时间戳 NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
如下定义该 books 表的模型。

<?php // fuel/app/classes/model/book.php class Model_Book extends \Model\Orm { protected static $_connection = 'default'; protected static $_table_name = 'books'; protected static $_properties = [ 'id', 'title' => [ 'data_type' => 'varchar', 'label' => '标题', '验证' => [ '必需', 'max_length' => [512], ], 'form' => [ '类型' = > '文本', '类' => '表单控制', ], ], '作者' => [ 'data_type' => 'varchar', '标签' => '作者', '验证' => [ '必需', 'max_length' => [512], ], '表单' => [ '类型' => '文本', '类' => '表单控制', ], ], '价格' => [ 'data_type' => 'int', 'label' => '价格', '验证' => [ '必需', 'numeric_min' => [0], ], 'form' => [ 'type' = > 'number', 'class' => 'form-control', 'min' => 0, ], ], 'isbn' => [ 'data_type' => 'varchar', 'label' => 'ISBN' , '验证' => [ 'match_pattern' => ['/^[0-9]{10}([0-9]{3})?$/'], ], '表单' => [ '类型' => '文本', 'class' => '表单控制', ], ], 'released_at' => [ 'data_type' => '日期', '标签' => '发布日期', '验证' => [ 'valid_date' => [], ], 'form' => [ 'type' => 'text', 'class' => '表单控件日期选择器', ], ], 'type' => [ 'date_type' => 'tinyint', 'label' => '格式', 'validation' => [ 'numeric_min' => [0], ], 'form' => [ 'type' => 'select' , 'class' => '表单控制', '选项' => [ 0 => '未知', 1 => 'A4 尺寸', 2 => 'A5 尺寸', 3 => 'A6 尺寸', 4 => > 'B4 尺寸', 5 => 'B5 尺寸', 6 => 'B6 尺寸', 7 => '小 B6 尺寸', 8 => '菊部尺寸', 9 => '国际尺寸', 10 => 'AB 尺寸', 11 => '重箱版', 12 => '菊版', 13 => '白六尺寸', 14 => 'B40 尺寸', 15 => '袖珍书版', 16 => '35 -size', 17 => '8 倍', 18 => 'HL 尺寸', ], ], ], 'created_at' => [ 'form' => ['type' => false] , ], 'updated_at' => [ 'form' => ['type' => false], ], ]; protected static $_observers = [ 'Orm\Observer_CreatedAt' => [ 'events' => ['before_insert' ], ' mysql_timestamp' => true, ], 'Orm\Observer_UpdatedAt' => [ 'events' => ['before_update'], 'mysql_timestamp' => true, ], ];


 我现在已经填写了大部分需要的信息。
由于信息非常紧凑,可以按结构化的顺序书写,因此错误较少,也
易于事后纠正。
标准验证规则列于Validation-Class-FuelPHP 文档

有关表单创建的信息在每个字段的“form”键下提供。
“Type”对应input标签的type属性,textarea标签也可以同样处理,包括常用的text、select、hidden、checkbox、radio等。
对于 type="select"、type="checkbox"、type="radio" 的情况,可以通过将选项元素写为“options”下的数组来定义固定值。

另外,如果不是固定值,可以从控制器侧的选项中设置数据,如下所示。

$form = \Fieldset::forge('default', [ 'form_attributes' => ['class' => 'form-horizo​​ntal'] ])->add_model('Model_Book'); $newspaper_types = [ 19 => ' 'Broadsheet', 20 => '北欧', 21 => 'Rhenish', 22 => '瑞士 (NZZ)', 23 => '柏林', 24 => 'Tabloid Extra' ', 25 => '半瑞士人', 26 => 'Half Berliner', 27 => 'Half Rhenish', 28 => 'Half Broadsheet', 29 => 'Tabloid', ]; // 添加一个项目 $form->field('type' )->set_options($newspaper_types); // 替换一个项目 $form->field('type')->set_options($newspaper_types , null, true);


 如果将 set_options 方法的第三个参数设置为 true,则数组将被覆盖而不合并。
目前,您可以轻松地在模型端仅输入未选择的值,如果有其他可能的值则添加值。

你可以直接用$form->field('type')来操作表单元素,所以只要你记住了这个形状,
如果你想在某些时候稍微改变一下表达式,你就可以用控制器来控制它。
连接到$form->field('type')并执行各种操作的方法位于fuel/core/classes/fieldset/field.php中。
如果您也看看这些方法,我想您可以找到适合您目的的方法。

 

使用一种方法创建表单

定义模型后,您所要做的就是在控制器中进行一些微调并生成 HTML。
我所说的微调的意思是,如果您什么都不做,您最终会得到一个没有提交按钮的表单。
既然是表单,就需要一个提交按钮,对吗?你可能会这么想,但
我认为这是fuelphp所独有的,它与cakephp有不同的理念,没有照顾不必要的事情。

$form->add('提交', ' ', ['type'=>'提交', 'class'=>'btn btn-primary 提交', 'value' => '注册']);

 
然而,由于这就是全部内容,您几乎可以通过复制和粘贴来完成。

最后,我们将表单部分的 HTML 传递给 View,但
对于继承 Controller_Template 的控制器,您所要做的就是伪造 View 并使用以下步骤倒入构建表单的构建方法的输出以下。

$this->template->content = View::forge('manager/master/form.php', $this->contents); $this->template->content->set_safe('form', $form- >构建());


 Fuelphp 自动转义传递给视图的字符串。
然而,set_safe方法用于将第二个参数中的信息传递给View而不进行转义。
出于安全考虑,可能最好不要太多使用,但我这样做是因为目前似乎没有其他有效的方法。

 

我想创建一个可以灵活应用引导程序的表单。

一开始我写过,如果你稍微闭上眼睛,你可以创造出更好的形式,
但仍然在乎外表是人的本性。正确的!
在默认状态下,将显示一个带有排列在表格中的标签和输入元素的表单,但
您可以通过操作模板来控制此行为。

默认模板是fuel/core/config/form.php,所以将此文件复制到app/config/并修改。

这里是一个模板配置文件的示例,该文件已被修改以应用twitter bootstrap 的Horizo​​ntal form

<?php // fuel/app/config/form.php return [ 'form_template' =>"\n\t\t{打开}\n{字段}\n\t\t{关闭}\n", 'field_template' => "\t\t<div class=\"form-group\"> \n\t\t\t{标签}\n\t\t\t<div class=\"col-xs-3 {error_class}\"> {字段} <span>{描述}</span> {error_msg}</div> \n\t\t</div> \n", 'multi_field_template' => "\t\t<div class=\"form-group\"> \n\t\t\t <label class=\"col-xs-2 control-label\">{组标签}{必需}</label> \n\t\t\t<div class=\"col-xs-3 {error_class}\"> {字段}\n\t\t\t\t<div> {字段} {标签}</div> {字段} <span>{描述}</span> \t\t\t{错误消息}\n\t\t\t</div> \n\t\t</div> \n", 'label_class' => 'col-xs-2 控制标签', 'group_label' => '{label}', ];


 该格式比较难掌握,因为它包含\t、\n等字符,但与屏幕显示无关,所以省略也没有问题。它只是让 HTML 源代码变得更难阅读。
另外,有一些项目列在默认的 core/config/form.php 中,但没有列在 app/config/form.php 中,但这不是问题,因为它们将被合并并使用默认设置。

您还可以使用AdminLTE ,它源自 twitter bootstrap,

 

实际可以减少多少工时?

首先,很明显,即使从模型中集中信息的角度来看,数据库设计也必须(在某种程度上)完成作为先决条件。
使用fieldset创建屏幕时,不可能与DB设计并行进行实现,因此您应该首先集中精力完成DB设计。

另外,如果你一边研究fieldset机制和最佳实践,一开始会花钱,但当你思考得更深入时,随着你习惯了,后半段的速度会急剧提高一个级别我认为这可以称为感性。
事实上,我已经离开了很多计划好的工时,并利用额外的时间来写这个博客。

如果您从未体验过,何不尝试一下,体验一下它的便利呢?

 
就是这样。

如果您觉得这篇文章有帮助,请点赞!
1
加载中...
1 票,平均:1.00 / 11
2,740
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

万代洋一

我的主要工作是为社交游戏开发 Web API,但我也很幸运能够做很多其他工作,包括营销。
此外,我在 Beyond 中的肖像权被视为 CC0。