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

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
();
?>

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



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=301732

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值