我注意到许多(大多数?)人在使用Zend Framework时会在Form类本身中添加装饰器和标签.
class User_Form_Add extends Zend_Form
{
public function init()
{
parent::init();
$username = new Zend_Form_Element_Text('username');
$username->setLabel('Username:')
->setRequired(true)
->addFilter('StringTrim')
->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30))
->setDecorators(array(
'ViewHelper',
array('Description', array('tag' => 'p', 'class' => 'description')),
array('Label', array('requiredPrefix' => '<span class="asterisk">*</span> ', 'escape' => false)),
array('HtmlTag', array('tag' => 'p', 'class' => 'element'))
));
}
}
但这肯定不是好习惯吗?我原以为装饰器和标签是MVC应用程序中视图层的一部分.当我查看这个表单类时,它看起来很“混乱”了应该在视图层中的各种标记,标记和文本.
这种方法意味着如果您需要使用表单的标记,则需要使用表单类和视图.
我不喜欢这个概念,因此在渲染表单时将表单和装饰器分离为实际的视图脚本.我希望将我的申请中这些相互矛盾的“问题”分开.
class User_Form_Add extends Zend_Form
{
public function init()
{
parent::init();
$username = new Zend_Form_Element_Text('username');
$username->setRequired(true)
->addFilter('StringTrim')
->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30));
}
}
//add.phtml:
$this->form->username->setLabel('Username:');
$this->form->username->setDecorators(array(
'ViewHelper',
array('Description', array('tag' => 'p', 'class' => 'description')),
array('Label', array('requiredPrefix' => '<span class="asterisk">*</span> ', 'escape' => false)),
array('HtmlTag', array('tag' => 'p', 'class' => 'element'))
));
echo $this->form->render();
这使表单类变得干净,并且非常类似于模型类 – 这就是我对表单类的理解;它包含过滤器,验证器等,它们都与业务逻辑相关.
如果您接着使用这种方法,则可以更轻松地将表单与模型集成,以便您可以直接从模型中重用/访问表单验证器和过滤器 – 而无需创建装饰器的开销,也不会产生任何不正常之处.
http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html
至于保持您的视图脚本DRY,这样您就不会在多个视图中重复相同的标签和装饰器(即,当您需要多次渲染相同的表单,但在不同的视图脚本中)时,我发现您可以将其分开表单的可用部分使用ViewScript装饰器来保持DRY.
编辑:同样,我们也可以使用适合我们项目的默认装饰器覆盖默认装饰器,以避免必须首先声明装饰器.
所以我的实际问题是:
为什么没有其他人像这样使用他们的表格?你对这种方法有什么缺点?
如果我可以在视图层中轻松添加装饰器和表单标签,为什么要在表单类中创建装饰器和表单标签?
我不明白为什么我看到的Zend_Form的几乎所有用法都包括在表单类本身中添加装饰器/标签.
最佳答案
Why isn’t anyone else working with their forms like this?
我没想过.非常好的方法.