Pregunta

Estoy tratando de eliminar los decoradores por defecto en un elemento de formulario oculto.De forma predeterminada, 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 que ocupan espacio en mi página.Quiero eliminar todos los decoradores por defecto, lo único que me quedo es con la etiqueta de entrada.

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

¿Cómo puedo lograr esto?

¿Fue útil?

Solución

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 envoltorio y etiqueta Dt-Dd.

Otros consejos

De Zend Element Decorators documentación:

  

Los decoradores predeterminados no necesitan ser   Cargado

     

Por defecto, los decoradores predeterminados son   cargado durante la inicialización del objeto.   Puede deshabilitar esto pasando el   Opción 'disableLoadDefaultDecorators'   al constructor:

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

Yo uso esto

$element->removeDecorator('DtDdWrapper');

para deshacerse de las etiquetas dt dd alrededor de elementos específicos

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

Cuando tiene 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');

Como se mencionó en otras publicaciones setDisableLoadDefaultDecorators(true) no funciona si ya están cargadas ... ¡PERO clearDecorators() lo hace!

No pude hacer que disableLoadDefaultDecorators funcione 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 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" />
...

esto es lo que takeme2web de http://www.phpfreaks.com/ foros / index.php? topic = 225848.0 sugiere

$ yourhiddenzendformelement - > setDecorators (array ('ViewHelper'));

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

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

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

Válido en html(5), de aspecto agradable formas.Esto también puede ir en un decorador para los campos ocultos.

EDITAR

Esto es como lo pongo en mi propio elemento de formulario:

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

Use esto:

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

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top