zend tutorial framework documentacion php zend-framework zend-form

php - documentacion - zend framework 3 tutorial



Zend Framework-Zend_Form Decorator Issue (5)

Tengo una clase que extiende Zend_Form así (simplificado):

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); } }

Luego uso esa clase para crear todos mis formularios:

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

En uno de mis puntos de vista, tengo la necesidad de mostrar solo este campo (sin nada más generado por Zend_Form). Entonces, desde mi punto de vista, tengo esto:

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

Esto funciona bien, excepto que genera el campo así:

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

Esto es obviamente porque configuré los elementos decoradores para que incluyan HtmlTag: tag => ''li''.

Mi pregunta es: ¿cómo puedo desactivar todos los decoradores para este elemento. No necesito decoradores para elementos de entrada ocultos.


Restablezca los decoradores para que el elemento de formulario solo use ''ViewHelper''. Por ejemplo:

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

Obviamente, la vista no es el lugar ideal para hacer esto, pero se entiende la idea. Tenga en cuenta que al llamar a setDecorator *** s *** () restablece todos los decoradores en lugar de agregar uno nuevo.


el mejor lugar para establecerlo es la función pública loadDefaultDecorators ()

por ejemplo, así:

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'')); } }


Esto es lo que hago:

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(); } }

Luego en tu forma,

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

Fuente


Si va a agregar elementos de esta manera:

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

Puede obtener las etiquetas dd/dt para cada elemento con esto:

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

o si quieres agregar elementos de esta otra manera:

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

Necesitas descomentar:

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

para deshabilitar las etiquetas dd/dt . Esta última forma es solo para deshabilitar el elemento actual, los otros elementos en el formulario mantienen las etiquetas <dd> <dt> como normalmente.


Si deshabilita los decoradores dd / dt en el elemento oculto, tendrá XHTML no válido, porque tendrá algo que no es un elemento válido en un dl. La única solución es deshabilitar estos decoradores en todos los elementos del formulario, no solo los ocultos, y deshabilitarlos en todo el formulario, también. Por consistencia, querrá hacer esto en todos los formularios.

En mi humilde opinión, esta es una mala decisión de diseño en ZF. Quiero decir, decir que el valor de una entrada es la "definición" de un "término" es una idea bonita semánticamente, pero no está completamente pensada.

La misma pregunta aquí: Zend Framework: ¿Cómo elimino los decoradores en un Zend Form Hidden Element?