2009-01-26 22 views
49

Estoy tratando de eliminar los decoradores predeterminados en un elemento de formulario oculto. Por defecto, el elemento oculto se muestra así:Zend Framework: ¿Cómo elimino los decoradores de un 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> 

no quiero que mi elemento oculto a ocupar espacio en mi página. Quiero eliminar todos los decoradores predeterminados, así que todo lo que me queda es la etiqueta de entrada.

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

¿Cómo puedo lograr esto?

+0

misma pregunta: http://stackoverflow.com/ preguntas/376188/zend-framework-zendform-decorator-issue – leek

+0

En realidad es una pregunta diferente, pero es muy similar. – Andrew

+0

Lea la pregunta real: es lo mismo. – leek

Respuesta

47

Para campo oculto que necesita solo un decorador - ViewHelper:

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

Esto hará que sólo el campo de entrada , sin envoltorio Dt-Dd y etiqueta.

32

De la documentación Zend Element Decorators: Decoradores

por defecto no tiene por qué ser Loaded

Por defecto, los decoradores por defecto son cargado durante la inicialización de objetos. Puede desactivar esta opción haciendo pasar los '' disableLoadDefaultDecorators al constructor:

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

¡Práctico! Lo usé como $ this-> addElement ('hidden', 'article_id', array ('disableLoadDefaultDecorators' => true)); eso en mi método init. –

+0

gracias, @drfloob, ¡esta es la mejor manera de hacerlo! – jipipayo

+3

Al usar esta solución, el campo '' no se muestra en absoluto para mí. – Benjamin

3

no pude conseguir disableLoadDefaultDecorators que funciona bastante bien. Aquí hay una solución que se me ocurrió.

$hiddenIdField = new Zend_Form_Element_Hidden('id'); 
$hiddenIdField->setValue($portalId) 
       ->removeDecorator('label') 
       ->removeDecorator('HtmlTag'); 

En el código HTML, el campo oculto aparece sin etiquetas adicionales a su alrededor.

... 
<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

el problema con este enfoque es que no es compatible con xhtml – Andrew

24

Yo uso este

$element->removeDecorator('DtDdWrapper'); 

para deshacerse de las etiquetas dt dd torno a elementos específicos

+0

Me gusta su enfoque mejor. Una menos línea de código. – Andrew

+0

¿cómo es una línea menos? –

6

// base en lo anterior - una función simple para añadir un elemento oculto a $ este formulario

/** 
* 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

Como se ha mencionado en otras setDisableLoadDefaultDecorators(true) no funciona si ya están cargados ... PERO clearDecorators() hace!

5

Cuando se tiene una gran cantidad de entradas ocultas mejor respuesta es la siguiente:

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

El uso de un único decorador "ViewHelper" generará un marcado no válido si todavía está utilizando el contenedor <dl>. Otro enfoque se describe en ZF-2718. Esto agrega campos ocultos a un subformulario que está envuelto en un <dd>.

2

Bueno, 2012 y sigue siendo el mismo problema. Si quita los decoradores, el html no se validará. Si los dejas, los elementos ocultos ocupan espacio. En todos mis proyectos tengo un ayudante CSS .hidden, por lo que sólo aplicarlo a la <dd> y desarmar la etiqueta:

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

HTML válido (5), bonitas formas que buscan. Esto también puede ir a un decorador personalizado para los campos ocultos.

EDITAR

Ésta es la forma en que lo puse en mi propia forma de elemento:

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

buen enfoque. me gusta. =] – Andrew

0

Utilice esta:

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

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