php html output
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
ausgeben
code
datum
email
fehler
funktion
header
http
index
info
lernen
output
sache
schauen
teil
test
trennen
url
versuchen
-
Hallo,
ich arbeite gerade an einem neuen Projekt und habe vor hier neugelernte Sachen anzuwenden wie Exceptions, vernünftiges Error Handling, etc. Bisher habe ich z.B. sowas:
if(!empty($_POST['username']) && !empty($_POST['password']) && !empty($_POST['password2']) && !empty($_POST['email'])) { // If data is given $User = $Database->Link->real_escape_string($_POST['username']); $PW = $Database->Link->real_escape_string($_POST['password']); $PW2 = $Database->Link->real_escape_string($_POST['password2']); $eMail = $Database->Link->real_escape_string($_POST['email']); if($PW === $PW2) { // Both passwords were the same, so go and insert the new user into the database try { $Database->Query("INSERT INTO users(name,email,password,hash) VALUES ('$User','$eMail','$PW','test')"); $Info = "Ihr Benutzername wurde angelegt. Sie können sich nun einloggen!"; $Basic->InfoOutput($Info); } catch(Exception $e) { // When the Query failed, catch it and log Errors $Basic->ErrorLog($e->getMessage(),$e->getCode(),"REGISTER"); $Info = "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es nochmal!"; $Basic->InfoOutput($Info); } } else { // Passwords didn't match, output info $Info = "Ihre Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass sie beide Male das selbe Passwort eingegeben haben!"; $Basic->InfoOutput($Info); } } else { // No data given, show form echo ' <form action="index.php?s=register" method="POST"> Benutzername: <input type="text" name="username" /><br /> Passwort: <input type="password" name="password" /><br /> Passwort wiederholen: <input tpye="password" name="password2"><br /> eMail Adresse: <input type="text" name="email"><br /> <input type="submit" value="Registrieren"> </form> '; }
und
class Basic { public function InfoOutput($Info,$AdditionalData = false) { // Basic function to output Info to the User, can add additional Data to describe the problem echo '<div class="InfoOutput">' . $Info . '</div>'; if($AdditionalData !== false) { // If there is some additional Data, output it as well echo '<div class="InfoOutput">' . $AdditionalData . '</div>'; } } public function ErrorLog($Error,$ErrorCode = "undefined",$Content = "undefined") { // Basic function to log Errors $Time = time(); $Message = " Error: $Error <br /> ErrorCode: $ErrorCode <br /> Content: $Content <br /> User: --- <br /> Time: $Time <br /><br /> "; error_log($Message,3,"errors/exceptions.txt"); } }
Klappt bisher alles ganz gut, wenn ich Informationen an den User ausgeben möchte, habe ich dafür eine Funktion, wenn Fehler auftreten, kann ich diese catchen und die Fehler vernünftig loggen. Was mich jetzt noch stört ist, dass ich HTML Code in meinem PHP Code nach wie vor mit echo "<ganzvielhtml>"; ausgebe. Das sieht irgendwie unschön aus und da ich versuche neue Sachen zu lernen wüsste ich jetzt gerne ob es andere Möglichkeiten gibt das auszugeben, andere Möglichkeiten gibt Content von Verarbeitungslogik zu trennen. Klar, ich könnte es mit der Heredoc Syntax ausgeben, die mag ich aber nicht, dann könnte ich es noch mit dieser Kurzfarm <?= $test => ausgeben, die ist aber pre 5.4 nicht standardmäßig aktiviert. Wie würdet ihr hier jetzt eine Funktion schreiben, die einfach und gut den gewünschen HTML Code ausgibt und es dabei bewerkstelligt Content von Verarbeitungslogik zu trennen?
Danke. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
midwar schrieb:
Spontan fallen mir dazu die Output-Control-Funktionen ein. Damit könntest du die Ausgabe in eine andere Datei auslagern, deren Ausgabe "abfangen" und anschließend komplett ausgeben:
Was mich jetzt noch stört ist, dass ich HTML Code in meinem PHP Code nach wie vor mit echo "<ganzvielhtml>"; ausgebe. Das sieht irgendwie unschön aus und da ich versuche neue Sachen zu lernen wüsste ich jetzt gerne ob es andere Möglichkeiten gibt das auszugeben, andere Möglichkeiten gibt Content von Verarbeitungslogik zu trennen.
ob_start(); include('path/content.php'); echo ob_get_clean();
Ob es sich dabei um eine besser Option zur "normalen" Ausgabe des Inhalts handelt, stelle ich allerdings infrage.
Beitrag zuletzt geändert: 15.2.2013 13:03:34 von ploco -
Content und Verarbeitungslogik trennt man meistens über sogenannte Template Engines. So kannst du den Controller über bestimmte Modelle Daten laden lassen, sie zusammen hängen und dann als Rohdaten zur Template Engine geben. Die Template Engine packt die Daten dann in eine Form, wie der Browser sie Lesen kann, mit HTML usw.
Da das ganze ein bisschen Umfangreicher ist kannst du dannach googln, oder hier mal schauen: http://tut.php-quake.net/de/template.html, das gibt einen ganz groben Einblick, wie so eine Templateengine funktionieren kann, und wie du A von B trennst.
Liebe Grüße -
ploco schrieb:
bei logisch durchdachter programmaufbau ist jeder kram von 'ob_*', '(f)write' oder 'echo' obsolet! kurz: unding! schrott!
... Ob es sich dabei um eine besser Option zur "normalen" Ausgabe des Inhalts handelt, stelle ich allerdings infrage.
ggamee schrieb:
dein zitat in gottes ohren!
... Da das ganze ein bisschen Umfangreicher ist kannst du dannach googln, oder hier mal schauen: http://tut.php-quake.net/de/template.html, das gibt einen ganz groben Einblick, wie so eine Templateengine funktionieren kann, und wie du A von B trennst.2. Templatesysteme in PHP
leider daselbst geht es dann furchtbar daneben!
... In den meisten Fällen wird jedoch vergessen das PHP selbst bereits eine Templateengine ist.PHP wurde so entwickelt dass es zwischen HTML-Code verwendet werden kann, daher auch die PHP Start- und Endtags <?php und ?>.
oh graus!!!! beste grundlage für mediterranes essen! spaghetti(code ;) gesegnete mahlzeit!
midwar schrieb:
... Klappt bisher alles ganz gut, wenn ich Informationen an den User ausgeben möchte, habe ich dafür eine Funktion, wenn Fehler auftreten, kann ich diese catchen und die Fehler vernünftig loggen. Was mich jetzt noch stört ist, dass ich HTML Code in meinem PHP Code nach wie vor mit echo "<ganzvielhtml>"; ausgebe. Das sieht irgendwie unschön aus und da ich versuche neue Sachen zu lernen wüsste ich jetzt gerne ob es andere Möglichkeiten gibt das auszugeben, andere Möglichkeiten gibt Content von Verarbeitungslogik zu trennen. Klar, ich könnte es mit der Heredoc Syntax ausgeben, die mag ich aber nicht, dann könnte ich es noch mit dieser Kurzfarm <?= $test => ausgeben, die ist aber pre 5.4 nicht standardmäßig aktiviert. Wie würdet ihr hier jetzt eine Funktion schreiben, die einfach und gut den gewünschen HTML Code ausgibt und es dabei bewerkstelligt Content von Verarbeitungslogik zu trennen?
ja also das hier<?= $test =>
ist das alle schlimmste! (erstens restlos veraltet!) sonst:
sehr vernünftig - zum teil. mal abgesehen davon, dass du heredoc wie butter am brot brauchst! die einzig richtige, weil kürzeste möglichkeit vorformatierte texte mit variablen zu spicken (was dann gleichzeiteg jeden müll von template engine restlos zu beseitigen hilft!).
hier kann man natürlich nur ein rudimentäres gerüst angeben, die auszuschmücken gilt ;)
und das geht so:
1. filesystem (worüber man natürlich herrlich streiten kann ;)
2. index.phpbash-4.2$ tree . ├── c (c-wie content) │ └── hier-statische-contents ! ├── i (i-wie include) │ ├── hier-includes-auch-js-&c-ausgelagert ! │ ├── globals.php │ ├── html.php │ ├── make_sections.php │ └── nav.php ├── index.php (das einzig wahre, was dann das ganze unhel verrichtet ;) └── s └── hier-styles !
<?php require_once './i/globals.php';
das ist alles! mehr braucht wirklich kein 'programm' auf der welt! (es wird gestartet! ;)
2. './i/globals.php'<?php # ---- constanten u. variablen deklarieren ------------------------------------- $charset = 'utf-8'; $title = array('titlebar'=>'title tilebar', 'sec_1'=>'section 1 title'); $header = array('body'=>'bodytitle', 'art_1'=>'article 1 title'); $htmlvali = '<a href="http://validator.w3.org/check?uri=http%3A%2F%2Fczibere.lima-city.de%2F_forum%2Fmidwar%2Fphp-html-output%2Findex.php" target="_blank">HTML5</a>'; // $cssvali = ... # ---- dynamische elemenrte einbinden ------------------------------------------ require_once './i/nav.php'; require_once './i/make_sections.php'; // kumuliert daten für $section1, 2, ...n # ---- seite rendern ----------------------------------------------------------- require_once './i/html.php';
auch nicht gerade viel! sollte als geschäftslogik betrachtet werden. von da aus sind alle teile (mehrfach) ausgelagert.
3. './i/nav.php' (sagt eigentlich alles)<?php $nav = <<< EOT <ul> <li> <a href="#">nav_1</a> </li> <li> <a href="#">nav_2</a> </li> <li> <a href="#">nav_3</a> </li> </ul> EOT;
dass man weiterkommt ;) nun klar! so einfach ist das auch wieder nicht! das ist hir nur ein platzhalter, das original sollte wirklich um alle details für das menu sorgen! natürlich ohne echo o. so!
4. './i/make_sections.php'. um das zu beschreiben übergeht diese seite! aber rein shematisch in etwa so:<?php $cestion = array(<<< EOT <p>das ist section_1</p> EOT ,<<< EOT <p>das ist section_2</p> EOT ,<<< EOT <p>das ist section_3</p> EOT );
auch das ist ein platzhalter. für alle teile sollte extra aufwand getrieben werden. (sonst bleib es soschön statisch, wie es hier ist ;) natürlich ohne echo o. so!
danach bleibt nur mehr die anzeige der ganzen fertigen seite (manche, die gerne nach klugen leuten gedanken nachsprechen, nennen es 'template engine'. ich spreche hier - was meine lösung betrifft - von 'untemplate engine').<?php # ---- ganze (fertige) seite ausgeben ------------------------------------------ exit(<<< EOT <!DOCTYPE html> <html> <head> <meta charset="$charset"> <title>{$title['titlebar']}</title> <!-- ... nach bedarf weitere head-eintragungen --> </head> <body> <header><h1>{$header['body']}</h1></header> <nav id="nav"> $nav </nav> <article id="art_1"> <header><h2>{$header['art_1']}</h2></header> <section id="sec_1"> {$cestion[0]} </section> <section id="sec_2"> {$cestion[1]} </section> <section id="sec_3"> {$cestion[2]} </section> </article> <!-- ... nach bedarf weitere articles --> <footer id="footer"> <hr />© czibere, 1998 - 2013 <strong>'Untemplate Engine'</strong> | $htmlvali, CSS3 </footer> </body> </html> EOT );
ja. und spätesten jetzt ist es klar, dass das ganze da oben ohne ein eiziges echo o. (f)print auskommt. außerdem fehlen noch solch 'schöne' elemente von php wieecho '<... blaaa...> <\"extrablaaa\">...' . $variable_blaaa . '<... blaaa weiter ...>; // blaaa blaaa blaaa ... <?php // hier php blaaa } // wenn man noch überblickt, wo '{' sich befand ;) ?> <!-- hier html blaaa -->'
&c.!
Beitrag zuletzt geändert: 16.2.2013 6:33:41 von czibere -
Und nun merkt man, welch Aufwand OOP ist und wieviele unnötige Funktionen in den Arbeitsspeicher des Servers geladen werden.
Es gibt verschiedene Methoden eine eigene Template engine aufzubauen.
Selbst das Template kann man als Funktion programmieren und dann wirklich in alle Teile, die benötigt werden, wie Formulare usw. splitten. In PHP-Fusion wurde dies zum Teil umgesetzt, da kann man sich dann nochmal eine andere Herangehensweise anschauen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage