Formularerstellung mit Silverstripe

11. Juni 2009

Silverstripe

In einem meiner aktuellen Projekte habe ich mich für die Verwendung des CMS-Systems Silverstripe entschieden. Im Gegensatz zu anderen CMS-Systemen, wie z.B. Typo3 oder Joomla, ist der Einarbeitungaufwand meiner Meinung nach nämlich sehr gering. So ist das Backend z.B. sehr “spartanisch” bzw. übersichtlich gestaltet. Dies hat zur Folge, dass die Redakteure sich sehr schnell in das System einarbeiten konnten. Aber auch für den Webentwickler bietet das System genügend Möglichkeiten, um verschiedenste Anforderungen umsetzen zu können. Dies liegt daran, dass Silverstripe auf einer guten Schichtentrennung basiert und es dem Webentwickler dadurch ermöglicht, das entsprechende Projekt strukturiert aufzubauen.

In dem vorliegenden Artikel möchte ich euch zeigen, wie man mit Silverstripe eine Formularseite erstellt. Dabei werden die folgenden Bereiche angesprochen:

1. Silverstripe – Erstellung eines eigenen Seitentyps

Da wir auf einer Website üblicherweise mehrere Seiten unterschiedlichen Inhalts darstellen wollen, gibt es in Silverstripe das Konzept des Seitentyps. Durch die Verwendung eines Seitentyps können wir u.a. folgende Eigenschaften spezifizieren:

In Silverstripe wird jeder Seitentyp über ein Datenobjekt und einen Controller definiert. Da wir in diesem Beispiel ein Formular erstellen möchten, sollten wir also damit beginnen.
Wir erstellen eine Datei SampleFormPage.php im Verzeichnis mysite/code:

// mysite/code/SampleFormPage.php
 
class SampleFormPage extends Page
{
 
}
class SampleFormPage_Controller extends Page_Controller
{
    function SampleForm()
    {
        return new SampleForm($this,'SampleForm');
    }
}

Die Klasse SampleFormPage können wir in diesem Beispiel vernachlässigen, da wir für diesen Seitentyp keine zusätzlichen Felder (welche dann im Backend des Systems verfügbar wären) benötigen. In unserem Controller hingegen definieren wir die Methode SampleForm, die ein Objekt der Klasse SampleForm liefert. Bei der Instanzierung ist zu beachten, dass wir den zuständigen Controller und den Namen des Formularobjekts übergeben. Letzteres ist nötig, damit wir später bei der Definition unseres Templates genau dieses Objekt ansprechen können.

2. Silverstripe – Erstellung eines Formularobjekts

Um in Silverstripe ein Formularobjekt zu erzeugen, erweitern wir die Form-Klasse und definieren, aus welchen Elementen unser Formular bestehen soll. Silverstripe liefert uns dafür einige vorgefertigte Feldtypen, die wir verwenden können. Ich möchte das Beispiel einfach halten, daher gehe ich hier nicht auf die verschiedenen Typen ein. Für weiterführende Informationen bedient euch bitte der Linkliste am Ende der Seite.
Wenn wir ein Formularobjekt mit zwei Feldern (name, email) erstellen wollen, könnte das entsprechende Objekt wie folgt aussehen:

// mysite/code/SampleForm.php
 
class SampleForm extends Form
{
    function __construct($controller, $name)
    {
        // define form structure
        $fields = new FieldSet(
            new EmailField('email', 'E-Mail'),
            new TextField('name', 'Name')
 
        );
 
        $actions = new FieldSet(
            new FormAction('submit', 'Send')
        );
 
        $requiredFields = new RequiredFields('name', 'email');
 
        parent::__construct($controller, $name, $fields, $actions, $requiredFields);
    }
 
    function forTemplate()
    {
        // define template for rendering
        return $this->renderWith(array(
            $this->class,
            'Form'
        ));
    }
 
    function submit($data, $form)
    {
        // TODO: Implement
    }
}

Auch diese Datei SampleForm.php wird in das Verzeichnis mysite/code gespeichert.

Definition des Formulares im Konstruktor

Im Konstruktor definieren wir unser Formular und statten es mit den bereits erwähnten Feldern aus. Anschließend defineren wir die Formularaktion mittels des Objekts FormAction. Das erste Argument beschreibt dabei die Methode, die beim Absenden des Formulars ausgeführt werden soll. Außerdem legen wir über das Objekt RequiredFields fest, welche Formularfelder als Pflichtfelder anzusehen sind. Beim Rendering werden durch das CMS-System hierbei entsprechende JS-Routinen generiert. Für die serverseitige Validierung bzw. Prüfung muss der Entwickler entsprechend selbst sorgen.

forTemplate

Durch die Methode forTemplate legen wir fest, dass wir unser Formular durch ein eigenes Template rendern lassen möchten. Genau dieses Template legen wir nun fest.

3. Silverstripe – Erstellung eines Formulartemplates

Um die volle Kontroller darüber zu haben wie das Formular dargestellt wird, erzeugen wir ein entsprechendes Template. Die Templates für einen Seitentyp liegen im Ordner templates/layout des verwendeten Theme. Für unseren Seitentyp SampleFormPage legen wir demzufolge eine Datei namens SampleFormPage.ss an. Das Template könnte dann beispielsweise folgenden Inhalt aufweisen:

// templates/layout/SampleFormPage.ss
 
<div id="formContent">
    $SampleForm
</div>

Durch die Anweisung $SampleForm wird das System veranlasst, nach einem weiteren Template zu suchen. Gesucht wird nach unserem benutzerdefinierten Template (SampleForm.ss) zur Formulardarstellung, dass wir im Verzeichnis templates/includes hinterlegen:

// templates/includes/SampleForm.ss
 
<form $FormAttributes>
    <% if Message %>
        <p id="{$FormName}_error" class="message $MessageType">$Message</p>
    <% else %>
        <p id="{$FormName}_error" class="message $MessageType" style="display: none;"></p>
    <% end_if %> 
 
    <fieldset>
        <legend>Kommunikation</legend>
        <label for="{$FormName}_name">Name</label>
        $dataFieldByName(name)
 
        <label for="{$FormName}_email">E-Mail</label>
        $dataFieldByName(email)
 
    </fieldset>
 
    <% if Actions %>
        <div class="Actions">
            <% control Actions %>
                $Field
            <% end_control %> 
        </div>
    <% end_if %>
 
</form>

Die Beschreibung der hier verwendeten Controlls könnt ihr euch in der Dokumentation zu Silverstripe nachlesen. Für das Verständnis des obigen Templates ist meiner Meinung nach nur wichtig, dass ihr über $dataFieldByName auf die im Formularobjekt definierten Formularfelder zugreifen könnt. Das Rendering übernimmt das CMS-System.

4. Silverstripe – Emailversand der Formulardaten

Bleibt nur noch der Versand der Formulardaten per email. Den Versand können wir in der submit-Methode unsere Formularklasse initiieren, denn schließlich haben wir dort den Zugriff auf die abgeschickten Daten:

function submit($data, $form)
{
    // ... validate data ...
 
    // ... send form data ...
    $email = new Email($from, $to, $subject);
    $email->setTemplate('SampleFormEmail');
    $email->populateTemplate($data);
    $email->send();
 
    // ... redirect ...
}

Der Emailversand erfolgt über die Klasse Email, wobei bei der Instanziierung die üblichen Argumente $from, $to und $subject übergeben werden müssen. Der eigentliche Inhalt der email kann über ein entsprechendes Formular gestaltet werden. In diesem Beispiel definieren die Verwendung des Templates SampleFormEmail, das direkt im Templateverzeichnis hinterlegt werden muss. Durch die Anweisung populateTemplate weisen wir das System an, die gesendeten Formulardaten aus $data zu verwenden. Die Daten des assoziativen Arrays $data können dadurch über ihren Schlüssel in Form von $name bzw. $email angesprochen werden.

Ich hoffe, ich konnte mit diesem Artikel dem Einen oder Anderen die Erstellung von Formularen mittels Silverstripe etwas näher bringen.

Literatur & Links