0

매우 비슷한 두 가지가 있습니다. 및 MyBarFieldset입니다. 코드 중복을 피하기 위해, 나는 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(...)은 없습니다.

Zend\Form\Element으로 설정하는 방법은 add입니다.

답변

1

요소의 유형을 설정할 방법이 없습니다. 각 요소는 고유 한 유형과 요소 클래스가 정의되어 있습니다. AbstractMyFieldset에서 init()의 '유형'키를 참조하십시오. 양식에 MultiCheckbox 요소 클래스를 추가하고 다른 클래스로 변경하려고합니다. 따라서 기본값을 제거하고 속성 및 옵션을 새로 추가 된 Zend Form 요소로 복사해야합니다.

또 다른 옵션은 기본 Zend\Form\Element 클래스를 사용하여 속성을 덮어 쓰고 유형 속성을 설정할 수 있습니다. ->setAttribute('type', 'my_type')하지만, 기본 Zend2 양식 클래스의 모든 이점을 누락하고 있습니다. 특히 또는 Zend\Form\Element\MultiCheckbox에 대한 기본값 InArray 유효성 검사기로 사용됩니다.

또는 두 필드 집합에 대해 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); 
    } 
} 
관련 문제