Lo he intentado y, en última instancia, no lo logré usando el mismo enfoque. Parecería que la manera más fácil de hacer esto sería hacer:
...
$submit->setLabel('<span>My Button</span>');
...
Sin embargo, se escapó del tramo. Es perfectamente posible para apagar el escape de un decorador lable, sin embargo, la adición de un decorador etiqueta hace que la salida de forma incorrecta, por ejemplo:
$decorator = array(
array('ViewHelper'),
array('HtmlTag', array('tag' => 'li')),
array('Label', array('escape' => false))
);
$submit = new Zend_Form_Element_Button('submit');
$submit->setLabel('<span>My Button</span>');
$submit->setDecorators($decorator);
$submit->setAttrib('type', 'submit');
... renders:
<label for="submit" class="optional"><span>My Button</span></label>
<li>
<button name="submit" id="submit" type="submit"><span>My Button</span></button>
</li>
... lo cual además de ser semánticamente incorrecto (fácil de reparar), sigue escapándose de las etiquetas de tramo dentro del elemento.
¿Qué haces?
Bueno, creo que el mejor enfoque (y este es mi consejo cuando se trata de un control estricto sobre el renderizado Zend_Form) es utilizar el decorador ViewScript.
$submit = new Zend_Form_Element_Button('submit');
$submit->setLabel('My Button');
$submit->setDecorators(array(array('ViewScript', array('viewScript' => '_submitButton.phtml'))));
$submit->setAttrib('type', 'submit');
... entonces en _submitButton.phtml defina lo siguiente:
<li>
<?= $this->formLabel($this->element->getName(), $this->element->getLabel()); ?>
<button
<?php
$attribs = $this->element->getAttribs();
echo
' name="' . $this->escape($this->element->getName()) . '"' .
' id="' . $this->escape($this->element->getId()) . '"' .
' type="' . $this->escape($attribs['type']) . '"';
?>
<?php
$value = $this->element->getValue();
if(!empty($value))
{
echo ' value="' . $this->escape($this->element->getValue()) . '"';
}
?>
>
<span>
<?= $this->escape($this->element->getLabel()); ?>
</span>
</button>
</li>
El _submitButton.phtml archivo tendrá que estar en un directorio script de vista (que podría ser mejor añadiendo uno específico para sus decoradores de formularios usando $view->addScriptPath('/path/to/my/form/decorators')
).
Esto debería representar lo que estás buscando. Acabo de comenzar a buscar en el decorador de ViewScript debido a problemas de flexibilidad que estoy experimentando en el trabajo.Notarás que mi script no es tan flexible, y ciertamente no está en BNF, dado que todos los miembros se pueden completar en el objeto del elemento. Dicho eso, es un comienzo y resuelve tu problema.
Gracias por la respuesta detallada. Soy consciente del decorador de ViewScript, pero no sabía que podría aplicarse a elementos individuales. – leek
¡Esto fue muy útil! – markus