UPD: решена
— добавлен дополнительный декоратор.
Мне нужно иметь следующий результат:
<dd id="daily_722-element">
<input id="daily_722" type="checkbox" name="daily_722" value="1">
<span> some text </span>
</dd>
Мне нужно иметь «некоторый текст» оборачивается тегами html сразу после флажка, НО до / DD (НЕ после)!
Мой текущий код выглядит следующим образом:
$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">'. $firstName. '</span>');
$chk->getDecorator('label')->setOption('escape', false);
Так что получается:
<dd id="daily_722-element">
<input id="daily_722" type="checkbox" name="daily_722" value="1">
</dd>
И я не могу понять, как добавить дополнительный HTML после флажка … но внутри DD
Вы можете написать собственный декоратор для этого. метод render
получает оригинальный контент и изменяет его, затем возвращает измененный контент.
class MyDecorator extends Zend_Form_Decorator_Abstract
{
public function render($content)
{
return $content . $this->_options['content'];
}
}
И использовать его в построении форм
$form = new Zend_Form();
$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">maxa</span>');
$chk->getDecorator('label')->setOption('escape', false);
$decorators = $chk->getDecorators();
$chk->clearDecorators();
$chk->addDecorator($decorators['Zend_Form_Decorator_ViewHelper']);
$chk->addDecorator(new MyDecorator(array('content' => '<span> some text </span>')));
$chk->addDecorator($decorators['Zend_Form_Decorator_Errors']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Description']);
$chk->addDecorator($decorators['Zend_Form_Decorator_HtmlTag']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Label']);
$form->addElement($chk);
Декораторы ZF1 являются известным источником путаницы. Если вы приложите немного усилий и узнаете, как они создают итоговый HTML-код, довольно просто добиться того, чего вы хотите.
Я предполагаю, что вы не переопределили стандартные декораторы ZF для элемента формы. Затем они (помните, что они выполняются по порядку, изменяя то, что было возвращено предыдущим декоратором):
Теперь вам нужно добавить <span> some text </span>
после ввода (или ошибок / описания), но до того, как dd
, Это означает, что новый декоратор должен быть добавлен в цепочку существующих декораторов в правильном положении.
$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">firstName</span>');
$chk->getDecorator('label')->setOption('escape', false);
// Create a new decorator to render span you need
$postCheckboxDecorator = new Zend_Form_Decorator_Callback(
array(
'callback' => function () {
return '<span>some text</span>';
}
)
);
// Add it into existing chain of decorators, right after ViewHelper
$decorators = $chk->getDecorators();
$decorators = array_slice($decorators, 0, 1, true) +
array('PostCheckboxDecorator' => $postCheckboxDecorator) +
array_slice($decorators, 1, count($decorators) - 1, true);
// Replace element's decorators with a modified chain
$chk->setDecorators($decorators);