ZF2: Pflicht-Feld eines Formulars mit Stern markieren

Zend Framework 2.3 bietet bisher leider keine Funktionalität an, um Pflicht-Felder eines Formulars (Zend\Form und Zend\Form\Element) automatisch mit einem Stern zu markieren. Dieser Artikel zeigt Möglichkeiten auf, wie benötigte Formular-Felder bzw. Form-Elemente mit einem beliebigen Zeichen (z.B. einem Stern) gekennzeichnet werden können. Prinzipiell ist hierbei beides Mal ein ViewHelper zu erstellen, der den gewünschten Effekt erzielt, indem er das Label um einen Stern ergänzt.

Beispielsweise sei folgendes Formular-Element gegeben, welches mit 'required' => true als Pflicht-Feld deklariert wurde und anschließend automatisch als benötigtes Feld gekennzeichnet werden soll.

// Irgendwo in einem Controller
$form = new Zend\Form();

// ... konfiguration, etc.

// beliebiges benötigtes element
// muss ausgefüllt werden (required => true)
$form->add(array(
    'type' => 'Zend\Form\Element\Email',
    'required' => true,
    'name' => 'email',
    'options' => array(
        'label' => 'Email'
    ),
));

Einfach: Zend\Form\View\Helper\FormLabel erweitern

Die einfachste Möglichkeit ein benötigtes Formular-Element in Zend Framework mit einem Stern zu markieren besteht darin Zend\Form\View\Helper\FormLabel zu erweitern.

<?php

namespace Application\Form\View\Helper;

use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;

class MarkRequiredWithStar extends OriginalFormLabel
{
    public function __invoke(ElementInterface $element = null,
            $labelContent = null, $position = null)
    {
        // TODO: Alle Zeilen aus __invoke in der Klasse
        // Zend\Form\View\Helper\FormLabel implementieren

        // Setze $required per Standard auf true, falls required nicht existiert
        $isRequiredElement = ($element->hasAttribute('required') ?
            $element->getAttribute('required') : true);      

        if ($isRequiredElement) {
        $labelContent = sprintf(
            // hier wird der Stern oder ein anderes Symbol eingefügt
            '<span class="required-label">(*)</span> %s',
            $labelContent
        );
        }

        return $openTag . $labelContent . $this->closeTag();
    }
}

Dieser ViewHelper ist dann wie gewohnt in der Module.php unter getViewHelperConfig zu verlinken, so dass man ihn in jedem View aufrufen kann. Wie das funktioniert ist am Ende des Artikels beschrieben.

Diese Implementierung ist zwar einfach, hat jedoch den Nachteil, dass bei künftigen Versionen des Zend Framework Änderungen am FormLabel-Helper vorgenommen werden könnten, die dann manuell in die selbst erstellte Klasse kopiert werden müssen. Dies ist umständlich und kann zu einem späteren Zeitpunkt zu Fehlern führen. Die nachfolgende Methode umgeht dieses Problem.

Elegant und sauber: Zend\Form\View\Helper\FormLabel wiederverwenden

Statt den Inhalt der Methode zu kopieren und damit duplizierten und schwer zu wartenden Code zu erzeugen, wird bei dieser Möglichkeit der Implementierung das Problem beseitigt, indem der FormLabel-Helper nicht kopiert sondern einfach wiederverwendet wird. So funktioniert der ViewHelper auch noch, wenn sich die Funktionalität des Zend Framework in kommenden Versionen ändert.

namespace Application\Form\View\Helper;

use Zend\Form\View\Helper\FormLabel as OriginalFormLabel;
use Zend\Form\ElementInterface;

/**
 * Add mark (*) for all required elements inside a form.
 */
class MarkRequiredWithStar extends OriginalFormLabel
{
     /**
     * Invokable
     *
     * @return str
     */
    public function __invoke(ElementInterface $element = null,
           $labelContent = null, $position = null)
    {
        // parent::__invoke() ruft die invoke-Methode aus FormLabel auf
        $originalformLabel = parent::__invoke($element, $labelContent, $position);

        // Setze $required per Standard auf true, falls required nicht existiert
        $isRequiredElement = $element->hasAttribute('required') ?
            $element->getAttribute('required') : true;

        if ($isRequiredElement) {
            // mit Stern markieren
            return '<span class="required-label">(*)</span>' . $originalformLabel;
        } else {
            // normales Label zurückgeben
            return  $originalformLabel;
        }
    }
}

ViewHelper in der Config des Moduls verlinken

Beide Methoden erstellen einen neuen ViewHelper, der anschließend natürlich in der Module.php des jeweiligen Moduls verlinkt werden muss, da er nur so direkt im View aufgerufen werden kann.

// ...
public function getViewHelperConfig()
{
    return array(
        'invokables' => array(
            // ...
            'formlabel' => 'Application\Form\View\Helper\MarkRequiredWithStar',
            // ...
        ),
    );
}
// ...

Benutzt man den Namen des originalen Zend Framework ViewHelper (also formLabel), so wird dieser auch von allen anderen ZF2-ViewHelpern verwendet, die Formulare mit Label anzeigen. So nutzt dann der form-ViewHelper automatisch den neu erstellten Helper zum darstellen von Feldern. Es werden also alle Pflicht-Felder in allen Fomularen mit einem Stern markiert. Bei einem anderen Namen passiert dies natürlich nicht. Der ViewHelper kann natürlich jederzeit auch explizit im View über $this->formLabel($element) oder mit dem entsprechenden Namen aufgerufen werden.

Weitere Informationen:

Karl Lorey Verfasst von:

Karl Lorey studiert Informatik im Master am KIT in Karlsruhe. Er interessiert sich für Webentwicklung und damit verbundene Technologien. Seine Bachelorarbeit mit dem Titel “Gamification Framework for Subjective Assessment of Influence in Online Social Networks” beschäftigt sich mit der Einschätzung von Einfluss und weiteren Eigenschaften in sozialen Netzwerken durch ein von ihm erstelltes “gamifiziertes” Framework.

Ein Kommentar

  1. Gerd
    November 17
    Antworten

    Seltsam, dass das markieren mit einem Stern in Zend Framework noch nicht standardmäßig integriert ist. Danke für den Artikel und die saubere Lösung!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.