Sta*_*ann 9 zend-framework zend-form zend-form-element
我在我的zend_form中使用验证码.
$captcha_element = new Zend_Form_Element_Captcha(
'captcha',
array('label' => 'Write the chars to the field',
'captcha' => array(
'captcha' => 'Image',
'wordLen' => 6,
'timeout' => 300,
'font' => DOC_ROOT . '/data/fonts/Vera.ttf',
'imgDir' => $imagedir,
'imgUrl' => $umageurl
)
)
);
Run Code Online (Sandbox Code Playgroud)
这会产生:
<dt id="captcha-input-label">
<label for="captcha-input" class="required">Write the chars to the field</label>
</dt>
<dd id="captcha-element">
<img width="200" height="50" alt="" src="http://sitename.com/captcha/09dd951939c6cdf7fa28f2b7d322ea95.png">
<input type="hidden" name="captcha[id]" value="09dd951939c6cdf7fa28f2b7d322ea95" id="captcha-id">
<input type="text" name="captcha[input]" id="captcha-input" value="">
</dd>
Run Code Online (Sandbox Code Playgroud)
然而. - 我需要跟随(captcha元素分别包含在一些标签中):
<dt id="captcha-input-label">
<label for="captcha-input" class="required">Write the chars to the field</label>
</dt>
<dd id="captcha-element">
<div><span>
<input type="text" name="captcha[input]" id="captcha-input" value="">
</span></div>
<div><span>
<img width="200" height="50" alt="" src="http://sitename.com/captcha/09dd951939c6cdf7fa28f2b7d322ea95.png">
<input type="hidden" name="captcha[id]" value="09dd951939c6cdf7fa28f2b7d322ea95" id="captcha-id">
</span></div>
</dd>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚我该怎么做.我可以通过使用一些自定义装饰器来完成这个吗?或涉及自定义验证码的woud?
Mar*_*cin 10
这有点棘手,但我准备了一个自定义的Captcha元素.我还需要准备自定义的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);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4078 次 |
| 最近记录: |