2009-01-26 5 views
49

Ich versuche, die Standard-Dekoratoren auf einem ausgeblendeten Formularelement zu entfernen. Standardmäßig wird das versteckte Element wie folgt angezeigt:Zend Framework: Wie entferne ich die Dekoratoren auf einem Zend Form Hidden Element?

<dt>Hidden Element Label (if I had set one)</dt> 
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd> 

Ich weiß nicht versteckt Element Platz auf meiner Seite in Anspruch nehmen will. Ich möchte alle Standarddekoratoren entfernen, so dass nur noch das Eingabe-Tag übrig ist.

<input type="hidden" name="foobar" value="1" id="foobar"> 

Wie kann ich das erreichen?

+0

Gleiche Frage: http://stackoverflow.com/ Fragen/376188/zend-framework-zendform-decorator-issue – leek

+0

Es ist eigentlich eine andere Frage, aber es ist sehr ähnlich. – Andrew

+0

Lesen Sie die eigentliche Frage - es ist das gleiche. – leek

Antwort

47

Für verstecktes Feld nur ein Dekorateur benötigen - Viewhelper:

$field = new Zend_Form_Element_Hidden('id'); 
$field->setDecorators(array('ViewHelper')); 

Dies ist nur das Eingabefeld übertragen wird , ohne Dt-Dd Wrapper und Label.

32

Von der Zend Element Decorators Dokumentation:

Standarddekoratore brauchen nicht

Loaded

standardmäßig zu sein, sind die Standard-Dekorateure während Objektinitialisierung geladen. Sie können diese deaktivieren, indem man das ‚disableLoadDefaultDecorators‘ Option an den Konstruktor:

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true) 
); 
+3

Handy! Ich habe es wie $ this-> addElement ('versteckt', 'article_id', Array ('disableLoadDefaultDecorators' => wahr)); das in meiner init Methode. –

+0

danke, @drfloob, das ist der beste Weg, es zu tun! – jipipayo

+3

Mit dieser Lösung wird das Feld 'für mich überhaupt nicht angezeigt. – Benjamin

3

ich nicht disableLoadDefaultDecorators Arbeit bekommen könnte ganz richtig. Hier ist eine Lösung, die ich mir ausgedacht habe.

Im HTML-Format wird das ausgeblendete Feld ohne zusätzliche Tags angezeigt.

... 
<dt><label for="password" class="required">Password</label></dt> 
<dd><input type="password" name="password" id="password" value="" /></dd> 
<input type="hidden" name="id" value="1" id="id" /> 
... 
+2

das Problem mit diesem Ansatz ist, dass es nicht xhtml-konform ist – Andrew

24

Ich benutze diese

$element->removeDecorator('DtDdWrapper'); 

loszuwerden der dt dd Tags um spezifische Elemente

+0

Ich mag Ihren Ansatz besser. Eine Zeile weniger Code. – Andrew

+0

Wie ist es eine Zeile weniger? –

6

// basierend auf oben - eine einfache Funktion ein verborgenes Element $ dieses Formular hinzufügen

/** 
* Add Hidden Element 
* @param $field 
* @param value 
* @return nothing - adds hidden element 
* */ 
public function addHid($field, $value){  
    $hiddenIdField = new Zend_Form_Element_Hidden($field); 
    $hiddenIdField->setValue($value) 
      ->removeDecorator('label') 
      ->removeDecorator('HtmlTag');  
    $this->addElement($hiddenIdField); 
} 
4

Wie in anderen Beiträgen erwähnt setDisableLoadDefaultDecorators(true) wenn sie nicht funktioniert bereits geladen ... ABER clearDecorators() tut das!

5

Wenn Sie viele versteckte Eingänge beste Antwort haben, ist die folgende:

$elements = $this->getElements(); 
foreach ($elements as $elem) 
    if ($elem instanceof Zend_Form_Element_Hidden) 
     $elem->removeDecorator('label')->removeDecorator('HtmlTag'); 
2

Wenn Sie nur einen einzigen "ViewHelper" -Dekorator verwenden, wird ungültiges Markup generiert, wenn Sie immer noch den <dl>-Wrapper verwenden. Ein anderer Ansatz ist in ZF-2718 beschrieben. Dadurch werden einem Unterformular, das in eine <dd> eingeschlossen ist, verborgene Felder hinzugefügt.

2

Nun, 2012 und immer noch das gleiche Problem. Wenn Sie die Dekoratoren entfernen, wird das HTML nicht validiert. Wenn Sie sie verlassen, nehmen die versteckten Elemente Platz ein. In all meinen Projekten habe ich einen CSS Helfer .hidden, so dass ich es nur auf die <dd> und ungesetzt das Etikett gelten:

$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar')); 
$element->removeDecorator('Label'); 
$element->getDecorator('HtmlTag')->setOption('class', 'hidden'); 

Valid HTML (5), gut aussehende Formen. Dies kann auch in einen benutzerdefinierten Dekorator für die ausgeblendeten Felder übernommen werden.

EDIT

Dies ist, wie ich es in mein eigenes Formularelement setzen:

class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden 
{ 
    public function render(Zend_View_Interface $view = null) 
    { 
     $this->removeDecorator('Label'); 
     $this->getDecorator('HtmlTag')->setOption('class', 'hidden'); 
     return parent::render($view); 
    } 
} 
+0

netter Ansatz. ich mag das. =] – Andrew

0

Verwendung dieser:

foreach ($this->getElements() as $element) { 

     $decorator = $element->getDecorator('label'); 
     if (!$decorator) { 
      continue; 
     } 
     $decorator->removeOption('tag'); 
    }