Ich habe es versucht und habe es letztendlich auch nicht geschafft, dies mit dem gleichen Ansatz zu erreichen. Es scheint, dass der einfachste Weg, dies zu tun zu tun wäre:
...
$submit->setLabel('<span>My Button</span>');
...
Allerdings wird die Spanne entwertet werden. Es ist durchaus möglich, das Entkommen eines lable Dekorateur auszuschalten, aber das Hinzufügen einer Labeldekorator die Ausgabe falsch, zum Beispiel macht:
$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');
... macht:
<label for="submit" class="optional"><span>My Button</span></label>
<li>
<button name="submit" id="submit" type="submit"><span>My Button</span></button>
</li>
... die ist, abgesehen davon, dass es semantisch inkorrekt (leicht zu reparieren) ist, immer noch den Span Tags innerhalb des Elements.
Also was machst du?
Nun, ich denke, der beste Ansatz (und das ist mein Meta-Ratschlag, wenn es um strenge Kontrolle über Zend_Form Rendering geht) ist die ViewScript Dekorateur verwenden.
$submit = new Zend_Form_Element_Button('submit');
$submit->setLabel('My Button');
$submit->setDecorators(array(array('ViewScript', array('viewScript' => '_submitButton.phtml'))));
$submit->setAttrib('type', 'submit');
... dann in _submitButton.phtml Folgendes definieren:
<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>
Die _submitButton.phtml Datei müssen in einem View Skript-Verzeichnis sein (man könnte am besten sein, das Hinzufügen eine spezielle für Ihre Formular-Dekoratoren mit $view->addScriptPath('/path/to/my/form/decorators')
).
Dies sollte machen, was Sie suchen. Ich habe gerade erst angefangen, den ViewScript-Dekorator aufgrund von Flexibilitätsproblemen in meiner Arbeit zu betrachten.Sie werden feststellen, dass mein Skript nicht so flexibel ist, und es ist sicherlich nicht in BNF, alle Elemente, die für das Element-Objekt aufgefüllt werden können. Das heißt, es ist ein Anfang und es löst Ihr Problem.
Vielen Dank für die sehr detaillierte Antwort. Ich kenne den ViewScript-Decorator, aber ich wusste nicht, dass er auf einzelne Elemente angewendet werden kann. – leek
Das war sehr hilfreich! – markus