关键字
文章内容
实例操作:PEAR的HTML_QuickForm7应用
 
 
修改时间:[2012/05/06 06:51]    阅读次数:[1163]    发表者:[起缘]
 

    【PHPChina讯】程序员们往往被告之不要去重复地编写程序, 而且最好的程序员在写他们自己的程序的时候都会借鉴别人的。javascript:;" onClick="javascript:tagshow(event, 'PHP');" target="_self">PHP,作为一个基本的Web语言,常见于form的显示,处理和验证(确认)。然而,有一个强大的PEAR包需要更多的关注:它就是HTML_QuickForm,它促使图的提交和form的显示,而且更有用的是,客户端和服务器端都能够得到验证,即快又简单。这篇文章会让你了解PEAR包的基本知识。他假定你已有HTML表格基础,并且有基本的PHP技能。

    安装HTML_QuickForm

    安装PEAR包只需要两个条件:PHP4.2版本以上,并且有HTML_Common包。现在为止HTML_QuickForm 3.2.7是最新的版本,它需要对应的HTML_Common 1.2.1。有人在为PHP5写这两个包(以HTML_QuickForm2和 HTML_Common2的形式),但是还没有发布。

    你可以通过以下pear list检查PEAR是否已经安装:
pear list
Installed packages:
===================
Package        Version State
Archive_Tar     1.1     stable
Console_Getopt 1.2     stable
DB               1.6.2   stable
Date            1.4.6   stable
HTTP            1.2.2   stable
Image_Canvas   0.3.0   alpha
Image_Color    1.0.2   stable
Image_Graph    0.7.2   alpha
Mail            1.1.3   stable
Net_SMTP       1.2.6   stable
Net_Socket     1.0.1   stable
PEAR           1.3.2   stable
Validate       0.6.3   beta
XML_Parser     1.0.1   stable
XML_RPC        1.1.0   stable

    从以上可以知道,你的机器即没有HTML_QuickForm 也没有 HTML_Common,所以它们需要被安装:
pear install HTML_Common
downloading HTML_Common-1.2.3.tgz ...
Starting to download HTML_Common-1.2.3.tgz (4,746 bytes)
.....done: 4,746 bytes
install ok: HTML_Common 1.2.3

pear install HTML_QuickForm
downloading HTML_QuickForm-3.2.7.tgz ...
Starting to download HTML_QuickForm-3.2.7.tgz (102,475 bytes)
........................done: 102,475 bytes
install ok: HTML_QuickForm 3.2.7
 
    显示form

    使用代码去显示一个表单很简单,让我们以一个例子开始:
<?php
 require_once "HTML/QuickForm.php"; // tell PHP to include the QuickForm package

  $form = new HTML_QuickForm('register', 'post');  // instantiate the object
  $form->addElement('text', 'firstName', 'Enter first name'); // add a text element
  $form->addElement('password','password', 'Enter your password'); // add a password element
  $form->addElement('textarea','ta','Description'); // add a textarea element
  $form->addElement('submit','sb','Submit form'); // add a submit button element

  $form->display();
?>


    很明了这小段代码的意思:包的引入,对象的示例,然后加入元素(称作FirstName的:在它之后输入你的first name;password:在它之后输入你的password。)下面是HTML代码的样子:
<form action="/phpbuilder/html_quickform11.php" method="post" name="register" id="register">
<div>
<table border="0">

 <tr>
  <td align="right" valign="top"><b>Enter first name</b></td>
  <td valign="top" align="left"> <input name="firstName" type="text" value="" /></td>
 </tr>
 <tr>

  <td align="right" valign="top"><b>Enter your password</b></td>
  <td valign="top" align="left"> <input name="password" type="password" value="" /></td>
 </tr>
 <tr>
  <td align="right" valign="top"><b>Description</b></td>
  <td valign="top" align="left"> <textarea name="ta"></textarea></td>

 </tr>
 <tr>
  <td align="right" valign="top"><b></b></td>
  <td valign="top" align="left"> <input name="sb" value="Submit form" type="submit" /></td>

 </tr>
</table>
</div>
</form>


    因为你可以看到HTML_QuickForm允许你能够用更少的输入去得到同样的输出,所以即使没有其他的益处,它至少能节约你的一些时间(虽然在这个例子里我并没有介绍它!)。它同样加入了XHTML Strict-compliant(除了一点小例外是关于名字属性的遗留,这可以很容易地去除)。以上例子利用了一个text,一个textarea和一个password元素。以下有一个关于其它可添加的HTML_QuickForm 元素的列表,包括HTML_QuickForm 名称,和HTML equivalent。他们都给定为straighforward names,所以,如果你了解HTML,你就会理解它们:
element HTML
button <input type="button" />
checkbox <input type="checkbox" />
file <input type="file" />
hidden <input type="hidden" />
image <input type="image" />
password <input type="password" />
radio <input type="radio" />
reset <input type="reset" />
select <select>. The <option> elements can be loaded from either an array or a database.
submit <input type="submit" />
text <input type="text" />
textarea <textarea>
xbutton <button>

    还有许多常见的元素类型,我们不打算在这个指南里全做例子,作为参考把他们列出来:
advcheckbox An advanced checkbox type, allowing checkboxes to pass multiple values.
autocomplete A text field with autocomplete. It's a normal text element, but at each keypress JavaScript is used to read an array and autocomplete if there's anything matching.
date A group of elements for inputting dates and times
group Allows several elements to be grouped into a single new entity.
header Allows a heading to be added to the form.
hiddenselect A select element containing hidden elements for everything already selected with the methods setDefaults() or setConstants().
hierselect A select element where choosing one item from the first select will dynamically populate a linked second select element.
html Used to be used for adding raw HTML to a form, it's now deprecated.
link A link type field
static Static data


    确认data

    你已经发现了,我们在以前并没有太多的举例submit按钮事件。如果你查看form作用属性,你会发现相同的脚本命名。为了让使用更简单,HTML_QuickForm 自带参考,所以,同样的脚本是为了生成form,验证它,并且成功之后处理它。为了促使事件发生,我们需要添加logic去处理提交表单,并且确认数据。
验证是许多开发者的弱项,但是HTML_QuickForm使无论在客户端还是在服务器端的验证都非常的简单。它能做到这些是通过addRule()方式,之后,执行验证,用validate()方式。我们现在只能显示没有被验证的表单(因为在这个时候处理表单的代码能够被访问)。一切都很简单!这个例子有两个规则,一个是first name是必须填写的内容,第二个是first name必须只包含字母(并且不能是符号,所以就使得提交申请的人认真对待!):
<?
  require_once "HTML/QuickForm.php";

  $form = new HTML_QuickForm('register', 'post');
  $form->addElement('text', 'firstName', 'Enter first name');
  $form->addElement('password','password', 'Enter your password');
  $form->addElement('textarea','ta','Description');
  $form->addElement('submit','sb','Submit form');

  $form->addRule('firstName', 'Your name is required', 'required');
  $form->addRule('firstName', 'Your name can only contain letters','lettersonly');

  if ($form->validate()) {
    // processing code goes here.
    echo 'Success!';
  }
  else {
    $form->display();
  }
?>

    试着去看看当你用无效数据提交这个表单时会发生什么,然后用有效数据试一次,一个红色的*指出first name是需要填写的。如果数据被不正确地填写(左边有空格,或有除了字母以外的其他符号)一个适当的出错信息会用红色显示出来。
以上例子应用了required和lettersonly规则。以下列出了可被应用到的所有的规则:
rule argument description
alphanumeric   Can only contain alphanumeric characters (letters and numbers).
compare   Compares two values.
email true (which applies a DNS check) Must be a valid email (in syntax) (checks for a valid hostname if the argument is set to true).
filename $regex The filename of the uploaded file must match the regular expression in $regex.
lettersonly   Can only contain letters.
maxfilesize $maxsize The filename of the uploaded file cannot be larger than $maxsize bytes.
maxlength $maxlength Can be at most $maxlength characters in length.
mimetype $mimetype MIME type of the uploaded file must either be of type $mimetype (if $mimetype is scalar), or match one of the elements in $mimetype (if it's an array).
minlength $minlength Must be at least $minlength in length.
numeric   Must contain a valid integer or decimal number.
nonzero   Cannot be zero.
nopunctuation   Cannot contain any punctuation characters, which include: ( ) . / * ^ ? # ! @ $ % + = , " ' > < ~ [ ] { }.
rangelength $minlength,$maxlength Must be inclusively between $minlength and $maxlength characters in length.
regex $regex Must match the regular expression $regex.
required   Cannot be blank
uploadedfile   Must contain a successfully uploaded file.

    让我们看看一些例子和特列。一个非常有用的特列是,你也可以在客户端验证,用"client"标记。在客户端进行验证是很好的做法,因为可使得用户的使用更加的简单(他们不需要等待服务器的应答),但是你通常还是需要在服务器端进行验证,因为并不是所有客户端都有JavaScript激活功能。我们同样着眼于comparison规则(在这个例子中两个空格不能一样),和一个custom规则,它允许你用你的想要的标准去写一个函数:
<?
  require_once "HTML/QuickForm.php";

  $form = new HTML_QuickForm('register', 'post');
  $form->addElement('text', 'firstName', 'Enter first name');
  $form->addElement('password','password', 'Enter your password');
  $form->addElement('text','customer_email','Enter an email');
  $form->addElement('textarea','ta','Description');
  $form->addElement('submit','sb','Submit form');

  $form->addRule('firstName', 'Your name is required', 'required');
$form->addRule('firstName', 'Your name can only contain letters','lettersonly');
  $form->addRule('firstName', 'You must enter a first name', 'required', null, 'client');
  $form->addRule('firstName', 'Your name cannot be less than two characters!','minlength',2,'client');
  $form->addRule('customer_email', 'Please enter a valid email','email',true,'client');
  $form->AddRule(array('password','firstName'),'Your password and first name cannot be the same!','compare','!=');
 
  $form->registerRule('no_symbol','function','no_symbol_f');
  $form->addRule('firstName','Sorry, your name cannot be Symbol','no_symbol');

  if ($form->validate()) {
    // processing code goes here.
    echo 'Success!';
  }
  else {
    $form->display();
  }
 
  function no_symbol_f($element_name,$element_value) {
    if ($element_value == 'Symbol') {
      return false;
    }
    else {
      return true;
    }
  }

?>

    以下是所要产生:
<script type="text/javascript">
//<![CDATA[
function validate_register(frm) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  _qfMsg = '';

  value = frm.elements['firstName'].value;
  if (value == '' && !errFlag['firstName']) {
    errFlag['firstName'] = true;
    _qfMsg = _qfMsg + '\n - You must enter a first name';
  }

  value = frm.elements['firstName'].value;
  if (value != '' && value.length < 2 && !errFlag['firstName']) {
    errFlag['firstName'] = true;
    _qfMsg = _qfMsg + '\n - Your name cannot be less than two characters!';
  }

  value = frm.elements['customer_email'].value;
  var regex = /^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/;
  if (value != '' && !regex.test(value) && !errFlag['customer_email']) {
    errFlag['customer_email'] = true;
    _qfMsg = _qfMsg + '\n - Please enter a valid email';
  }

  if (_qfMsg != '') {
    _qfMsg = 'Invalid information entered.' + _qfMsg;
    _qfMsg = _qfMsg + '\nPlease correct these fields.';
    alert(_qfMsg);
    return false;
  }
  return true;
}
//]]>
</script>

<form action="/phpbuilder/html_quickform33.php" method="post" name="register" id="register" onsubmit="try { var myValidator = validate_register; } catch(e) { return true; } return myValidator(this);">
<div>
<table border="0">

 <tr>
  <td align="right" valign="top"><span style="color: #ff0000">*</span><b>Enter first name</b></td>
  <td valign="top" align="left"> <input name="firstName" type="text" /></td>

 </tr>
 <tr>
  <td align="right" valign="top"><b>Enter your password</b></td>
  <td valign="top" align="left"> <input name="password" type="password" /></td>
 </tr>
 <tr>
  <td align="right" valign="top"><b>Enter an email</b></td>

  <td valign="top" align="left"> <input name="customer_email" type="text" /></td>
 </tr>
 <tr>
  <td align="right" valign="top"><b>Description</b></td>
  <td valign="top" align="left"> <textarea name="ta"></textarea></td>
 </tr>
 <tr>

  <td align="right" valign="top"><b></b></td>
  <td valign="top" align="left"> <input name="sb" value="Submit form" type="submit" /></td>
 </tr>
 <tr>
  <td></td>
 <td align="left" valign="top"><span style="font-size:80%; color:#ff0000;">*</span><span style="font-size:80%;"> denotes required field</span></td>
 </tr>

</table>
</div>
</form>

    在这个例子中,compare规则允许其他操作者使用非等(!=),或者<or>。如果你把操作者一起省去,它被假定为=,意思是这两个元素都必须相同(特别地适合去检查用户输入的密码或邮件地址是否正确)


    处理表单数据

    迄今为止,我们已经简单地成功显示了!如果表单已经被验证。虽然它看起来并不是特别的优秀。HTML_QuickForm 提供一个process()方式,它调用一个函数并审核提交值。以下是操作方式:
<?
  require_once "HTML/QuickForm.php";

  $defaults_= array("firstName"=>"Ian",
                 "password"=>"abc",
                 "ta"=>"Describe yourself here");

  $form = new HTML_QuickForm('register', 'post');
  $form->addElement('text', 'firstName', 'Enter first name');
  $form->addElement('password','password', 'Enter your password');
  $form->addElement('textarea','ta','Description');
  $form->addElement('submit','sb','Submit form');

  $form->addRule('firstName','Your name is required', 'required');

  if ($form->validate()) {
    // processing code goes here.
    $form->process('process_data', false);
  }
  else {
    $form->setDefaults($defaults);
    $form->display();
  }

  // For now just display the submitted vales, but you'll want to do a lot more
  function process_data ($values) {
    foreach ($values as $key=>$value) {
      echo $key."=".$value."<br>";
    }
  }
?>


    格式化表单

    早期的HTML_QuickForm版本在改变layout的时候并没有那么灵活。但是,从3.0版本开始基于有 众所周知的Visitor设计样式。有8个renderer可用,而且有以下这些模板引擎直接支持:Smarty, HTML_Template_Sigma, HTML_Template_IT,HTML_Template_Flexy。要查看这些各式的renderer和模板引擎的细节必须在这篇文章之外,不过,在接下来的例子中简要地说明了HTML_QuickForm能够充分地定制你的表单输出。我的例子是凭空想象的,所以你一定要自己试试效果!确信无疑的是,如果你特别熟悉一个模板引擎,你会发现很快就能利用它。
<?
  require_once "HTML/QuickForm.php";

  $defaults_= array("firstName"=>"Ian",
                 "password"=>"abc",
                 "ta"=>"Describe yourself here");

  $form = new HTML_QuickForm('register', 'post');
  $form->addElement('text', 'firstName', 'Enter first name');
  $form->addElement('password','password', 'Enter your password');
  $form->addElement('textarea','ta','Description');
  $form->addElement('submit','sb','Submit form');

  $form->addRule('firstName','Your name is required', 'required');

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

  $special_element_template='
<tr>
  <td align="right" valign="top">
    <!-- BEGIN required --><span style="color: magenta">*</span><!-- END required -->
    <font size="+22">{label}</font>
  </td>
    <td valign="top" align="left">
    <!-- BEGIN error --><span style="color: magenta">{error}</span><br /><!-- END error -->
  {element}</td>
</tr>';

  $renderer->setElementTemplate($special_element_template);

  if ($form->validate()) {
    // processing code goes here.
    echo 'Success!';
  }
  else {
    $form->setDefaults($defaults);
    $form->display();
?>


    结论

    我确信你会发现它很容易使用,有关于这个包的更多的东西在官方的HTML_QuickForm(链接http://pear.php.net/manual/en/package.html.html-quickform.php)页面上,有API和更多的PEAR包,还有用户文档。而且不要忘记当HTML_QuickForm2发布的时候,去查看这个包关于PHP5东西。

    原文地址:http://www.phpbuilder.com/columns/ian_gilfillan20061024.php3?page=2