我宁愿不处理装饰器,因为我的表单设计不是很直接,但我想保留验证表单的功能。
所以我设置了子窗体正常工作的位置,但是当我尝试在我的视图中手动设置样式时,我得到的名称没有父窗体。我见过其他相似的帖子,但我还没有找到解决方案。
示例:
这是我的视图脚本
<?php echo $this->form->username->renderViewHelper();?>
<input type="text" value="" id="username" name="username">
渲染时。它应该是
<input type="text" value="" id="form1-username" name="form1[username]">
我如何获得form1部分?
谢谢!
好的,所以我找到了一种方法。
通过使用belongsTo,它可以工作:
$form1->addElements(array(
new Zend_Form_Element_Text('username', array(
'belongsTo' => 'form1',
'required' => true,
'label' => 'Username:',
'filters' => array('StringTrim', 'StringToLower'),
'validators' => array(
'Alnum',
array('Regex',
false,
array('/^[a-z][a-z0-9]{2,}$/'))
)
))
));
有更好的方法可以做到这一点还是这是唯一的方法?
public function prepareSubForm($spec){
if (is_string($spec)) {
$subForm = $this->{$spec};
} elseif ($spec instanceof Zend_Form_SubForm) {
$subForm = $spec;
} else {
throw new Exception('Invalid argument passed to ' .
__FUNCTION__ . '()');
}
$this->setSubFormDecorators($subForm)
->addSubmitButton($subForm)
->addSubFormActions($subForm);
return $subForm;
}
public function setSubFormDecorators(Zend_Form_SubForm $subForm){
$subForm->setDecorators(array(
'FormElements', \\<--- I tried to change this to PrepareElements before.
array('HtmlTag', array('tag' => 'dl',
'class' => 'zend_form')),
'Form',
));
return $this;
}
答案 0 :(得分:1)
我相信您只需使用以下内容即可获得所需的输出:
<?php echo $this->form->username; ?>
在没有renderViewHelper的情况下调用它时,我得到了预期的输出。这也没有任何装饰器或准备子表单的特殊代码。我所要做的就是将belongsTo
添加到表单元素中。
更新:
如果将此设置为默认装饰器,则可以从渲染中消除dd / dt标记,而不是使用div。然后您可能更接近获得所需的自定义输出。您可以将tag
中的HtmlTag
从div
更改为您希望包含元素的任何标记。这是我主要使用的内容:
array(
'ViewHelper',
'Errors',
array('Description', array('tag' => 'p', 'class' => 'description')),
array('HtmlTag', array('tag' => 'div', 'class' => 'form-div')),
array('Label', array('class' => 'form-label', 'requiredSuffix' => '*'))
);
这是Zend Framework的默认设置:
array(
'ViewHelper',
'Errors',
array('Description', array('tag' => 'p', 'class' => 'description')),
array('HtmlTag', array('tag' => 'dd', 'id' => array('callback' => $getId)))
array('Label', array('tag' => 'dt'))
);
请注意,file和submit / button元素使用不同的装饰器。