我有两个非常相似的Fieldset
s MyFooFieldset
和MyBarFieldset
。为了避免代码重复,我创建了一个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
和其他一些配置,例如type
和required
属性。required
和Element#setType(...)
属性。设置属性似乎没问题,至少我可以设置type
属性。但我无法设置类型 - Zend\Form\Element
不存在。
如何设置spyOn($rootScope, '$broadcast').and.callThrough();
spyOn(rootScope,'$broadcast').andCallThrough();
后AsyncTaskLoader
答案 0 :(得分:1)
无法设置元素的类型,因为每个元素都定义了自己的类型和元素类。在AbstractMyFieldset
中,请参阅"输入"您init()
内的密钥。您告诉表单添加MultiCheckbox
元素类,并希望将类更改为另一个。因此,您需要删除默认值并将其属性和选项复制到新添加的Zend Form元素。
另一种选择是使用基础Zend\Form\Element
类,您可以覆盖属性并设置type属性。 ->setAttribute('type', 'my_type')
但您遗漏了默认Zend2表单类的所有好处。尤其是InArray
或Zend\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);
}
}