Zend Framework - Zend_Form Dekoratör Sayı

5 Cevap php

Ben böyle Zend_Form (basitleştirilmiş) genişleten bir sınıf vardır:

class Core_Form extends Zend_Form
{
    protected static $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Label'),
        array('HtmlTag', array('tag' => 'li')),
    );  

    public function loadDefaultDecorators()
    {
        $this->setElementDecorators(self::$_elementDecorators);
    }
}

Sonra benim tüm formları oluşturmak için bu sınıfı kullanın:

class ExampleForm extends Core_Form
{
    public function init()
    {
        // Example Field
        $example = new Zend_Form_Element_Hidden('example');
        $this->addElement($example);
    }
}

Görüşlerimi birinde, (Zend_Form tarafından oluşturulan başka bir şey olmadan) only Bu bir alanı görüntülemek için bir ihtiyaç var. Yani benim görünümünde bu var:

<?php echo $this->exampleForm->example; ?>

Bu böyle bir alan oluşturur dışında çalışıyor:

<li><input type="hidden" name="example" value=""></li>

Tag => 'li': Ben HtmlTag dahil eleman dekoratörler ayarlamak çünkü bu besbelli.

My question is: How can I disable all decorators for this element. I don't need decorators for hidden input elements.

5 Cevap

ayarlamak için en iyi yer kamu fonksiyonu loadDefaultDecorators olan ()

Bu gibi, örneğin:

class ExampleForm extends Core_Form
    {
    	public function init()
    	{
    		//Example Field
    		$example = new Zend_Form_Element_Hidden('example');
    		$this->addElement($example);
    	}

    	public function loadDefaultDecorators()
        {
        	$this->example->setDecorators(array('ViewHelper'));
        }
    }

Yalnızca 'ViewHelper' kullanmak için form öğesi için dekoratörler sıfırlayın. Örneğin:

<?php echo $this->exampleForm->example->setDecorators(array('ViewHelper')) ; ?>

Açıkçası, bu görünüm yapmak için ideal bir yer değil, ama fikir olsun. SetDecorator * s* () çağırarak yerine bir yenisini ekleyerek tüm dekoratörler sıfırlar unutmayın.

Eğer gizli elemanı üzerinde dd / dt dekoratörler devre dışı bırakırsanız, bir dl geçerli bir öğe değil bir şey olacak çünkü, geçersiz XHTML olacak. Tek çözüm tüm form elemanları, sadece gizli olanlar bu dekoratörler devre dışı bırakmak için, ve de, tüm form onları devre dışı bırakmak için. Tutarlılık için, tüm formları karşısında bunu yapmak isteyeceksiniz.

IMHO, bu ZF kötü bir tasarım kararı. Ben bir giriş değeri semantik sevimli bir fikir, bir "dönem" "tanımı" olduğunu, ancak tamamen düşünülmüş olmadığını söyleyerek, demek.

Burada aynı soru: http://stackoverflow.com/questions/481871/zend-framework-how-do-i-remove-the-decorators-on-a-zend-form-hidden-element

Eğer bu şekilde öğeler eklemek için gidiyoruz:

$this->addElement(
  'text',
  'a1',
  array('required' => true, 'validators' => array('Alpha'))
);

Bu her eleman için dd/dt etiketleri alabilirsiniz:

$this->setElementDecorators(array('ViewHelper'));

ya da bu başka bir şekilde öğeler eklemek için goint ise:

$nombre1 = new Zend_Form_Element_Text(
          'n1', 
          array('id'=> 'Nombre1', 'validators' => array('Alpha') )
            );
//$nombre1->setDecorators(array('ViewHelper'));
$this->addElement($nombre1);

Sen yorumsuz gerekir:

//$nombre1->setDecorators(array('ViewHelper'));

in order to disable the dd/dt tags. This last way is only to disable the current element, the others elements in the form keep the <dd> <dt> tags as normally.

İşte ne var:

class M_Form_Element_Hidden extends Zend_Form_Element_Hidden {
   public function init() {
      $this->setDisableLoadDefaultDecorators(true);
      $this->addDecorator('ViewHelper');
      $this->removeDecorator('DtDdWrapper');
      $this->removeDecorator('HtmlTag');
      $this->removeDecorator('Label');
      return parent::init();
   }
}

Sonra Formu,

$element = new M_Form_Element_Hidden('myElement');
$this->addElement($element);

Source