分享
 
 
 

用PEAR中的HTML_QuickForm_Controller轻松实现多页面处理

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

PHP PEAR中的HTML_QuickForm_Controller可以轻松地实现多页面处理,比如注册页面,向导等有多个页面的情况,它由:

HTML_QuickForm_Controller this class extracts the action name from request and calls the appropriate handler. It includes several Pages

HTML_QuickForm_Page 页面显示

HTML_QuickForm_Action 逻辑代码的处理

三部分构成。

当处理单个页面的时候,你会觉得HTML_QuickForm_Controller的代码会比HTML_QuickForm更冗长,但是当有多个这样的页面(注册,安装向导等),你要做的就仅仅是增加几个HTML_QuickForm_Page,的子类,处理基于HTML_QuickForm_Action的事件(EVENT),然后将它们添加到HTML_QuickForm_Controller实例中。如果不用HTML_QuickForm_Controller,你也许需要写出一大堆的代码来实现。

下面我把前几天用HTML_QuickForm实现的一个注册页面

PHP PEAR/HTML/QuickForm实现用户注册表单界面

用HTML_QuickForm_Controller重新实现一遍,这次我将注册页面分为两个页面,另外最后的注册信息会保存到数据库中,这几天对于它的了解有了一点提高,相信代码会比上次的好。

需求:

1.建一个userinfo表

2.PEAR DB,HTML_QuickForm_Controller Package

3.其它的文件可以到以上的链接PHP PEAR/HTML/QuickForm中查看(css.css)

<?php

/**

* 完整的用户注册程序(多页面)

* 采用PEAR HTML_QuickForm_Controller + DB实现

* @author jxyuhua at gmail.com

* @date 2005-02-25

*/

require_once 'HTML/QuickForm/Controller.php';

require_once 'HTML/QuickForm/Action/Display.php';

require_once 'Connect.php';//自定义的数据连接文件

session_start();

/**

* 从数据库中判断用户(email)是否已经存在

*/

function checkUser($fields) {

global $db;

$sql = "select count(*) from userinfo where email = '" . $db->escapeSimple($fields['email']) . "'";

$number = $db->getOne($sql);

if(DB::isError($db)) {

die($db->getMessage());

}

if($number == 1) {

Return array('email' => '此Email已经存在,请重新输入!');

}

Return TRUE;

}

/**

* 基本信息页面

*/

class Page_Register_First extends HTML_QuickForm_Page

{

function buildForm()

{

$this->_formBuilt = true;

$this->addElement('header', null, '用户注册--基本资料');

$this->addElement('text', 'email', '用户ID(EMAIL):', array('size' => 20, 'maxlen' => 30));

$this->addElement('password', 'password1', '密码:', array('size' => 20, 'maxlen' => 20));

$this->addElement('password', 'password2', '重复输入密码:', array('size' => 20, 'maxlen' => 30));

$this->addElement('submit', 'submit', '下一步 >>');

$this->applyFilter('email', 'trim');

$this->addRule('email', '请输入正确的Email地址', 'required');

$this->addRule('password1', '密码最少应该为6位数字', 'required');

$this->addRule('password2', '密码最少应该为6位数字', 'required');

$this->addRule('email', '请输入正确的EMAIL地址', 'email');

$this->addRule('password1', '密码最少应该为6位数字', 'minlength', 6);

$this->addRule(array('password1', 'password2'), '2次输入的密码不相同,请重新输入', 'compare');

//$this->registerRule('email', 'function', 'checkUser');

//$this->addRule('email', 'Email已经存在,请重新选择', 'email');

$this->addFormRule('checkUser');

$this->setDefaultAction('next');

}

}

/**

* 详细资料页面

*/

class Page_Register_Second extends HTML_QuickForm_Page

{

function buildForm()

{

$this->_formBuilt = true;

$country = array('1' => '中国', '2' => '日本', '3' => '美国', '4' => '英国', '0' => '其它');

$city = array('1' => '北京', '2' => '广东', '3' => '江西', '0' => '其它');

$industry = array('1' => '学生', '2' => '科研机构', '3' => 'IT产业', '0' => '其它');

$from = array('1' => '网吧', '2' => '单位', '3' => '家里', '0' => '其它');

$this->addElement('header', null, '用户注册--详细资料');

$this->addElement('text', 'alias', '呢称:', array('size' => 20, 'maxlen' => 30));

$this->addElement('text', 'question', '密码提示问题:', array('size' => 30, 'maxlen' => 30));

$this->addElement('text', 'answer', '密码提示答案:', array('size' => 30, 'maxlen' => 30));

$this->addElement('textarea', 'description', '个人描述信息:', array('rows' => 3, 'cols' => 50, 'class' => 'textBox'));

$radio[] = &$this->createElement('radio', null, null, '以下信息对不外公开', '1');

$radio[] = &$this->createElement('radio', null, null, '以下信息对外公开', '0');

$this->addGroup($radio, 'secret');

$this->addElement('text', 'idnumber', '证件号码:', array('size' => 30, 'maxlength' => 30));

$radio2[] = $this->createElement('radio', 'idtype', null, '身份证', null, array('value' => 1, 'checked' => 'true'));

$radio2[] = $this->createElement('radio', 'idtype', null, '其它证件', null, array('value' => 2));

$this->addGroup($radio2);

$this->addElement('text', 'realname', '真实姓名:', array('size' => 20, 'maxlength' => 30));

$this->addElement('select', 'gender', '性别:', array('male' => '男', 'female' => '女'));

$this->addElement('date', 'date', '出生于:', array('format' => 'Y 年m 月d', 'minYear' => 1940, 'maxYear' => 1995));

$this->addElement('select', 'country', '所在国家:', $country);

$this->addElement('select', 'city', '省(市):', $city);

$this->addElement('text', 'town', '市(县):', array('size' => 20, 'maxlength' => 20));

$this->addElement('text', 'address', '联系地址:', array('size' => 50, 'maxlength' => 50));

$this->addElement('text', 'zipcode', '邮政编码:', array('size' => 20, 'maxlength' => 20));

$this->addElement('text', 'phone', '联系电话:', array('size' => 20, 'maxlength' => 20));

$this->addElement('text', 'company', '所在单位:', array('size' => 30, 'maxlength' => 30));

$this->addElement('text', 'department', '所在部门:', array('size' => 20, 'maxlength' => 20));

$this->addElement('select', 'industry', '所在行业:', $industry);

$this->addElement('select', 'source', '主要在哪里<br />访问我们的网站:', $from);

$this->addElement('text', 'webpage', '个人主页:', array('size' => 50, 'maxlength' => 50));

$prevnext[] =& $this->createElement('submit', $this->getButtonName('back'), '<< 返回');

$prevnext[] =& $this->createElement('submit', $this->getButtonName('next'), '注册');

$this->addGroup($prevnext, 'buttons', '', '&nbsp;', false);

$this->addRule('alias', '用户登录昵称必须填写!!', 'required');

$this->addRule('question', '请填写密码提示问题', 'required');

$this->addRule('answer', '请填写密码提示答案', 'required');

$this->addRule('idnumber', '请填写证件号码', 'required');

$this->addRule('realname', '请填写真实姓名', 'required');

$this->addRule('description', '个人描述不能超过255个字符', 'maxlength', 255);

$this->addRule('gender', '性别不能为空', 'required');

$this->addRule('born', '出生日期不能为空', 'required');

$this->addRule('country', '国家不能为空', 'required');

$this->addRule('city', '城市不能为空', 'required');

$this->addRule('address', '请填写你的联系地址', 'required');

$this->addRule('idnuber', '证件号码不能少于5位', 'minlength', 5);

$this->addRule('idnuber', '证件号码只能是英文字母或数字', 'alphanumeric');

$this->setDefaultAction('next');

}

}

/**

* 页面显示模板

*/

class Action_Display extends HTML_QuickForm_Action_Display

{

function _renderForm(& $page)

{

$renderer =& $page->defaultRenderer();

$page->setRequiredNote('<font color="#FF0000">*</font> 为必填项.');

$renderer->setHeaderTemplate(<<<_HTML

<tr>

<td style="white-space: nowrap; background-color: #CCCCCC;" align="center" valign="top" colspan="2"><b>{header}</b></td>

</tr>

_HTML

);

$renderer->setFormTemplate(<<<_HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>用户注册</title>

<link rel="stylesheet" href="css.css" />

</head>

<body>

<form{attributes}>

<table border="0" cellspacing="1" cellpadding="0" class="table1" align="center">

{content}

</table>

</form>

</body>

</html>

_HTML

);

$renderer->setElementTemplate(<<<_HTML

<tr>

<td align="right" valign="top" class="td7"><!-- BEGIN required --><span style="color: #ff0000">*</span><!-- END required -->{label}</td>

<td valign="top" align="left" class="td8"><!-- BEGIN error --><span style="color: #ff0000">{error}</span><br /><!-- END error --> {element}</td>

</tr>

_HTML

);

$page->accept($renderer);

echo $renderer->toHtml();

}

}

/**

* 处理注册(存入数据库)

*/

class Action_Process extends HTML_QuickForm_Action

{

function perform(&$page, $actionName)

{

global $db;

$values = $page->controller->exportValues();

//insert into db

$table_name = 'userinfo';

$fields_values = array(

'email' => $values['email'],

'pass' => $values['password1'],

'alias' => $values['alias'],

'realname' => $values['realname'],

'question' => $values['question'],

'answer' => $values['answer'],

'description' => $values['description'],

'secret' => $values['secret'],

'idnumber' => $values['idnumber'],

'idtype' => $values['idtype'],

'gender' => $values['gender'],

'born' => implode('-', $values['date']),

'country' => $values['country'],

'city' => $values['city'],

'town' => $values['town'],

'address' => $values['address'],

'zipcode' => $values['zipcode'],

'phone' => $values['phone'],

'company' => $values['company'],

'department' => $values['department'],

'industry' => $values['industry'],

'come' => $values['source'],

'website' => $values['webpage']);

$res = $db->autoExecute($table_name, $fields_values, DB_AUTOQUERY_INSERT);

if (PEAR::isError($res)) {

echo($res->getMessage());

session_unset();

header('location:' . $_SERVER['PHP_SELF']);

} else {

session_unset();

header('Location:welcome.htm');

}

}

}

$register = & new HTML_QuickForm_Controller('register', true);

$register->addPage(new Page_Register_First('reg1'));

$register->addPage(new Page_Register_Second('reg2'));

$register->setDefaults(array('idtype' => 1,

'secret' => 1));

$register->addAction('display', new Action_Display());

$register->addAction('process', new Action_Process());

$register->run();

?>

我也是摸着石头过河,大家要有兴趣,可以和我讨论。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有