zend framework - Customize zend_form Captcha output? -
i'm using captcha in zend_form.
$captcha_element = new zend_form_element_captcha( 'captcha', array('label' => 'write chars field', 'captcha' => array( 'captcha' => 'image', 'wordlen' => 6, 'timeout' => 300, 'font' => doc_root . '/data/fonts/vera.ttf', 'imgdir' => $imagedir, 'imgurl' => $umageurl ) ) );
this generates:
<dt id="captcha-input-label"> <label for="captcha-input" class="required">write chars 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>
however. - need following instead (captcha elements wrapped tags individually):
<dt id="captcha-input-label"> <label for="captcha-input" class="required">write chars 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>
i can't figure out how this. can accomplish using custom decorators? or woud involve custom captcha ?
it bit tricky, prepared custom captcha element. needed prepare custom captcha decorator. in both cases needed override default render methods in both zend_form_element_captcha
, zend_form_decorator_captcha
. eliminated zend_form_decorator_captcha_word
since incorporated functionality directly my_form_decorator_captcha
. there 2 reasons this. first 1 order of form elements changed, i.e. default img, input hidden, input text input text, img, input hidden. second reason div , span tags needed added.
hopefully, helpful:
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 new decorator 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 order of elements , add div , 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; } }
Comments
Post a Comment