Zend_Form fazla varsayılan dekoratörler biniyordu

3 Cevap php

Ben Zend_Form ile dekoratörler varsayılan kümesini biniyordu fazla sorun yaşıyorum.

Ben farklı bir dekoratör tarzı uygulamak için Zend_Form uzatmak çalışılıyor.

class CRM_Form extends Zend_Form
{
 public function init()
 {  
  $this->setDisableLoadDefaultDecorators(true);

  $this->addDecorator('FormElements')
->addDecorator('Form');

  $this->setElementDecorators(array(
  'ViewHelper',
  'Label',
 'Errors',
   new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
  ));
 }
}

Ben bu yüzden gibi bu sınıfın faydalanmak için çalıştığınızda:

$form = new CRM_Form();
$form->setAction('/')->setMethod('post'); 
$id = $form->createElement('text','id')->setLabel('ID:');
$form->addElement($id);

Eski dekoratörler doğrusu benim paragraf stili (tanım listesi) kullanılır.

Ben (onlar ayarlamış stilini kullanmak CRM_Form sınıfının) yöntemi init () 'ın addElement eğer.

Nasıl benim varsayılan stil kullanmak için o sınıfı kullanarak tüm unsurları oluşturulmuş zorlayabilir?

3 Cevap

Zend Form after bunları eklemek Elemanları dekore edilir. Yani "addAndDecorte" gibi bir yöntem oluşturun:

public function addAndDecorate($element) 
{
   $this->addElement($element);

   // do your decorating stuff..
}

Eğer init setElementDecorators çağırdığınızda, süslemek için herhangi elemanları yoktur, bu yüzden hiçbir şey olmuyor. Bunun yerine, aşağıdaki yapacak, hangi Zend_Form :: createElement işlevi geçersiz kılabilirsiniz:

  1. Seçenekler dizisi listeleyen bir dekoratörler içeriyorsa, o zaman sadece bir değişiklik olmadan iletmekten.
  2. Seçenekleri yoksa, o zaman varsayılan ekleyin.

..

// not tested
public function createElement($type, $name, $options = null)
{
  if ( !is_array($options) ) {
    $options = array();
  }
  if ( !isset($options['decorators']) ) {
    $options['decorators'] = array(
      'ViewHelper','Label','Errors',
      new Zend_Form_Decorator_HtmlTag(array('tag' => 'p'))
    );
    // I'd make this array a protected class member
  }

  return parent::createElement($type, $name, $options);
}

Eğer elemanları ekleyerek $form->addElement('type', 'name', array('options'=>'example')); biçimi kullanıyorsanız, varsayılan olarak, Zend_Form sen setElementDecorators ayarlanan dekoratörler kullanır.

Eğer $form->addElement() fonksiyon onları geçirmeden sonra, unsurları kendiniz oluşturuyorsanız, otomatik dekoratörler ayarı ilgilenir olmaz.

Kolayca zaten formda böyle bir şey yaparak oluşturulan unsurları dekoratörler ayarlamak için bu işlevi geçersiz olabilir:

public function addElement($element, $name = null, $options = null)
{
  if ($element instanceOf Zend_Form_Element) {
    $element->setDecorators($this->_elementDecortors);
  }
  return parent::addElement($element, $name, $options);
}