Zend Framework中Zend_Form浅析

Zend_Form组件的使用容易出现VC(View,Controller)的强耦合,这实在是个大问题,下面举例说明应该怎样合理使用Zend_Form:

假设我们要实现一个用户登陆的表单,其代码大致情况如下:

控制器:
[php]
$form = new Zend_Form;

$form->setMethod(‘post’);

$username = new Zend_Form_Element_Text(‘username’);
$username->setLabel(‘Username’)->setRequired(true)->addValidator(‘NotEmpty’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setLabel(‘Password’)->setRequired(true)->addValidator(‘NotEmpty’);

$submit = new Zend_Form_Element_Submit(‘submit’);

$form->addElements(array($username, $password, $submit));

$form->clearDecorators();

$form->addDecorator(‘FormElements’)
->addDecorator(‘HtmlTag’, array(‘tag’ => ‘ul’))
->addDecorator(‘Form’);

$form->setElementDecorators(array(
array(‘ViewHelper’),
array(‘Errors’),
array(‘Description’),
array(‘Label’, array(‘separator’=>’ ‘)),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’element-group’)),
));

$submit->setDecorators(array(
array(‘ViewHelper’),
array(‘Description’),
array(‘HtmlTag’, array(‘tag’ => ‘li’, ‘class’=>’submit-group’)),
));

if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}

$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form;
[/php]
这是Zend_Form最一般的用法,从这个典型的例子中我们能很容易的发现表单的渲染是在控制器中完成的,从理论上来说,类似Label,Decorator(如上红色部分)这样的代码本质上属于视图的范畴,不应该出现在控制器中,而且,视图需求向来是复杂多变的,很难在控制器里处理。幸运的是,Zend_Form有一个Zend_Form_Decorator_ViewScript方案,可以比较完美的解决这些问题:

修改后的代码如下:

控制器:
[php]
$form = new Zend_Form;

$form->setMethod(‘post’);

$username = new Zend_Form_Element_Text(‘username’);
$username->setRequired(true)->addValidator(‘NotEmpty’);

$password = new Zend_Form_Element_Password(‘password’);
$password->setRequired(true)->addValidator(‘NotEmpty’);

$submit = new Zend_Form_Element_Submit(‘submit’);

$form->addElements(array($username, $password, $submit));

if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getPost())) {
// success …
} else {
$form->populate($this->_request->getPost());
}
}

$this->view->form = $form;
[/php]
视图:
[php]
echo $this->form->setDecorators(array(
array(‘ViewScript’, array(‘viewScript’ => ‘/path/to/viewscript.phtml’))
))->render();
[/php]

viewscript.phtml:
[html]



[/html]
可以看到,通过使用ViewScript,在不影响现有功能的情况下,我们将表现逻辑相关代码完整的剥离了出来,当然,这里还有一些细节可以改进,比如说控制器中的Form代码可以集中写在一个Form类中,还有表单的生成可以结合使用Zend_View_Helper_Form*相关助手等等。
分享到:



发表评论

邮箱地址不会被公开。