我正在寻找一种将div中的zend_form表单元素包装起来的方法。 我可以通过使用表单类中的下面的代码来获得所需的结果。
$element->setDecorators(array(
'ViewHelper',
'Description',
'Errors',
array(array('top-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-left')),
array(array('top-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-right')),
array(array('top-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-top-center')),
array(array('bottom-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-left')),
array(array('bottom-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-right')),
array(array('bottom-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-bottom-center')),
array(array('left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-left')),
array(array('right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-right')),
array(array('dd' => 'HtmlTag'), array('tag' => 'dd', 'id' => $element->getLabel().'-element')),
array('Label', array('tag' => 'dt')),
));
我想知道是否可以使用自定义装饰器来实现所需的结果。
上面的代码很容易实现,但必须为每个元素完成。 那么我想,我可以使用自定义装饰器来实现相同的结果吗?
到目前为止,我无法做到,这就是我在这里提出这个问题的原因。
::编辑::
我忘了提到我到目前为止所做的事情。 我一直试图在我的自定义装饰器中分解表单。 但到目前为止我没有运气。
class Form_Decorator_Borders extends Zend_Form_Decorator_Abstract
{
public function render($content)
{
$element = $this->getElement(); // get form
$elements = $element->getElements(); // get form elements
$placement = $this->getPlacement();
$name = htmlentities($element->getFullyQualifiedName());
$id = htmlentities($element->getId());
foreach ($elements as $k => $v) {
if (is_object($v) && get_class($v) == "Zend_Form_Element_Text") {
$elements[$k]->setDecorators(array(
'ViewHelper',
'Description',
'Errors',
array(array('top-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-left')),
array(array('top-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-top-right')),
array(array('top-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-top-center')),
array(array('bottom-left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-left')),
array(array('bottom-right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-corner-bottom-right')),
array(array('bottom-center' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-bottom-center')),
array(array('left' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-left')),
array(array('right' => 'HtmlTag'), array('tag' => 'div', 'class' => 'content-border-right')),
array(array('dd' => 'HtmlTag'), array('tag' => 'dd', 'id' => $elements[$k]->getLabel().'-element')),
array('Label', array('tag' => 'dt')),
));
}
}
$element->setElements($elements);
$this->setElement($element);
$this->setElement($element);
return $this->getElement()->getView()->render($name);
}
}
答案 0 :(得分:1)
使用边框的私有属性更容易创建扩展的Zend_Form类。
class Custom_Form extends Zend_Form
{
/**
* array
*/
private $_borderDecorators = array(/*...*/);
}
对于Custom_Form的元素做下一件事(如果在从Custom_Form扩展的类中设置了装饰器,则有效):
$element->setDecorators($this->_borderDecorators);
答案 1 :(得分:0)
我来使用不同的方法。 这是我目前使用的,到目前为止工作正常。
public function render($content)
{
$innerHTML = "";
//Create a new DOM document
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
//Parse the HTML. The @ is used to suppress any parsing errors
//that will be thrown if the $html string isn't valid XHTML.
@$dom->loadHTML($content);
//Get all inputs. You could also use any other tag name here,
//like 'img' or 'table', to extract other tags.
$eInputs = $dom->getElementsByTagName('input');
//Iterate over the extracted dds
foreach ($eInputs as $eInput) {
if ($eInput->getAttribute('type') == "text") {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($eInput,true));
$innerHTML .= $tmp_doc->saveHTML()." ";
} else if ($eInput->getAttribute('type') == "password") {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($eInput,true));
$innerHTML .= $tmp_doc->saveHTML()." ";
}
}
$inputs = explode(" ", $innerHTML);
foreach ($inputs as $input) {
if (!empty($input)) {
$input = str_replace(">", " />", $input);
$input = substr($input, 0, -1);
$replace = '<div class="content-border-bottom-center">
<div class="content-border-top-center">
<div class="content-border-corner-bottom-right">
<div class="content-border-corner-bottom-left">
<div class="content-border-corner-top-right">
<div class="content-border-corner-top-left">
'.$input.'
</div>
</div>
</div>
</div>
</div>
</div>';
$content = str_replace($input, $replace, $content);
}
}
return $content;
}