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', '', ' ', 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();
?>
我也是摸着石头过河,大家要有兴趣,可以和我讨论。