如何在Zend表单中添加“子元素”

时间:2019-01-31 16:46:18

标签: zend-form zend-framework3 zend-form-element

我有一个Zend表单,其中有几个字段供用户填写。在管理系统中,我想显示完全相同的表单,但是在现有元素旁边显示其他元素,管理员可以在其中提供对用户输入的反馈。

在下面,您可以看到我用来创建用户看到的表单的代码。

在发布此问题之前,我先看过Zend Form Decorator,但我不知道这是否是解决此问题的必要条件。

public function __construct()
    {
        parent::__construct('user-feedback-form');
        $this->setAttribute('method', 'post');
        $this->setAttribute('role', 'form');

        $this->add([
            'name' => 'name',
            'type' => Text::class,
            'attributes' => [
                'id' => 'name',
                'required' => true,
                'readonly' => false,
            ],
        ]);

        $this->add([
            'name' => 'surname',
            'type' => Text::class,
            'attributes' => [
                'id' => 'surname',
                'required' => true,
                'readonly' => false,
            ],
        ]);

        $this->add([
            'name' => 'age',
            'type' => Number::class,
            'attributes' => [
                'id' => 'age',
                'required' => true,
                'readonly' => false,
            ],
        ]);
    }

1 个答案:

答案 0 :(得分:1)

要重用表单的某些部分,zend提供了字段集。 无需将元素添加到表单中,而是将它们添加到filedset并将字段集添加到表单中。

class UserFeedbackFieldset extends Zend\Form\Fieldset 
{
    public function init()
    {
        $this->add([
            'name' => 'name',
            'type' => Text::class,
            'attributes' => [
                'id' => 'name',
                'required' => true,
                'readonly' => false,
            ],
        ]);

        $this->add([
            'name' => 'surname',
            'type' => Text::class,
            'attributes' => [
                'id' => 'surname',
                'required' => true,
                'readonly' => false,
            ],
        ]);

        $this->add([
            'name' => 'age',
            'type' => Number::class,
            'attributes' => [
                'id' => 'age',
                'required' => true,
                'readonly' => false,
            ],
        ]);
    }
}

然后在表单中添加字段集:

class UserFeedbackForm extends Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct('user-feedback-form');
        $this->setAttribute('method', 'post');
        $this->setAttribute('role', 'form');
    }

    public function init()
    {
        $this->add([
            'type' => UserFeedbackFieldset::class,
            'name' => 'user',
            'options' => [
                'use_as_base_fieldset' => true,
            ],
        ]);
    }
}

class AdminUserFeedbackForm extends Zend\Form\Form
{
    public function __construct()
    {
        parent::__construct('user-feedback-form');
        $this->setAttribute('method', 'post');
        $this->setAttribute('role', 'form');
    }

    public function init()
    {
        $this->add([
            'type' => UserFeedbackFieldset::class,
            'name' => 'user',
            'options' => [
                'use_as_base_fieldset' => true,
            ],
        ]);

        $this->add([
            'name' => 'someotherfield',
            'type' => Text::class,
            'attributes' => [
                'id' => 'someotherfield',
                'required' => true,
                'readonly' => false,
            ],
        ]);
    }
}

然后,您可以在管理页面上使用其他表单代替原始表单。