Zend_Form 快速起步
本快速起步指南覆盖使用 创建表单对象
创建表单对象非常简单:只要实现 <?php $form = new Zend_Form; ?>
对于高级用例,需要创建
如果想指定表单的动作和方法(总是好主意),用 <?php
$form->setAction('/resource/process')
->setMethod('post');
?>上述代码设置表单动作为部分 URL "/resource/process" 和表单方法为 HTTP POST,这将在解析的最后期间表现出来。
你可以通过使用 setAttrib() 或 setAttribs() 方法为 <?php
$form->setAttrib('id', 'login');
?>添加表单元素
没有元素,表单就什么都不是。
有两个方法添加表单元素:实例化具体的元素并传递这些对象,或者传递元素类型并使 一些例子: <?php
// Instantiating an element and passing to the form object:
$form->addElement(new Zend_Form_Element_Text('username'));
// Passing a form element type to the form object:
$form->addElement('text', 'username');
?>
缺省地,这些没有校验器和过滤器,你需要用最基本的校验器和可能的过滤器来配置元素。有三个方法:(a) 在传递元素给表单之前,(b) 通过用
让我们首先看看为一个具体的元素实例创建校验器。可以传递 <?php
$username = new Zend_Form_Element_Text('username');
// Passing a Zend_Validate_* object:
$username->addValidator(new Zend_Validate_Alnum());
// Passing a validator name:
$username->addValidator('alnum');
?>当使用第二个方法,如果校验器可接受构造器参数,可以把它们放到数组里作为第三个参数: <?php
// Pass a pattern
$username->addValidator('regex', false, array('/^[a-z]/i'));
?>(第二个参数用来指示是否这个校验失败时停止后面的校验,缺省为 false。) 你也可能希望指定一个必需的元素,可以通过使用访问器或当创建该元素时传递一个选项来完成,在前面的例子中: <?php // 使这个元素成为必需: $username->setRequired(true); ?> 当一个元素是必需的,一个 'NotEmpty' 校验器被添加到校验器链的顶部,确保该元素有一个值。 过滤器会像校验器一样注册,为了演示,让我们添加一个来把最终值变小写的过滤器: <?php
$username->addFilter('StringtoLower');
?>这样,最终元素设置看起来像这样: <?php
$username->addValidator('alnum')
->addValidator('regex', false, array('/^[a-z]/'))
->setRequired(true)
->addFilter('StringToLower');
// or, more compactly:
$username->addValidators(array('alnum',
array('regex', false, '/^[a-z]/i')
))
->setRequired(true)
->addFilters(array('StringToLower'));
?>
就算这样简单,在表单中为每个元素都做这样的工作也是单调乏味的。让我们试一试上述的方法(b),当使用工厂模式 <?php
$form->addElement('text', 'username', array(
'validators' => array(
'alnum',
array('regex', false, '/^[a-z]/i')
),
'required' => true,
'filters' => array('StringToLower'),
));
?>
解析(Render)表单
解析表单很简单,大部分元素使用 <?php // Explicitly calling render(), and passing an optional view object: echo $form->render($view); // Assuming a view object has been previously set via setView(): echo $form; ?>
缺省地, <?= $this->form ?>
在内部, <?php
$element->addDecorators(array(
'ViewHelper',
'Errors',
array('HtmlTag', array('tag' => 'dd')),
array('Label', array('tag' => 'dt')),
));
?>( <HELPERNAME> 是视图助手的名称,并根据元素不同而不同) 上述的例子创建的输出如下:
<dt><label for="username" class="required">Username</dt>
<dd>
<input type="text" name="username" value="123-abc" />
<ul class="errors">
<li>'123-abc' has not only alphabetic and digit characters</li>
<li>'123-abc' does not match against pattern '/^[a-z]/i'</li>
</ul>
</dd>
(虽然没有使用相同的格式。) 如果你想输出不同的东西,可以修改由元素使用的装饰器,参见装饰器一节有更多内容。
表单循环检查所有元素,并把它们放到 HTML 元素或者按注册的顺序循环,或者如果元素包含顺序属性,就按这个顺序循环。可以使用下列方法设置元素顺序: <?php $element->setOrder(10); ?> 或者,当创建元素,作为一个选项传递给它: <?php
$form->addElement('text', 'username', array('order' => 10));
?>检查表单是否有效表单提交之后,需要检查它是否能通过校验。每个元素根据提供的数据来检查,如果匹配元素名的键没有出现,并该条目被标记为必需,就用 null 值来校验。
数据从哪里来?用 <?php
if ($form->isValid($_POST)) {
// success!
} else {
// failure!
}
?>
用 AJAX 请求, 有时候可以侥幸成功校验单个元素或一组元素。 <?php
if ($form->isValidPartial($_POST)) {
// elements present all passed validations
} else {
// one or more elements tested failed validations
}
?>
一个可选的方法, 假设校验都通过,现在就可以取得过滤后的值: <?php $values = $form->getValues(); ?> 如果任何时候需要没有过滤的值,使用: <?php $unfiltered = $form->getUnfilteredValues(); ?> 获得错误状态如果表单校验失败,在大多数情况下,可以再次解析表单,如果使用了缺省的装饰器,错误信息就会显示出来: <?php
if (!$form->isValid($_POST)) {
echo $form;
// or assign to the view object and render a view...
$this->view->form = $form;
return $this->render('form');
}
?>
如果想插入错误消息,有两个方法: 放到一起来创建一个简单的登录表单,我们需要这些元素:
让我们假设有效的用户名应当只是字母数字字符,以字母开头,最少 6 个字符,最长 20 个字符,最后格式化成小写;密码最少 6 个字符,当完成这些,我们就提交,保持未校验。
我们使用 <?php
$form = new Zend_Form();
$form->setAction('/user/login')
->setMethod('post');
// Create and configure username element:
$username = $form->createElement('text', 'username');
$username->addValidator('alnum')
->addValidator('regex', false, array('/^[a-z]+/'))
->addValidator('stringLength', false, array(6, 20))
->setRequired(true)
->addFilter('StringToLower');
// Create and configure password element:
$password = $form->createElement('password', 'password');
$password->addValidator('StringLength', false, array(6))
->setRequired(true);
// Add elements to form:
$form->addElement($username)
->addElement($password)
// use addElement() as a factory to create 'Login' button:
->addElement('submit', 'login', array('label' => 'Login'));
?>接着,我们将创建控制器来处理这些: <?php
class UserController extends Zend_Controller_Action
{
public function getForm()
{
// create form as above
return $form;
}
public function indexAction()
{
// render user/form.phtml
$this->view->form = $this->getForm();
$this->render('form');
}
public function loginAction()
{
if (!$this->getRequest()->isPost()) {
return $this->_forward('index');
}
$form = $this->getForm();
if (!$form->isValid($_POST)) {
// Failed validation; redisplay form
$this->view->form = $form;
return $this->render('form');
}
$values = $form->getValues();
// now try and authenticate....
}
}
?>和一个视图脚本来显示表单: <h2>Please login:</h2> <?= $this->form ?>
注意在控制器代码中,还有很多需要做:例如在提交后,需要用 使用 Zend_Config 对象
所有 [development] ; general form metainformation user.login.action = "/user/login" user.login.method = "post" ; username element user.login.elements.username.type = "text" user.login.elements.username.options.validators.alnum.validator = "alnum" user.login.elements.username.options.validators.regex.validator = "regex" user.login.elements.username.options.validators.regex.options.pattern = "/^[a-z]/i" user.login.elements.username.options.validators.strlen.validator = "StringLength" user.login.elements.username.options.validators.strlen.options.min = "6" user.login.elements.username.options.validators.strlen.options.max = "20" user.login.elements.username.options.required = true user.login.elements.username.options.filters.lower.filter = "StringToLower" ; password element user.login.elements.password.type = "password" user.login.elements.password.options.validators.strlen.validator = "StringLength" user.login.elements.password.options.validators.strlen.options.min = "6" user.login.elements.password.options.required = true ; submit element user.login.elements.submit.type = "submit" 接着,你可以把它传递给表单构造器: <?php $config = new Zend_Config_Ini($configFile, 'development'); $form = new Zend_Form($config->user->login); ?> 整个表单就定义好了。 结论
希望通过这个小教程,你能接触和理解
|