3

我有一个包含映射对象的所有字段的表单。其中,我将在 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');
?>
4

2 回答 2

11

子表单与显示组不同。子表单Zend_Form_SubForm嵌套在实例中的Zend_Form实例。您可以使用它来将一种形式嵌入到另一种形式中。例如,您可能有一个用户个人资料表单和一个注册表单。在注册表单中,您可以输入配置文件值以及其他一些详细信息。因此,您可以将此配置文件表单用作嵌入在注册表单中的子表单。子表单主要用于 DRY(不要重复自己)原则或创建多页表单。

显示只是一些组合在一起的表单元素的视觉表示。在 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;
}
于 2012-03-19T09:23:43.317 回答
2

Zend_Form_SubForm默认情况下不呈现<form>标签。

为了让它这样做,您需要'Form'在渲染它之前将装饰器添加到您的子表单实例中。

尝试:

$mySubForm->addDecorator('HtmlTag', array('tag' => 'dl', 'class' => 'zend_form'))
          ->addDecorator('Form');

然后,在您的视图脚本中,您可以执行以下操作:

<?php echo $this->mySubForm; ?>
于 2012-03-19T09:22:23.323 回答