Vom: 21.04.2012

Captchas von Zend Forms in individuelle Formulargestaltung integrieren.

In Formulare in Pimcore einfach erstellt hatten wir ja schon erläutert, wie man ein Formular "zu Fuss" programmiert und sich nur bei den benötigten Elementen bedient, um so das Formular ganz individuell ohne den Aufwand eigener Decorator zu erstellen. Problem bei der Herangehensweise ist aber, dass Captcha Elemente keine renderViewHelper() Methode kennen und nur über render() ausgegeben werden können. Hierbei werden dann die default-Decorators benutzt, die man dann mit eigenen ersetzen müsste. Um nun alle Elemente des Captchas (Captcha-Bild, Eingabefeld und hidden-field mit "Lösung") auszugeben muss man die Schritte ausführen, die Zend_Form_Decorator_Captcha_Word mittels render() erledigen würde:

    public function render($content)
    {
        $element = $this->getElement();
        $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();

        $hidden = $view->formHidden($hiddenName, $element->getValue(), $element->getAttribs());
        $text   = $view->formText($textName, '', $element->getAttribs());
        switch ($placement) {
            case 'PREPEND':
                $content = $hidden . $separator . $text . $separator . $content;
                break;
            case 'APPEND':
            default:
                $content = $content . $separator . $hidden . $separator . $text;
        }
        return $content;
    }

Interessant sind hier für uns die Codeteile, die sich mit dem Text- und Hiddenfield befassen. Diese bedienen sich anderen View Helpern, nämlich Zend_View_Helper_FormHidden und Zend_View_Helper_FormText, die nur mit geeigneten Parametern wie dem Feldnamen oder zu vererbenden Attributen versorgt werden müssen. Hier ein Beispiel, wie man die Darstellung behandeln kann:

<?php
$formbuilder = new Formbuilder_Frontend();
$form = $formbuilder->getForm("kontakt");
$captcha = $form->getElement("captcha");
$name = $captcha->getFullyQualifiedName(); // Der Name des Eingabefelds
$hiddenName = $name . '[id]'; // Der Name des hidden-fields, erweitert als Array
$textName   = $name . '[input]'; // Der Name des text-fields, erweitert als Array
?>

        <tr>
            <td><?php print $form->captcha->renderLabel() ?></td>
            <td>
              <?php print $form->captcha->renderCaptcha() ?><br>
              <?php print $this->formHidden($hiddenName, $captcha->getValue(), $captcha->getAttribs()); ?>
              <?php print $this->formText($textName, '', $captcha->getAttribs());  ?>
              <?php print $form->captcha->renderErrors() ?></td>
        </tr>