代码之家  ›  专栏  ›  技术社区  ›  hernan43

Zend_表单,默认情况下覆盖装饰程序,不起作用

  •  0
  • hernan43  · 技术社区  · 5 年前

    zend_form zend_decorator .

    基本上 my_decorator_design 延伸 然后我的表单扩展了装饰器。

    思想?

    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 回复  |  直到 12 年前
        1
  •  3
  •   Brandon E Taylor    14 年前

    你打电话 loadDefaultDecorators 在构造函数中,并调用 setElementDecorators 从那里开始。

    addElement 仅在从字符串构造元素时使用元素装饰器,而不是在传递现成元素时使用 setElementDecorators 仅为已经存在的控件(构造函数中没有)设置装饰器。

    当您首先创建元素,然后将它们作为元素传递时,永远不会设置元素装饰器。

    删除对的调用 loadDefaultDecorators 在构造函数中。

        2
  •  1
  •   Satyam Kumawat    12 年前

    使用以下代码将文件装饰器与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;'));
    
    
    
    }
    
    ?>
    

    我希望这会很好