Zend_Form_Decorator – Как добавить атрибут к Zend_Form_Element_Hidden?
-
21-08-2019 - |
Вопрос
У меня есть 2 требования:1) Все скрытые элементы ввода должны быть затронуты без удаления стандартных декораторов.2) Это должно произойти БЕЗ необходимости указывать это для каждого элемента.
Все, что мне нужно, это прикрепить класс CSS к тегам DT и DD, ЕСЛИ тип элемента — Zend_Form_Element_Hidden.
Я пробовал создавать собственные декораторы HtmlTag, DtDdWrapper и FormElement, но не смог понять, как это сделать.
По умолчанию они выглядят так:
<dt> </dt>
<dd><input type="hidden" name="whatever" value="bling" /></dd>
Я бы хотел, чтобы они выглядели так:
<dt class="hidden"> </dt>
<dd class="hidden"><input type="hidden" name="whatever" value="bling" /></dd>
Таким образом, они по-прежнему будут там, где должны быть, но не будут прерывать поток документа.
Пример того, что не сработало:
class My_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper
{
public function render($content)
{
if ($this->getElement() instanceof Zend_Form_Element_Hidden)
{
return '<dt class="hidden"> </dt><dd class="hidden">'.$content.'</dd>';
}
else
{
return parent::render($content);
}
}
Решение
Основываясь на желаемом примере вывода, я не понимаю, почему вы хотите включить <dt>
на скрытых элементах, особенно если вы не применяете никаких меток, они в конечном итоге становятся ненужной разметкой.Если предположить, что метка ненужно, вы можете добиться желаемого эффекта с помощью следующего:
class TestForm extends Zend_Form
{
protected $_hiddenElementDecorator = array(
'ViewHelper',
array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
);
public function init()
{
$this->addElement('hidden', 'hiddenElement0');
$element = new Zend_Form_Element_Hidden('hiddenElement1');
$this->addElement($element);
}
public function loadDefaultDecorators()
{
foreach ($this->getElements() as $element) {
if ($element->getType() === "Zend_Form_Element_Hidden") {
$element->setDecorators($this->_hiddenElementDecorator);
}
}
parent::loadDefaultDecorators();
}
}
Оба вышеуказанных элемента приведут к одному и тому же результату с соответствующими идентификаторами.Пример:
<dd class="hidden">
<input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>
А foreach
петля в loadDefaultDecorators()
метод итеративно применяется $this->_hiddenElementDecorator
к каждому скрытому элементу формы при построении формы.Если вы хотите применить декоратор скрытого элемента к нескольким формам, просто создайте родительский класс с $_hiddenElementDecorator
переменная и loadDefaultDecorators()
метод в нем.
Однако, если вы хотите включить элемент метки (<dt>
), как описано в примере вывода, и применив «скрытый» класс, в результате чего вы получите:
<dt class="hidden"> </dt>
<dd class="hidden">
<input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>
...вам нужно будет продлить Zend_Form_Decorator_Label
class и переопределить метод render().Взгляните на комментарий в if (null !== $tag)
блокировать:
class My_Form_Decorator_Label extends Zend_Form_Decorator_Label
{
public function render($content)
{
$element = $this->getElement();
$view = $element->getView();
if (null === $view) {
return $content;
}
$label = $this->getLabel();
$separator = $this->getSeparator();
$placement = $this->getPlacement();
$tag = $this->getTag();
$id = $this->getId();
$class = $this->getClass();
$options = $this->getOptions();
if (empty($label) && empty($tag)) {
return $content;
}
if (!empty($label)) {
$options['class'] = $class;
$label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options);
} else {
$label = ' ';
}
if (null !== $tag) {
require_once 'Zend/Form/Decorator/HtmlTag.php';
$decorator = new Zend_Form_Decorator_HtmlTag();
// Add 'class' => 'hidden' to the <dt> tag decorator options.
$decorator->setOptions(array('tag' => $tag, 'class' => 'hidden'));
$label = $decorator->render($label);
}
switch ($placement) {
case self::APPEND:
return $content . $separator . $label;
case self::PREPEND:
return $label . $separator . $content;
}
}
}
Наконец, чтобы применить новый декоратор ко всем скрытым элементам формы, вам нужно будет добавить точку пути префикса элемента к вашему декоратору и повторно добавить декоратор этикетки для $_hiddenElementDecorator
массив в TestForm
сорт:
class TestForm extends Zend_Form
{
protected $_hiddenElementDecorator = array(
'ViewHelper',
array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
// Add back the label element.
array('Label', array('tag' => 'dt', 'class' => 'hidden')),
);
public function init()
{
$this->addElement('hidden', 'hiddenElement0');
$element = new Zend_Form_Element_Hidden('hiddenElement1');
$this->addElement($element);
}
public function loadDefaultDecorators()
{
foreach ($this->getElements() as $element) {
if ($element->getType() === "Zend_Form_Element_Hidden") {
$element->setDecorators($this->_hiddenElementDecorator);
}
}
// Add a decorator prefix path pointing to our new nifty decorator.
$this->addElementPrefixPath('My_Form_Decorator', '/path/to/Decorator', Zend_Form_Element::DECORATOR);
parent::loadDefaultDecorators();
}
}
Легко как пирог, не так ли?
Другие советы
Это поможет вам:Вы также можете указать любые другие атрибуты.
$el = $form->getElement('whatever');
$el->addDecorators(
array('ViewHelper',
array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
array('Label', array('tag' => 'dd ', 'class'=>'hidden')),
));