Zend Forms (ZF1) Как добавить дополнительный HTML после флажка внутри DD

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

2

Решение

Вы можете написать собственный декоратор для этого. метод 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);
1

Другие решения

Декораторы ZF1 являются известным источником путаницы. Если вы приложите немного усилий и узнаете, как они создают итоговый HTML-код, довольно просто добиться того, чего вы хотите.

Я предполагаю, что вы не переопределили стандартные декораторы ZF для элемента формы. Затем они (помните, что они выполняются по порядку, изменяя то, что было возвращено предыдущим декоратором):

  • ViewHelper (делает вход сам)
  • ошибки (добавляет сообщение об ошибке, если необходимо)
  • Описание (добавляет описание элемента, если установлено)
  • HtmlTag (окружает дд)
  • этикетка (зависит от метки, завернутой в dt)

Теперь вам нужно добавить <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);
1

По вопросам рекламы [email protected]