Это было немного сложно, но я подготовил пользовательский элемент Captcha. Мне также нужно было подготовить индивидуальный капча-декоратор. В обоих случаях мне нужно было переопределить методы рендеринга по умолчанию в Zend_Form_Element_Captcha
и Zend_Form_Decorator_Captcha
. Я также исключил Zend_Form_Decorator_Captcha_Word
, поскольку включил его функциональность непосредственно в My_Form_Decorator_Captcha
. Для этого было две причины. Во-первых, изменился порядок элементов формы, то есть по умолчанию img, ввод скрыт, ввод текста в ввод текста, img, ввод скрытого . Вторая причина заключается в том, что теги div и span необходимо добавить.
Надеюсь, они будут полезны:
My_Form_Element_Captcha
class My_Form_Element_Captcha extends Zend_Form_Element_Captcha {
public function render(Zend_View_Interface $view = null) {
$captcha = $this->getCaptcha();
$captcha->setName($this->getFullyQualifiedName());
$decorators = $this->getDecorators();
// BELOW IS WHERE THE NEW DECORATOR IS USED
$decorator = new My_Form_Decorator_Captcha(array('captcha' => $captcha));
array_unshift($decorators, $decorator);
$decorator = $captcha->getDecorator();
$this->setDecorators($decorators);
$this->setValue($this->getCaptcha()->generate());
return Zend_Form_Element::render($view);
}
}
My_Form_Decorator_Captcha
class My_Form_Decorator_Captcha extends Zend_Form_Decorator_Captcha {
public function render($content) {
$element = $this->getElement();
if (!method_exists($element, 'getCaptcha')) {
return $content;
}
$view = $element->getView();
if (null === $view) {
return $content;
}
$name = $element->getFullyQualifiedName();
$hiddenName = $name . '[id]';
$textName = $name . '[input]';
$label = $element->getDecorator("Label");
if ($label) {
$label->setOption("id", $element->getId() . "-input");
}
$placement = $this->getPlacement();
$separator = $this->getSeparator();
$captcha = $element->getCaptcha();
$markup = $captcha->render($view, $element);
$hidden = $view->formHidden($hiddenName, $element->getValue(), $element->getAttribs());
$text = $view->formText($textName, '', $element->getAttribs());
// CHANGE THE ORDER OF ELEMENTS AND ADD THE div AND span TAGS.
switch ($placement) {
case 'PREPEND':
$content = '<div><span>' . $text . '</div></span>' .
'<div><span>' . $markup . $hidden . '</div></span>' .
$separator . $content;
break;
case 'APPEND':
default:
$content = $content . $separator .
'<div><span>' . $text . '</div></span>' .
'<div><span>' . $markup . $hidden . '</div></span>';
}
return $content;
}
}