Hi!
Ich überlege hin und her und weiss nicht, was die bessere Lösung ist:
Es gibt keinen goldenen Weg. Alles hat seine Vor- und Nachteile. (Und das Thema ist auch nicht neu.)
Es wird ja immer wieder dazu geraten die Struktur einer HTML-Seite von dessen Gestaltung (CSS) zu trennen.
Andere Baustelle.
Dieses Prinzip möchte ich auch auf die Kombination PHP-HTML anwenden.
Das Ergbnis eines PHP-Scripts ist eine Ausgabe (HTML) und ein paar nicht sichtbare Nebenwirkungen (Geschäftslogik).
In meinen Augen sind PHP-Skripte dafür da einen Prozess abzuwickeln, um anschliessend ein Ergebnis zu liefern, dass unabhängig vom Kontext ist und frei von jeglicher Formatierung.
Wenn du das so siehst, dürftest du nur Daten erzeugen. Aber irgendwer muss diese Daten auch wieder in HTML-Form bringen, doch wer soll das tun, wenn nicht ebenfalls PHP? Das Prinzip HTML-CSS-Trennung ist also ganz so einfach nicht auf PHP anwendbar.
Ich finde, dass diese Einstellung PHP-Skripte universeller einzetzbar und pflegeleichter macht.
Das geht nur insofern, als dass du Dinge hast, die wirklich abstrahierbar sind. Diesen Versuch gehen diverse Frameworks. Sie bieten allgemeine Funktionalität ohne ein konkretes Ausgabeergebnis (HTML) oder erzeugen eine generische Ausgabe, die entweder so universell ist, dass sie gut mit CSS angepasst werden kann, oder der Ausgabeteil lässt sich überschreiben, oder sie liefern nur Helper-Funktionen, die man dann von seinem eigenen Template aus aufrufen kann.
Soweit - sogut. Aber jetzt kommt mein Problem: Ich weiss nicht, wie ich den PHP-Return dynamisch in mein HTML-Dokument einbinden soll?!
Das kommt nun darauf an, was du vorliegen hast, wenn es zum Ausgabeteil der Anwendung kommt: reine Daten oder vorgefertigte Ausgabemodule oder beides gemischt.
Das PHP-Skript 'uservalidation.php' gibt bei falscher oder ungültiger Eingabe eine Fehlermeldung aus:
if (empty($_POST['userid']) && $_POST['check'] == 'true') {
$errormessage = 'Bitte geben Sie Ihre Kundennummer und das dazugehörige Passwort ein.';
}
Da ist schon das erste Problem, allgemeiner Natur. Du hast eine Bedingung und legst daraufhin eine Variable an. Trifft die Bedingung nicht zu, existiert die Variable nicht, folgende Lesezugriffe greifen ins Leere und erzeugen Notice-Meldungen (wenn sie bei dir nicht unterdrückt sind).
Wenn du Daten erzeugt (nicht nur solche, die später ausgegeben werden sollen), sorge dafür, dass sie stets vorhanden sind, und sei es auch nur mit einem Default-Wert. Dann können sie dir außerdem auch nicht von anderen Quellen mit ungewünschtem Inhalt angelegt werden (siehe register\_globals).
> $errormessage soll nun ins HTML-Dokument eingebunden werden:
> `<form id="infomaterial" action="[code lang=php]<?php echo $_SERVER['PHP_SELF']; ?>`{:.language-html}" method="post">
> .....
> <input type="submit" class="submit" value="anmelden" />
> <!-- An dieser Stelle könnte die Fehlermeldung kommen -->
> <p class="xy">`<?php echo $errormessage; ?>`{:.language-php}</p>
> </form>[/code]
Kontextgerechte Behandlung beim Einfügen von Werten nicht vergessen. Bitte auch in Beispielen nicht! Das betrifft hier dein action-Attribut und den Fehlermeldungstext.
> Aber was, wenn kein Fehler auftrat? Ist das akzeptabel? Wohl eher unvorteilhaft. Denn diese Ausgabe produziert mir einen Abzatz, den ich eigentlich garnicht haben will!
Ja deshalb gibt es die Möglichkeit der bedingten Ausführung. Wenn keine Fehlermeldungen vorhanden sind, müssen sie weder ausgegeben werden noch die dafür notwendigen HTML-Strukturen.
> Deshalb überlege ich, welche Möglichkeiten ich noch habe. Eine davon wäre, dass ich eine weitere PHP-Datei einbinde, sobald $errormessage gesetzt wurde:
Ob du dich in Dateien verzettelst oder die Ausgabe für ein Modul[\*] in einer Template-Datei bündelst musst du selbst wissen.
[\*] Die einzelnen Module beispielsweise können später im grundlegenden Seitengerüst eingebunden werden.
> Wäre das eine vernünftige Alternative? Bei dieser Variante habe ich nur die Befürchtung, dass ich am Ende immer mehr includes bekomme, dass die ganze Angelegenheit unübersichtlich wird. Es fällt ja öfter das Stichwort "HTML-Template".
PHP ist bereits eine Template-Sprache, die in HTML eingebunden wird. Ob es sinnvoll ist extra noch ein Template-System einzusetzen, kommt auf die konkreten Rahmenbedingungen an.
Versuch erst einmal deinen Programmablauf nach dem EVA-Prinzip zu strukturieren: Eingabedaten behandeln - Verarbeitung - Ausgabe.
Immer wiederkehrende Programmteile lagert man beispielsweise in Funktionen aus. Darin verwendete Variablen kommen auch nicht mit anderen gleichnamigen Variablen in anderen Programmteilen in Konflikt. Include-Dateien mit Geradeaus-Code drin hat das Problem, dass dieser letzlich im globalen Scope ausgeführt wird. Du musst also trotz deines Modularisierungsversuchs per Include-Dateien aufpassen, dass sich die Teile nicht ins Gehege kommen.
Modularisiere / kapsele also erst einmal deine Programmteile mit Funktionen, bevor du daran denkst, sie in Include-Dateien auszulagern.
Fehlermeldungen fallen mitunter mehrere an. Manchmal sind sie allgemeine Meldungen, manchmal beziehen sich sich auf etwas konkretes. manchmal will man sie gebündelt anzeigen, manchmal direkt neben dem zugehörigen Eingabefeld. Deine Verarbeitung legt sie deshalb besser in einer generellen Struktur an, einem Array beispielsweise.
$errors = array();
if (eingabefeldX ist fehlerhaft) {
$errors[eingabefeldX][] = meldung1;
}
if (eingabefeldX ist auch noch anderweitig fehlerhaft) {
$errors[eingabefeldX][] = meldung2;
}
if (eingabefeldY ist fehlerhaft) {
$errors[eingabefeldY][] = meldung;
}
if (allgemeiner Fehler) {
$errors[''][] = meldung;
}
Mehr muss der verarbeitende Teil in Punkto Fehlermeldungen nicht erzeugen. Für die Ausgabe kommt es nun darauf an, welche Art du bevorzugst. Du könntest es so schreiben.
<?php if (!empty($errors)): ?>
<ul class="errors">
<?php foreach($errors as $field\_name => $field\_errors): ?>
...
<?php endforeach; ?>
</ul>
<?php endif; ?>
Du könntest eine Helferfunktion schreiben, die die Ausgabe erzeugt
function errormessage($errors, $field\_name) {
$ausgabe = '';
if (isset($errors[$field\_name]))
foreach ($errors[$field\_name] as $error)
$ausgabe .= sprintf("<foo>...%s...</foo>\n", htmlspecialchars($error));
return $ausgabe;
}
und sie beim Eingabefeld aufrufen
<input name="field\_name" value="...">
<?php echo errormessage($errors, 'field\_name'); ?>
oder, oder, oder.
Dies ist nur ein Beispiel, wie man es in einer recht einfachen Umgebung machen kann. Andere werden ihre eigene Vorgehensweise haben, mit der sie gut fahren.
Lo!