我有一个包含映射对象的所有字段的表单。 其中,我将在Form类中生成一个子表单。 我正在尝试通过displaygroup执行此操作,但是当调用控制器中的“子窗体”时,标签 form 不会生成。 我怎么解决? 感谢
这是代码。
<?php
$username = new Zend_Form_Element_Text('user');
...//param for field
$password = new Zend_Form_Element_Password('pwd');
...//param for field
$name = new Zend_Form_Element_Text('name');
...//param for field
$submit = new Zend_Form_Element_Submit('submit');
...//param for field
$this->addElement(array($user,$password,$name,$submit));
$this->addDisplayGroup(array($user,$password,$submit),'login');
$this->addDisplayGroup(array($user,$password,$name, $submit),'create');
?>
答案 0 :(得分:11)
子表单与显示组不同。 subform是嵌套在Zend_Form_SubForm
实例中的Zend_Form
实例。您可以使用它将一个表单嵌入另一个表单中。例如,您可能有一个用户配置文件表单和一个注册表单。在注册表单中,您可以输入配置文件值以及其他一些详细信息。因此,您可以将此配置文件表单用作嵌入在注册表单中的子表单。子表单主要用于DRY(不要重复自己)原则或创建多页表单。
display group只是一些组合在一起的表单元素的直观表示。在html语法中,这称为fieldset
。主要目的是创建彼此属于的元素组。例如,在购物车中,您可能有发票地址组和送货地址组。这种显示组主要用于语义和视觉表示。
最大的区别在于,对于显示组,表单具有这些表单元素的意识,与子表单一样,表单不知道子表单的元素。这就是说,我注意到你要创建一个包含两个显示组的表单:一个是登录时,一个是创建(或注册)用户时。使用上面给出的,不能使用显示组。一种选择是使用两个表单实例:
class LoginForm extends Zend_Form
{
public function init ()
{
$this->addElement('text', 'user');
$this->addElement('password', 'pwd');
$this->addElement('submit', 'submit');
}
}
class RegisterForm extends Zend_Form
{
public function init ()
{
$this->addElement('text', 'user');
$this->addElement('password', 'pwd');
$this->addElement('text', 'name');
$this->addElement('submit', 'submit');
}
}
如果您想重复使用字段user
和pwd
,可能需要使用子表单:
class BaseForm extends Zend_Form_SubForm
{
public function init ()
{
$this->addElement('text', 'user');
$this->addElement('password', 'pwd');
}
}
class LoginForm extends Zend_Form
{
public function init ()
{
$subform = new BaseForm;
$this->addSubform($subform, 'base');
$this->addElement('submit', 'submit');
}
}
class RegisterForm extends Zend_Form
{
public function init ()
{
$subform = new BaseForm;
$this->addSubform($subform, 'base');
$this->addElement('text', 'name');
$this->addElement('submit', 'submit');
}
}
在这两种情况下,您只需在控制器中实例化其中一个表单:
public function loginAction ()
{
$form = new LoginForm();
// More code here
$this->view->form = $form;
}
public function registerAction ()
{
$form = new RegisterForm();
// More code here
$this->view->form = $form;
}
答案 1 :(得分:2)
Zend_Form_SubForm
默认情况下不会呈现<form>
个标记。
为了实现这一点,您需要在渲染之前将'Form'
装饰器添加到子窗体实例。
尝试:
$mySubForm->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form'))
->addDecorator('Form');
然后,在您的视图脚本中,您可以执行以下操作:
<?php echo $this->mySubForm; ?>