0

我有兩個非常相似的Fieldset s MyFooFieldsetMyBarFieldset。爲了避免重複代碼,我創建了一個AbstractMyFieldset,感動了整個代碼出現,並希望在具體的類的init()的方法來處理差異:如何在Zend Framework 2中的Fieldset子類中設置元素的類型?

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屬性。設置屬性似乎沒問題,至少我可以設置required屬性。但我不能設置類型 - Element#setType(...)不在那裏。

如何設置typeZend\Form\Element,之後是add ed?

回答

1

沒有辦法設置元素的類型,因爲每個元素都有自己的類型和元素類定義。在您的AbstractMyFieldset中,請參閱init()中的「類型」鍵。您告訴表單添加MultiCheckbox元素類,並且想要將該類更改爲另一個類。因此,您需要刪除默認值並將其屬性和選項複製到新添加的Zend Form元素中。

另一種選擇是使用基類Zend\Form\Element類可以覆蓋屬性並設置類型屬性。 ->setAttribute('type', 'my_type')但我們缺少默認的Zend2表單類的所有好處。尤其是InArray驗證程序Zend\Form\Element\RadioZend\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); 
    } 
} 
相關問題