如何在Zend Framework 2中设置Fieldset子类中元素的类型?

时间:2016-11-07 12:20:02

标签: zend-framework2 zend-form code-reuse zend-form-element zend-form-fieldset

我有两个非常相似的Fieldset s MyFooFieldsetMyBarFieldset。为了避免代码重复,我创建了一个AbstractMyFieldset,将整个代码移到那里,并希望处理具体类的init()方法的差异:

AbstractMyFooFieldset

namespace My\Form\Fieldset;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
abstract class AbstractMyFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function init()
    {
        $this->add(
            [
                'type' => 'multi_checkbox',
                'name' => 'my_field',
                'options' => [
                    'label_attributes' => [
                        'class' => '...'
                    ],
                    'value_options' => $this->getValueOptions()
                ]
            ]);
    }
    public function getInputFilterSpecification()
    {
        return [...];
    }
    protected function getValueOptions()
    {
        ...
        return $valueOptions;
    }
}

MyFooServerFieldset

namespace My\Form\Fieldset;
use Zend\Form\Fieldset;
class MyFooServerFieldset extends AbstractMyFieldset
{
    public function init()
    {
        parent::init();
        $this->get('my_field')->setType('radio'); // There is not method Element#setType(...)! How to do this?
        $this->get('my_field')->setAttribute('required', 'required'); // But this works.
    }
}

我想为元素设置type和其他一些配置,例如typerequired属性。requiredElement#setType(...)属性。设置属性似乎没问题,至少我可以设置type属性。但我无法设置类型 - Zend\Form\Element不存在。

如何设置spyOn($rootScope, '$broadcast').and.callThrough(); spyOn(rootScope,'$broadcast').andCallThrough(); AsyncTaskLoader

1 个答案:

答案 0 :(得分:1)

无法设置元素的类型,因为每个元素都定义了自己的类型和元素类。在AbstractMyFieldset中,请参阅"输入"您init()内的密钥。您告诉表单添加MultiCheckbox元素类,并希望将类更改为另一个。因此,您需要删除默认值并将其属性和选项复制到新添加的Zend Form元素。

另一种选择是使用基础Zend\Form\Element类,您可以覆盖属性并设置type属性。 ->setAttribute('type', 'my_type')但您遗漏了默认Zend2表单类的所有好处。尤其是InArrayZend\Form\Element\Radio的默认Zend\Form\Element\MultiCheckbox验证程序。

或者您应该考虑为两个字段集创建一个abstractFieldSet,并定义它们如何获取它们的值选项并重用它们。像:

abstract class AbstractFieldSet extends Fieldset {
    public function addMyField($isRadio = false)
    {
        $this->add([
            'type' => $isRadio ? 'radio' : 'multi_checkbox',
            'name' => 'my_field',
            'options' => [
                'value_options' => $this->getValueOptions()
            ]
        ]);
    }

    protected function getValueOptions()
    {
        // ..
        return $valueOptions
    }
}

class fieldSet1 extends AbstractFieldSet {
    public function init()
    {
        $this->addMyField(false);
    }
}

class fieldSet2 extends AbstractFieldSet {
    public function init()
    {
        $this->addMyField(true);
    }
}