PHP Web表单生成器案例分析


Posted in PHP onJune 02, 2020

本文实例讲述了PHP Web表单生成器。分享给大家供大家参考,具体如下:

1.实例:

PHP Web表单生成器案例分析

2. 需求分析

在项目的实际开发中,经常需要设计各种各样表单。直接编写HTML表单虽然简单,但修改、维护相对麻烦。
因此,可以利用PHP实现一个Web表单生成器,使其可以根据具体的需求定制不同功能的表单。具体实现需求如下:

  • 使用多维数组保存表单的相关信息
  • 支持的表单项包括文本框、文本域、单选框、复选框和下拉列表5种类型
  • 保存每个表单项的标记、提示文本、属性、选项值、默认值等
  • 将功能封装成函数,根据传递的参数生成指定的表单

数据的保存形式决定了程序实现的方式。
因此,根据上述开发要求,可以将每个表单项作为一个数组元素,每个元素利用一个关联数组描述,分别为:标记tag、提示文本text、属性数组attr、选项数组option和默认值default。

PHP Web表单生成器案例分析

3.案例实现

1.准备表单

表单的主要功能:就是在网页上用于输入信息的区域,收集用户输入的信息,并将其提交给后端的服务器进行处理,实现用户与服务器的交互。
例如:购物结算、信息搜索等都是通过表单实现的。

2.准备表单——创建表单

一个完整的表单是由表单域和表单控件组成的。其中,表单域由form标记定义,用于实现用户信息的收集和传递。

<form action="form.php" method="post" enctype="multipart/form-data">
  <!-- 各种表单控件 -->
</form>

“<!-- ?>”是HTML的注释标记,用于解释和说明。

PHP Web表单生成器案例分析

  • action属性的值可以是绝对路径、相对路径,若省略该属性则表示提交给当前文件进行处理。
    GET方式传递的表单在URL地址栏中可见。
    相比GET方式,POST方式提交的数据是不可见的,在交互时相对安全。因此,通常情况下使用POST方式提交表单数据。
  • enctype属性的默认值为application/x-www-form-urlencoded,表示在发送表单数据前编码所有字符。除此之外还可以设置为multipart/form-data(POST方式)表示不进行字符编码,尤其是含有文件上传的表单必须使用该值;设置为text/plain(POST方式)表示传输普通文本。

3.准备表单—表单控件

//input控件
<input type="text" name="user" value="test">	<!-- 文本框 -->
<input type="password" name="pwd" value="">		<!-- 密码框 -->
<input type="file" name="upload">     		<!-- 文件上传域 -->
<input type="hidden" name="id" value="2"> 		<!-- 隐藏域 -->
<input type="reset" value="重置">     		<!-- 重置按钮 -->
<input type="submit" value="提交">    		<!-- 提交按钮 -->
  • type属性设置不同的值,即可得到不同的表单控件
  • name属性用于指定控件的名称,用以区分表单中多个相同的控件
  • value属性用于设置表单控件的默认值
//input控件
<!-- 单选框 -->
<input type="radio" name="gender" value="m" checked> 男
<input type="radio" name="gender" value="w"> 女
<!-- 复选框 -->
<input type="checkbox" name="hobby[]" value="swimming"> 游泳
<input type="checkbox" name="hobby[]" value="reading"> 读书
<input type="checkbox" name="hobby[]" value="running"> 跑步
  • checked属性用于设置默认选中项
//textarea控件
<textarea name="introduce" cols="5" rows="10">
<!-- 文本内容 -->
</textarea>
  • textarea控件适用于自我评价、评论等可能需要输入大量信息的功能
  • 属性cols和rows用于定义文本域的高度和宽度
//select控件
<select name="area">
  <option selected>--请选择--</option>
  <option value="Beijing">北京</option>
  <option value="Shenzhen">深圳</option>
  <option value="Shanghai">上海</option>
</select>
  • select是定义下拉列表的标记
  • option是定义下拉列表中具体选项的标记
  • selected属性用于设置默认选中项

4.准备表单—label标记

在编写表单控件时,为了提供更好的用户体验,经常将input控件与label标记联合使用,以扩大控件的选择范围。
例如,选择性别时,单击提示文字“男”或“女”,也可选中相应的单选按钮。

使用label标记包裹单选按钮和提示文本,即可实现单击label标记里的内容时,相应的表单控件就会被选中。

<label><input type="radio" name="gender" value="m">男</label>
<label><input type="radio" name="gender" value="w">女</label>

5.多维数组

根据案例的需求分析可知,表单项的相关数据统一保存到一个多维数组中。其中,利用数字键名区分不同的表单项,每个表单项又是一个二维的关联数组。

// 利用多维数组保存表单元素
[
  0 => [],	// 表单项---单选按钮
  1 => [],	// 表单项
  2 => [],	// 表单项---文本框
  3 => [],	// 表单项
  ……
];
// 每个表单项的数组结构
0 => [
  'tag' => '', 	// 标记----input、textarea、select
  'text' => '', 	// 提示文本----label标签内显示的内容
  'attr' => [],	// 属性数组----表单元素的属性,如type
  'option' => [], 	// 选项数组----单选框或复选框中的每个选项
  'default' => ''	// 默认值----默认值
],
//准备表单数组
// $elements数组保存整个表单
$elements = [
  0 => [],		// 第1个表单项数组
  1 => [],		// 第2个表单项数组
];
//文本框
0 => [
  'tag' => 'input',
  'text' => '姓名:',
  'attr' => ['type' => 'text', 'name' => 'user']
],
//单选框
3 => [
  'tag' => 'input',
  'text' => '性别:',
  'attr' => ['type' => 'radio', 'name' => 'gender'],
  'option' => ['m' => '男', 'w' => '女'],
  'default' => 'm'
 ],

option利用关联数组保存具体的单选项,键名m、w为单选框的value属性值,对应的值“男”、“女”为该单选项的提示信息
default的值为option关联数组中的一个键名,表示默认选中哪一项

//复选框
4 => [
  'tag' => 'input',
  'text' => '爱好:',
  'attr' => ['type' => 'checkbox', 'name' => 'hobby[]'],
  'option' => ['swimming' => '游泳', 'reading' => '读书', 'running' => '跑步'],
  'default' => ['swimming', 'reading']
],
//下拉列表
5 => [
  'tag' => 'select',
  'text' => '住址:',
  'attr' => ['name' => 'area'],
  'option' => ['' => '--请选择--', 'BJ'=>'北京', 'SH'=>'上海', 'SZ'=>'深圳']
],
//文本域
6 => [
  'tag' => 'textarea',
  'text' => '自我介绍:',
  'attr' => ['name' => 'introduce', 'cols' => 50, 'rows' => 5]
],
//提交按钮
7 => [
  'tag' => 'input',
  'attr' => ['type' => 'submit', 'value' => '提交']
]

表单的自动生成

1.表单的自动生成——读取$elements数组

实现思路

  • 为了方便处理用户提交的数据,将$elements中的每个表单项与指定的数组进行合并,使得每个表单项都含有键为tag、text、attr、option和default五个元素,且顺序相同。
  • 根据tag值,分别调用前缀为“generate_”的函数进行表单项的拼接
  • 每个表单项占据一行,并返回拼接好的表单

2.表单的自动生成——拼接表单元素的属性

实现思路

  • 定义函数generate_attr($attr, $items = ‘')用于完成表单元素属性的拼接
  • $attr数组中元素的键为属性名称,元素的值为属性的值
  • 通过遍历完成属性与$items的拼接并返回,如type=“radio” name=“gender”

3.表单的自动生成——拼接input元素

实现思路

  • 根据是否含有option元素,判断是否是单选或多选
  • 若不是,则直接调用属性函数完成表单项的拼接
  • 若是,则通过遍历依次完成多个选项的拼接并返回
    PHP Web表单生成器案例分析

4.表单的自动生成——拼接select元素

实现思路

  • 拼接下拉列表的选项option
  • 完成select标记的完整拼接并返回PHP Web表单生成器案例分析

5.表单的自动生成——拼接textarea元素

实现思路

  • 拼接textarea元素的属性
  • 完整拼接textarea并返回
    PHP Web表单生成器案例分析

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 和 MySQL 开发的 8 个技巧
Jan 02 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
Mar 12 PHP
destoon设置自定义搜索的方法
Jun 21 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
php里array_work用法实例分析
Jul 13 PHP
PHP之预定义接口详解
Jul 29 PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 #PHP
PHP论坛实现积分系统的思路代码详解
Jun 01 #PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
May 29 #PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 #PHP
PHP实现本地图片转base64格式并上传
May 29 #PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 #PHP
php生成短网址/短链接原理和用法实例分析
May 29 #PHP
You might like
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
jQuery maxlength文本字数限制插件
2010/04/16 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
2015/06/10 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
2019/04/28 Javascript
redux.js详解及基本使用
2019/05/24 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
TensorFlow saver指定变量的存取
2018/03/10 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
专营店会计助理岗位职责
2013/11/29 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
不要在HTML中滥用div
2021/05/08 HTML / CSS
Python基础之元组与文件知识总结
2021/05/19 Python
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js