我有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);
}
}
答案 0 :(得分:3)
根据您想要的样本输出,我不清楚为什么要将<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();
}
}
上述两个元素都会产生相同的输出及其各自的ID。例如:
<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
类并覆盖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;
}
}
}
最后,要将新的装饰器应用于所有隐藏的表单元素,您需要将一个元素前缀路径点添加到装饰器中,并将重新添加标签装饰器添加到{{1 $_hiddenElementDecorator
类中的数组:
TestForm
很容易,不是吗?
答案 1 :(得分:0)
这将有助于您: 您还可以指定任何其他属性。
$el = $form->getElement('whatever');
$el->addDecorators(
array('ViewHelper',
array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
array('Label', array('tag' => 'dd ', 'class'=>'hidden')),
));