Rolf B: Input-Feld und dessen PHP-Prüfung objektorientiert?

Beitrag lesen

Hallo Linuchs,

[feld_email_required]

Wenn Du sowas bauen willst, dann sollte im Template sowas stehen wie [object:EMailRequired] und EMailRequired sollte der Name der Klasse sein, die das behandelt.

Wenn Du das Template interpretierst, dann findest Du ein object-Feld und weißt: Aha, ich muss ein Objekt der Klasse erzeugen, die hier angegeben ist.

Ich würde Dir empfehlen, diese Template-Klassen in einen PHP Namespace zu legen:

<?php
namespace FeldTemplate;

public class EMailRequired : AbstractTemplate 
{
}

Damit ist sichergestellt, dass deine Templatenamen nicht mit anderen Klassen im System kollidieren.

Zurück zur Erzeugung. Du kannst einen generischen Autoloader für Klassen verwenden, der den Sourcecode der Klasse FeldTemplate\EMailRequired automatisch als EMailRequired.php im Ordner FeldTemplate sucht. Andernfalls machst Du das manuell, indem Du an der Stelle, wo Du das EMailRequired Template brauchst, den passenden require_once ausführst und danach das Objekt mit new erzeugst. Du kannst auch vorher mit class_exists abfragen, ob der require_once überhaupt nötig ist, aber ich glaube, das ist überflüssig.

Das so erstellte Objekt hat mehrere Aufgaben.

(1) Generieren des erforderlichen HTML für dieses UI Element (2) Durchführen der fachlichen Prüfungen beim Empfang von Daten für dieses UI Element.

Teil 1 ist relativ simpel, weil Du beim Erzeugen der HTML Seite genau weißt, dass ein [object:Foo] Feldmuster angefordert wurde. Da ist

$compName = "FieldTemplate\$template";
$component = new $compName();
$component->render();

Du wirst da sicher noch mehr Infos brauchen, bspw. braucht ein Eingabefeld auch einen Namen und einen Labeltext, die sollten im Template stehen.

[object:EMailRequired|name=email]

Auf diese Weise kannst Du deine Bausteine auch allgemeingültiger halten. Dass es eine requiredEmail ist, muss gar nicht ein spezielles Template bedeuten. Es kann auch ein generisches Makro für Eingabefelder sein:

[object:Textfeld|type=email|name=email|label=EMail-Adresse]

Da hast Du Freiraum zum Spielen, um eine für Dich brauchbare Vorgehensweise zu finden. Die Argumente hinter object:Textfeld sollte deine Template-Engine automatisch in ihre Teile zerlegen und der Klasse als Optionsarray bereitstellen.

Aber dann - wie transportiert man das zur Antwort. Letztlich musst Du für jedes so erzeugte Feld, das im Form ist, das Template-Objekt neu erzeugen, wenn der POST hereinkommt. D.h. Du musst wissen, welche Template-Objekte Du hast und wie sie erzeugt wurden.

Ein System wie ASP.NET macht sowas ähnliches; es liest die ASPX Seite vor dem Empfang eines POST erstmal wieder ein und baut das komplette Seitenobjektmodell neu auf. Und dieses Objektmodell konsumiert dann den POST Request. Aufwändig. Du könntest aber auch ein Array mit den Template-Informationen (also das [object:Textfeld|...] Geraffel) in ein Array schreiben, dieses Array serialisieren, irgendwie signieren (damit es Dir keiner fälscht), base64-codieren und als hidden input ins Form packen. Die Session ist dafür nicht unbedingt geeignet, das gibt Chaos falls ein User die Seite in zwei Browsertabs offen hat. Dann weißt Du beim POST, welche objektorientierten Bausteine drin sind.

Damit hast Du jetzt erstmal Stoff zum grübeln, denke ich. Selbst gebaut habe ich sowas noch nicht, aber so würde mein Konzept aussehen.

Rolf

--
sumpsi - posui - obstruxi