2010-02-17 4 views
0

zend_formzend_decorator과 관련된 문제가 있습니다.기본적으로 데코레이터를 덮어 쓰는 Zend_Form

모든 양식을 기본값으로 설정하여 목록 요소를 사용하는 데 데코레이터 클래스를 만들었지 만 작동하지 않는 것 같습니다!

기본적으로 my_decorator_designzend_form으로 확장되고 내 양식은 데코레이터를 확장합니다.

아이디어가 있으십니까?

class My_Decorator_Design extends Zend_Form { 

public function loadDefaultDecorators() { 
    $this->addDecorator('FormElements') 
    ->addDecorator('HtmlTag', array('tag' => 'ul')) //this adds a <ul> inside the <form> 
    ->addDecorator('Form'); 

$this->setElementDecorators(array(
    'ViewHelper', 
    'Label', 
    'Errors', 
    new Zend_Form_Decorator_HtmlTag(array('tag' => 'li')) //wrap elements in <li>'s 
)); 

$this->setDisplayGroupDecorators(array(
    'FormElements', 
    'Fieldset', 
    new Zend_Form_Decorator_HtmlTag(array('tag' => 'li')), //wrap groups in <li>'s too 
    new Zend_Form_Decorator_HtmlTag(array('tag' => 'ul')) 
)); 

$this->setDisplayGroupDecorators(array(
    'FormElements', 
    'Fieldset', 
    new Zend_Form_Decorator_HtmlTag(array('tag' => 'li')) //wrap groups in <li>'s too 
)); 
} 

} 

class Forms_User_Update extends My_Decorator_Design { 
    public function __construct($options=array()) { 
    parent::__construct($options);//if we ever want to pass on things to zend_form 
    $this->setName('user_update'); 
    $this->loadDefaultDecorators(); 

    //user_name, first_name, email, password, date_of_birth 
    $user_name   = new Zend_Form_Element_Text('user_name'); 
    $first_name   = new Zend_Form_Element_Text('first_name'); 
    $email    = new Zend_Form_Element_Text('email'); 
    $password   = new Zend_Form_Element_Password('password'); 
    $password2   = new Zend_Form_Element_Password('password2'); 
    $submit    = new Zend_Form_Element_Submit('Submit'); 

    $user_name->setRequired(true) 
       ->setLabel('Username'); 
    $first_name->setRequired(false) 
       ->setLabel('First Name'); 
    $email->setRequired(true) 
      ->setLabel('Email:') 
      ->addFilter('StringToLower') 
      ->addValidator('NotEmpty', true) 
      ->addValidator('EmailAddress'); 
    $password->setLabel('Password:') 
      ->setRequired(false) 
      ->setIgnore(false) 
      ->addValidator('stringLength', false, array(6)); 
    $password2->setLabel('Confirm Password:') 
       ->setRequired(false) 
       ->setIgnore(true); 
    $submit->setLabel("Submit") 
      ->setIgnore(true); 

    $this->addElements(array(
     $user_name, $first_name, $email, $password, $password2, $submit 
    )); 
    //$this->Submit->removeDecorator('Label'); 
    //$this->addElementPrefixPath('My_Decorator', 'My/Decorator/', 'decorator'); 
    $this->setMethod('post'); 
    $this->setAction('/update-account');  
    } 
} 
+0

귀하의 코드는 마지막에 잘라 것 같다 잘 작동 바랍니다. –

+0

Nah 그곳에서 나온 일반적인 zend_form 코드입니다. 어쨌든 편집 할 것입니다. 감사합니다 – azz0r

답변

3

당신은 생성자에서 loadDefaultDecorators을 호출하고 거기에서 setElementDecorators를 호출합니다. setElementDecorators 만 (생성자에 아무도없는) 이미 존재하는 컨트롤에 대한 장식을 설정하는 동안, 당신은 준비가 만든 요소를 ​​통과하지 않을 경우, 문자열에서 요소를 구성하는 경우에만

그러나 addElement는 요소 장식을 사용합니다.

먼저 요소를 만든 다음 요소로 전달하면 요소 데코레이터는 설정되지 않습니다.

생성자에서 loadDefaultDecorators에 대한 호출을 제거하십시오.

+0

아 감사합니다! 나는 $ this-> loadDefaultDecorators()를 단순히 움직였다. $ this-> addElements 바로 다음에. 다시 한 번 감사드립니다. – azz0r

1

나는 또한 이런 유형의 문제에 직면했지만, 마침내 파일 요소와 다른 입력 요소 모두에 대해 zend 양식을 사용자 정의했습니다.

다음 코드를 사용하여 zend 양식의 다른 요소와 함께 파일 데코레이터를 적용하십시오.

<?php 
    public function init() 
    { 
    // Set the method for the display form to POST 
    $this->setMethod('post'); 
     $this->setElementDecorators(array(
        'ViewHelper', 
        array('HtmlTag',array('tag' =>'div' ,'class'=>'field')), 
        array('Label',array('tag' =>'div','class'=>'label')), 
       )); 

    // Add an email element 
    $this->addElement('text','name',array('label'=>'Name:', 
      'required'=>true, 


    $this->addElement('text','username',array('label'=>'User Name:','id'=>'user_name', 
      'required'=>true, 

      )); 

    $this->addElement('password','password',array('label'=>'Password:', 
        'required'=>true, 

        )); 

    $this->addElement('password','cpassword',array('label'=>'Password Again:', 
        'required'=>true, 

        )); 

    $this->addElement('text','phone',array('label'=>'Phone:', 
        'required'=>true, 

        )); 

    $this->addElement('text', 'email', array(
         'label'  => 'Email:', 
         'value'  =>'test', 


         )); 
    $this->addElement('file', 'photo', array(
         'label'  => 'Profile Photo:', 
         'decorators' =>array('file',array('HtmlTag',array('tag'=>'div','class'=>'field')) 
              ,array('Label',array('tag'=>'div','class'=>'label'))) 
         )); 

    $this->addElement('submit', 'save',array('label'=>'Register Me','class'=>'submitbtn','style'=>'margin-left:150px;')); 



} 

?> 

나는

관련 문제