我目前正在尝试构建一个简单的自定义图层,我将扩展而不是Zend_Form。例如,My_Form。
我希望我的所有表单看起来都一样,所以我在My_Form中设置它。这是迄今为止的情况。
class My_Form extends Zend_Form
{
protected $_elementDecorators = array(
'ViewHelper',
'Errors',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
array('Label', array('tag' => 'td')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
);
}
我的所有表格都会扩展这一点。现在这个工作,问题来自$ _elementDecorators数组。我将Label包装在“td”中,Label Decorator将默认的“id”应用于“td”,但我也希望在“td”中添加一个类。
无论如何要用这个数组实现这个目标吗?如果没有,有更好的方法吗?或者如果是这样,有人可以向我描述这个数组是如何工作的吗?
期望的结果:
<tr>
<td class='label_cell'>
<label />
</td>
<td class='value_cell'>
<input />
</td>
</tr>
谢谢。
答案 0 :(得分:1)
我找到了一个解决方案,虽然不确定它是最好的。
在这里,我决定只创建一个自定义装饰器并加载它。
/**
* Overide the default, empty, array of element decorators.
* This allows us to apply the same look globally
*
* @var array
*/
protected $_elementDecorators = array(
'ViewHelper',
'Errors',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
array('CustomLabel', array('tag' => 'td')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr'))
);
/**
* Prefix paths to use when creating elements
* @var array
*/
protected $_elementPrefixPaths = array(
'decorator' => array('My_Form_Decorator' => 'My/Form/Decorator/')
);
装饰:
class My_Form_Decorator_CustomLabel extends Zend_Form_Decorator_Label
{
public function render($content)
{
//...
/**
* Line 48 was added for the cutom class on the <td> that surrounds the label
*/
if (null !== $tag) {
require_once 'Zend/Form/Decorator/HtmlTag.php';
$decorator = new Zend_Form_Decorator_HtmlTag();
$decorator->setOptions(array('tag' => $tag,
'id' => $this->getElement()->getName() . '-label',
'class' => 'label_cell'));
$label = $decorator->render($label);
}
//...
}
}
虽然这很好用,但我仍然很好奇是否有更简单的方法可以做到这一点。
有什么想法吗?
答案 1 :(得分:0)
在处理相同问题时我最终使用的快速黑客:
class My_Form extends Zend_Form
{
protected $_elementDecorators = array(
'ViewHelper',
'Errors',
array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'value_cell')),
array('Label', array('tag' => 'th')),
array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
);
}
不同之处在于:`array('Label',array('tag'=&gt;' th ')),
所以你的“label”列有TH元素,你的元素列有TD元素。
然后你可以根据自己的喜好设计它们。