php zend-framework zend-form decorator zend-decorators

php - Zend_Form_Decorator-¿Cómo agregar attrib a Zend_Form_Element_Hidden?



zend-framework zend-form (2)

Esto te ayudará: también puedes especificar otros atributos.

$el = $form->getElement(''whatever''); $el->addDecorators( array(''ViewHelper'', array(''HtmlTag'',array(''tag'' => ''dt'',''class''=>''hidden'')), array(''Label'', array(''tag'' => ''dd '', ''class''=>''hidden'')), ));

Tengo 2 requisitos: 1) Todos los elementos de entrada ocultos deben verse afectados sin eliminar los decoradores estándar. 2) Esto debería suceder SIN tener que especificarlo por elemento.

Todo lo que necesito es que una clase CSS se adjunte a las etiquetas DT y DD SI el tipo de elemento es Zend_Form_Element_Hidden.

Intenté crear decoradores personalizados HtmlTag, DtDdWrapper y FormElement, pero no he podido encontrar la manera de hacerlo.

Por defecto, aparecen de esta manera:

<dt>&nbsp;</dt> <dd><input type="hidden" name="whatever" value="bling" /></dd>

Me gustaría que aparezcan de esta manera:

<dt class="hidden">&nbsp;</dt> <dd class="hidden"><input type="hidden" name="whatever" value="bling" /></dd>

De esa forma, seguirán estando donde deberían estar, pero no interrumpirán el flujo del documento.

Ejemplo de lo que no funcionó:

class My_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper { public function render($content) { if ($this->getElement() instanceof Zend_Form_Element_Hidden) { return ''<dt class="hidden">&nbsp;</dt><dd class="hidden">''.$content.''</dd>''; } else { return parent::render($content); } }


En función de su resultado de muestra deseado, no estoy seguro de por qué querría incluir <dt> en elementos ocultos, especialmente dado que no está aplicando ninguna etiqueta, sino que terminan convirtiéndose en marcas innecesarias. Siguiendo la suposición de que la etiqueta es innecesaria , puede lograr el efecto deseado con lo siguiente:

class TestForm extends Zend_Form { protected $_hiddenElementDecorator = array( ''ViewHelper'', array(''HtmlTag'', array(''tag'' => ''dd'', ''class'' => ''hidden'')), ); public function init() { $this->addElement(''hidden'', ''hiddenElement0''); $element = new Zend_Form_Element_Hidden(''hiddenElement1''); $this->addElement($element); } public function loadDefaultDecorators() { foreach ($this->getElements() as $element) { if ($element->getType() === "Zend_Form_Element_Hidden") { $element->setDecorators($this->_hiddenElementDecorator); } } parent::loadDefaultDecorators(); } }

Ambos elementos anteriores darán como resultado la misma salida con sus respectivas identificaciones. Ejemplo:

<dd class="hidden"> <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" /> </dd>

El bucle foreach en el método loadDefaultDecorators() iterativamente aplica $this->_hiddenElementDecorator a cada elemento de formulario oculto cuando se $this->_hiddenElementDecorator el formulario. Si desea aplicar el decorador de elementos ocultos en varios formularios, solo cree una clase principal con la variable $_hiddenElementDecorator y el método loadDefaultDecorators() en ella.

Sin embargo, si está decidido a incluir el elemento de etiqueta ( <dt> ) como se describe en la salida de muestra y aplicar la clase "oculto" para que termine con:

<dt class="hidden">&nbsp;</dt> <dd class="hidden"> <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" /> </dd>

... deberá extender la clase Zend_Form_Decorator_Label y anular el método render (). Eche un vistazo al comentario en el bloque if (null !== $tag) :

class My_Form_Decorator_Label extends Zend_Form_Decorator_Label { public function render($content) { $element = $this->getElement(); $view = $element->getView(); if (null === $view) { return $content; } $label = $this->getLabel(); $separator = $this->getSeparator(); $placement = $this->getPlacement(); $tag = $this->getTag(); $id = $this->getId(); $class = $this->getClass(); $options = $this->getOptions(); if (empty($label) && empty($tag)) { return $content; } if (!empty($label)) { $options[''class''] = $class; $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options); } else { $label = ''&nbsp;''; } if (null !== $tag) { require_once ''Zend/Form/Decorator/HtmlTag.php''; $decorator = new Zend_Form_Decorator_HtmlTag(); // Add ''class'' => ''hidden'' to the <dt> tag decorator options. $decorator->setOptions(array(''tag'' => $tag, ''class'' => ''hidden'')); $label = $decorator->render($label); } switch ($placement) { case self::APPEND: return $content . $separator . $label; case self::PREPEND: return $label . $separator . $content; } } }

Finalmente, para aplicar su nuevo decorador a todos los elementos de formulario ocultos, necesitará agregar el punto de ruta del prefijo de un elemento a su decorador y volver a agregar el decorador de etiquetas a la matriz $_hiddenElementDecorator en la clase TestForm :

class TestForm extends Zend_Form { protected $_hiddenElementDecorator = array( ''ViewHelper'', array(''HtmlTag'', array(''tag'' => ''dd'', ''class'' => ''hidden'')), // Add back the label element. array(''Label'', array(''tag'' => ''dt'', ''class'' => ''hidden'')), ); public function init() { $this->addElement(''hidden'', ''hiddenElement0''); $element = new Zend_Form_Element_Hidden(''hiddenElement1''); $this->addElement($element); } public function loadDefaultDecorators() { foreach ($this->getElements() as $element) { if ($element->getType() === "Zend_Form_Element_Hidden") { $element->setDecorators($this->_hiddenElementDecorator); } } // Add a decorator prefix path pointing to our new nifty decorator. $this->addElementPrefixPath(''My_Form_Decorator'', ''/path/to/Decorator'', Zend_Form_Element::DECORATOR); parent::loadDefaultDecorators(); } }

Tan fácil como un pastel, ¿no?