Pregunta

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

Todo lo que necesito es adjuntar una clase CSS 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 pude descubrir cómo hacerlo.

Por defecto aparecen de esta manera:

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

Me gustaría que aparecieran de esta manera:

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

De esa manera seguirán 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);
        }
    }
¿Fue útil?

Solución

Según el resultado de muestra deseado, no tengo claro por qué querría incluir el <dt> en elementos ocultos, especialmente porque no estás aplicando ninguna etiqueta, terminan convirtiéndose en marcas innecesarias.Siguiendo el supuesto de que la etiqueta es innecesario, puedes 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 el mismo resultado con sus respectivas identificaciones.Ejemplo:

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

El foreach bucle en el loadDefaultDecorators() El método se aplica iterativamente. $this->_hiddenElementDecorator a cada elemento oculto del formulario cuando se construye el formulario.Si desea aplicar el decorador de elementos ocultos en múltiples formularios, simplemente cree una clase principal con el $_hiddenElementDecorator variables y loadDefaultDecorators() método en él.


Sin embargo, si está decidido a incluir el elemento de etiqueta (<dt>) como se describe en su resultado de muestra y aplicando la clase 'oculta' para terminar con:

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

...necesitarás extender el Zend_Form_Decorator_Label clase y anula el método render().Echa un vistazo al comentario en el if (null !== $tag) bloquear:

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 ocultos del formulario, necesitará agregar el punto de ruta del prefijo de un elemento a su decorador y re añadir el decorador de etiquetas al $_hiddenElementDecorator matriz en el TestForm clase:

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

Fácil como un pastel, ¿no?

Otros consejos

Esto le ayudará a: También puede especificar cualquier otro atributo.

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top