Zend Framework: ¿Cómo elimino los decoradores de un Zend Form Hidden Element?
zend-framework zend-form (11)
// basado en lo anterior: una función simple para agregar un elemento oculto a $ this form
/**
* 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);
}
Estoy tratando de eliminar los decoradores predeterminados en un elemento de formulario oculto. Por defecto, el elemento oculto se muestra así:
<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 ocupe 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 conseguir esto?
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 CSS helper .hidden, así que simplemente lo aplico al <dd>
y desabrocho 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), formas bonitas. Esto también puede ir a un decorador personalizado para los campos ocultos.
EDITAR
Así es como lo puse en mi propio elemento de forma:
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);
}
}
Como se menciona en otras publicaciones, setDisableLoadDefaultDecorators(true)
no funciona si ya están cargados ... PERO clearDecorators()
sí lo hace.
Cuando tienes muchas entradas ocultas, la mejor respuesta es la siguiente:
$elements = $this->getElements();
foreach ($elements as $elem)
if ($elem instanceof Zend_Form_Element_Hidden)
$elem->removeDecorator(''label'')->removeDecorator(''HtmlTag'');
De la documentación de Zend Element Decorators :
Los decoradores predeterminados no necesitan ser cargados
Por defecto, los decoradores predeterminados se cargan durante la inicialización del objeto. Puede desactivar esto pasando la opción ''disableLoadDefaultDecorators'' al constructor:
$element = new Zend_Form_Element(''foo'', array(''disableLoadDefaultDecorators'' => true) );
El uso de un único decorador "ViewHelper" generará un marcado no válido si todavía está utilizando el envoltorio <dl>
. Otro enfoque se describe en ZF-2718 . Esto agrega campos ocultos a un subformulario que está envuelto en un <dd>
.
No pude hacer que disableLoadDefaultDecorators funcionara correctamente. 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 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" />
...
Para el campo oculto solo necesita un decorador - ViewHelper:
$field = new Zend_Form_Element_Hidden(''id'');
$field->setDecorators(array(''ViewHelper''));
Esto representará solo el campo de entrada, sin el envoltorio Dt-Dd y la etiqueta.
Utilizar esta:
foreach ($this->getElements() as $element) {
$decorator = $element->getDecorator(''label'');
if (!$decorator) {
continue;
}
$decorator->removeOption(''tag'');
}
esto es lo que takeme2web de http://www.phpfreaks.com/forums/index.php?topic=225848.0 sugiere
$ yourhiddenzendformelement-> setDecorators (array (''ViewHelper''));
yo uso esto
$element->removeDecorator(''DtDdWrapper'');
para deshacerse de las etiquetas dt dd alrededor de elementos específicos