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

Popular posts from this blog

c# - How to set Z index when using WPF DrawingContext? -

razor - Is this a bug in WebMatrix PageData? -

visual c++ - Using relative values in array sorting ( asm ) -