Я пытался и, в конечном счете, не смог достичь этого сам, используя тот же подход. Казалось бы, самый простой способ сделать это будет сделать:
...
$submit->setLabel('<span>My Button</span>');
...
Однако интервал будет экранирован. Вполне возможно отключить экранирование метки декоратора, однако при добавлении декоратора меток выходные данные отображаются неправильно, например:
$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');
... рендеринг:
<label for="submit" class="optional"><span>My Button</span></label>
<li>
<button name="submit" id="submit" type="submit"><span>My Button</span></button>
</li>
... который, помимо семантически неверного (легко исправимого), все еще экранирует теги span внутри элемента.
Так что вы делаете?
Ну, я думаю, что лучший подход (и это мой мета-совет, когда дело доходит до жесткого контроля над рендерингом Zend_Form) - это использовать декоратор 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');
... затем в _submitButton.phtml определите следующее:
<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>
Файл _submitButton.phtml должен находиться в каталоге скриптов вида (возможно, лучше всего добавить определенный для декораторов форм, используя $view->addScriptPath('/path/to/my/form/decorators')
).
Это должно сделать то, что вы ищете. Я только начал смотреть на декоратор ViewScript из-за проблем с гибкостью, с которыми я сталкиваюсь в работе. Вы заметите, что мой сценарий не такой гибкий и, конечно, не в BNF, учитывая все элементы, которые могут быть заполнены в объекте element. Тем не менее, это начало, и это решает вашу проблему.