Zend_Form, переписывает декораторы по умолчанию, не работает - PullRequest
0 голосов
/ 17 февраля 2010

У меня проблемы с zend_form и zend_decorator.

Я создал класс декоратора, чтобы все формы по умолчанию использовали элементы списка, но, похоже, он не работает!

По существу my_decorator_design расширяет zend_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');    
  }
}

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Вы вызываете loadDefaultDecorators в конструкторе и вызываете setElementDecorators оттуда.

Но addElement использует декораторы элементов только тогда, когда вы создаете элементы из строк, а не когда вы передаете готовый элемент, тогда как setElementDecorators устанавливает декораторы только для уже существующих элементов управления (которых нет в конструкторе).

Когда вы сначала создаете элементы, а затем передаете их как элементы, декораторы элементов никогда не устанавливаются.

Удалить вызов loadDefaultDecorators в конструкторе.

1 голос
/ 18 марта 2012

Я также сталкивался с этими типами проблем, но, наконец, я настроил Zend-форму для элемента file и других элементов ввода.

Используйте следующий код для применения декоратора файлов с другими элементами в форме 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;'));



}

?>

Я надеюсь, что это будет нормально работать

...