2013-01-11 1 views
0

모든 필드를 렌더링 :Zend_Form이 같은 일부 사용자 지정 장식과 함께, 내가 Zend_Form 양식이 텍스트

$decorators = array(); 
$decorators[] = new Zend_Form_Decorator_ViewHelper(array()); 
$decorators[] = new Zend_Form_Decorator_Errors; 
$decorators[] = new Zend_Form_Decorator_HtmlTag(array('tag' => 'div', 'class' => 'form-item')); 
$decorators[] = new Zend_Form_Decorator_Label(array('class' => 'form-label')); 
$decorators[] = new Zend_Form_Decorator_Callback(array(
    'callback' => function($content, $element, $options) { 
     return sprintf('<div class="form-row">%s</div>', $content); 
    }, 
    'placement' => false 
)); 
$this->setElementDecorators($decorators); 

문제는, 모든 필드가 텍스트 입력으로 렌더링됩니다. 왜 그렇게됩니까?

편집 : 모든 입력을 반드시 텍스트 입력으로 렌더링하지는 않지만 형식의 첫 번째 입력 유형으로 렌더링한다는 것을 발견했습니다. 다음은 내가 사용하는 양식의 예입니다 (데코레이터는 int 부모의 init로 설정됩니다).

<?php 

class Form_Users_Add extends Form_Base { 
    protected $pbxs = array(1 => 'Element 1', 2 => 'Element 2'); 

    public function init() { 
     $monitors = new Zend_Form_Element_Checkbox('prefered_screen_count'); 
     $monitors->setCheckedValue(2); 
     $monitors->setUncheckedValue(1); 
     $monitors->setLabel('two_monitors'); 
     $this->addElement($monitors); 

     $pbx = new Zend_Form_Element_Select('asterisk_id'); 
     $pbx->setMultiOptions($this->pbxs); 
     $pbx->setLabel('users_asterisk_id'); 
     $this->addElement($pbx); 

     parent::init(); 
    } 

} 
+1

양식 코드를 표시 할 수 있습니까? 그리고 부차적 인 질문 : 행에'Callback' 데코레이터를 사용해야하는 이유는 무엇입니까? 아이템 자체에 대해하는 것처럼'HtmlTag'을 사용하지 않으시겠습니까? 그냥 궁금해서. –

+0

질문을 편집했습니다. 그리고 두 개의 HtmlTag가 작동하지 않을 수 있기 때문에 Callback을 사용하고 있습니다. 아마도 내가 잘못된 것을하고있을 것입니다.하지만 그들은 대체되었습니다. – Agares

+0

아아아, 하나의 요소에 동일한 데코레이터 클래스의 여러 인스턴스를 사용하는 트릭이 있습니다. 데코레이터 이름의 별명을 지정해야합니다. 예 : array (array ('my-item'=> 'HtmlTag'), array ('tag'=> 'div', 'class'=> 'some-class')),'. 그런 다음 행에 대한'HtmlTag' 데코레이터에서 다른 별칭 인'my-row'를 사용하십시오. –

답변

1

예! 나는 그 문제를 해결했다! 원인은 내가 이름 대신 클래스의 인스턴스를 사용했기 때문입니다. 이 방법으로 모든 요소는 데코레이터의 동일한 인스턴스를 사용하고있었습니다.