[PHP] Website komplett aus Datenbank

Laß einfach die <br/>s weg, dann hast du schon mal eine saubere Trennung :D
Für die Ausgabe der Fehlermeldung gilt wie für alles, was applikationsseitig zusammengeschustert und en bloc ausgegeben werden soll/muß: einfach vorher zusammenpappen:

PHP:
// immer vorher initialisieren!
$error               = false;
$errormessage = array();

if (empty($firstname))
    {
        $error         = true;
        $errormessage[] = "Bitte gib deinen Vorname ein!";
    }
    elseif (strlen($firstname) < 3)
    {
        $error         = true;
        $errormessage[] = "Dein Vorname ist zu kurz!";
    }
    if (empty($lastname))
    {
        $error         = true;
        $errormessage[] = "Bitte gib deinen Nachnamen ein!";
    }
    elseif (strlen($lastname) < 3)
    {
        $error         = true;
        $errormessage[] = "Dein Nachname ist zu kurz!";
    }
    if (empty($email))
    {
        $error         = true;
        $errormessage[] = "Bitte gib deine E-Mail-Adresse ein!";
    }
    elseif (preg_match($email_pattern, $email) == 0)
    {
        $error         = true;
        $errormessage[] = "Deine E-Mail-Adresse ist ungütig!";
    }
    if (empty($message))
    {
        $error         = true;
        $errormessage[] = "Bitte gib deine Nachricht ein!";
    }
    elseif (strlen($message) < 10)
    {
        $error         = true;
        $errormessage[] = "Deine Nachricht ist zu kurz!";
    }

Was für die <br/>s gilt, gilt auch für Entities wie &uuml;, diese sind sowieso überflüssig und stammen aus Zeiten, als Amerikaner unwillens waren Umlaute auf ihren Tastaturen zu suchen (na gut, der Wille ist immer noch nicht da und Umlaute finden sie auch heute nicht, aber who cares...).

Im Prinzip kannst du auch $error weglassen, da sich in diesem Fall ein Fehler durch den Inhalt von $errormessage herleiten läßt:

PHP:
  if (sizeOf($errormessage)) {
    echo 'Große Kacke am Dampfen!';
  }

Mit der Ausgabe der Fehlermeldung(en) bist du an einer Stelle angekommen, an der du dein Templatesystem um eine Iteration(smöglichkeit) erweitern mußt, d.h. du brauchst ein Mechanismus, um ein Template-Schnipsel mehrere Male hintereinander aufzurufen. Altenativ kannst du auch ein Mini-Template für Fehlermeldungen stricken:

Code:
{ERROR_MESSAGE}<br />

ziemlich klein und eigentlich albern, aber ist der schnellste Weg, um das ganze über die Bühne zu bringen:

PHP:
  // errormessage.tpl enthält den Einzeiler von oben
  $tpl = file_get_contents('errormessage.tpl');

  $errMsg = '';
  if (sizeOf($errormessage)) {
    foreach ($errormessage as $msg)  {
      $errMsg .= str_replace('{ERROR_MESSAGE}', $msg, $tpl);
    }
  }

Wenn $errormessage leer ist, enthält $errMsg nur einen Leerstring, andernfalls die Fehlermeldungen jeweils mit einem <br/> am Ende. Nun kannst du die Meldung (egal ob leer oder nicht) in das eigentliche Template einsetzen, sprich {FORM_ERRORMESSAGE} ersetzen.


Wie du siehst, wird das ganze recht umfangreich und zudem unübersichtlich, damit du nicht in die falsche Richtung rennst, solltest du dir besser vorher einige Template-Systeme anschauen, denn Templates gehören nicht zu den (eigentlichen) Daten und sollten daher von ihnen getrennt werden...

greetings, Keita
 
Vielen Dank nochmals, du bist mir echt eine große Hilfe! :)
Aber noch eine Frage... :)

diese sind sowieso überflüssig und stammen aus Zeiten, als Amerikaner unwillens waren Umlaute auf ihren Tastaturen zu suchen

Heißt das, dass ich diese Entities gar nicht machen muss? Ich hab das mal so gelernt, dass man lieber immer Entities machen soll und nicht Umlaute einfach so schreiben, weil sonst die Gefahr bestünde, dass die Umlaute nicht richtig angezeigt werden.

Aber wenn ich oben jetzt genau den Zeichensatz definiere durch
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
kann ich dann auch einfach die umlaute ausschreiben und sie werden IMMER richtig angezeigt?
 
Ja, sofern du auf einem System arbeitest, was als Zeichensatz ISO 8859-1 (aka Latin1) eingestellt hat, als Alternative ist ISO 8859-15 (aka Latin9) möglich, was im Großen und Ganzen Latin1 entspricht, jedoch zusätzlich u.a. das EUR-Zeichen und ein, zwei frz. Zeichen enthält.
Wenn man den Zeichensatz angibt, mit welchem der Quelltext verfaßt wurde, muß man nur noch zwei Zeichen als Entity schreiben, nämlich das Kaufmanns-Und (&) sowie das Kleiner-als-Zeichen (<), alle anderen Zeichen können - sofern sie im Zeichensatz vorkommen - as-is geschrieben werden.

greetings, Keita
 
ok, dann mal vielen dank für all deine hilfe, sind zwar mittlerweile offtopic hat mich hats echt sehr weitergebracht :)
 
hm.. okay.. nochwas :D

Also.. Das wurde dann ja alles ziemlich umfangreich und so hab ich mich entschlossen ne template klasse zu schreiben.. drei fragen dazu.

1. ich möchte die möglichkeit anbieten, php code im template zu verwenden. allerding funktioniert das nicht... (Syntax: {PHP} hier muss php code stehen {/PHP}
2. ich möchte ebenfalls die möglichkeit zu kommentaren anbieten, die dann im endgültigen template entfernt werden. das funktioniert aber auch nicht... (Syntax: {* hier steht ein kommentar *}

PHP:
    function showTemplate()
    {
        // Entferne die Kommentare aus dem Template.
        $pattern = '#\{\*.*\*\}#';
        $replacement = '';
        preg_replace($pattern, $replacement, $this->template);
        
        // Entferne die {PHP}-Tags und führe den Code dazwischen aus.
        $pattern = '#\{PHP\}(.*)\{/PHP\}#e';
        $replacement = '$1';
        preg_replace($pattern, $replacement, $this->template);
        
        // Gib das Template aus.
        echo $this->template;
    }

hab im php manul folgende Stelle gefunden:
Mit dem Modifikator e wird der Parameter Ersatz nach den entsprechenden Ersetzungen der Referenzen von preg_replace() wie PHP-Code behandelt.


okay, und die dritte frage:
eine schleife erstelle ich auf folgendeweise:

{LOOP:schleifenname}

hier steht html code mit platzhaltern

{/LOOP:schleifenname}

schön und gut, funktioniert auch, nur wie ist das bei ner if-else-Struktur?
manche templateklassen können das doch auch...
aber wie macht man das? weil die bedingung muss doch ins template und muss doch php code sein, aber das will man doch grad vermeiden...
 
Um ehrlich zu sein, von all den Template-Systmen halte ich persönlich überhaupt nichts, weil sie ineffizient, ineffektiv, überladen, unübersichtlich und/oder schlicht überflüssig sind :D
PHP selbst ist eine Template-Sprache und daher liegt es nahe, Templates in PHP zu schreiben:

template.php:
Code:
<html>
  <head>
    <title><?php echo $title; ?></title>
  </head>
  <body><?php echo $body; ?></body>
</html>

PHP:
function showTemplate($title, $body)
{
  include 'template.php';
}

;)

greetings, Keita
 
Hm... ja, okay, gut, dein meinung :) nur ich würd das jetzt halt gern grad fertig machen...
also den einen fehler hab ich schon, ich hatte $this->template = vor den beiden preg_replace's vergessen.


also, die kommentar-geschichte funktioniert jetzt einwandfrei, nur mit dem php-code habe ich immernoch so meine probleme.
also, wenn ich den modifikator e hinter dem suchmuster weglasse, dann gibt er mir schön brav korrekten php-code aus.
aber wieso funktioniert das ganze dann nicht, wenn er ihn auch als php-code ausführen soll mithilfe des modifikators e?

ein beispiel:


HTML:
{PHP} echo "hier steht ein beliebiger text"; {/PHP}
PHP:
$pattern = '#\{PHP\}(.*)\{/PHP\}#';
$replacement = '$1';
$this->template = preg_replace($pattern, $replacement, $this->template);
Code:
Ausgabe:
--------
echo "hier steht ein beliebiger text";


HTML:
{PHP} echo "hier steht ein beliebiger text"; {/PHP}
PHP:
$pattern = '#\{PHP\}(.*)\{/PHP\}#e'; // Man achte auf das e an dieser Stelle ;-)
$replacement = '$1';
$this->template = preg_replace($pattern, $replacement, $this->template);
Code:
Ausgabe:
--------
Parse error: parse error, unexpected T_ECHO in C:\Programmieren\XAMPP\xampp\htdocs\templateclass\templateclass.php(149) : regexp code on line 1

Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Failed evaluating code: echo \'hier steht ein beliebiger text\'; in C:\Programmieren\XAMPP\xampp\htdocs\templateclass\templateclass.php on line 149

Ich verstehe das nicht, denn wenn ich den Modifikator e weglasse, dann kann man ja sehen, dass da eigentlich gültiger PHP-Code steht. Aber wieso produziert der dann mit dem Modifikator e nur Fehlermeldungen?
 
Steht ja in der Fehlermeldung: Failed evaluating code: echo \'hier steht ein beliebiger text\';. PHP maskiert single und double quotes innerhalb des zu evaluierenden Substituendum mit backslashes, so daß am Ende kein valider PHP Code steht, sondern eben sowas wie

echo \'hier steht ein beliebiger text\';

Der einfachste Weg das Problem zu umgehen wäre den zu evaluierenden Code durch eval() zu jagen, was allerdings nah an der Hirnrissigkeit wäre:

PHP:
  $this->template = preg_replace($pattern, 'eval("$1")', $this->template);


greetings, Keita
 
dein php-code funktioniert leider ebenfalls nicht.
ich hab's auf folgende art und weise probiert:
PHP:
$pattern        = '#\{PHP\}(.*)\{/PHP\}#e';
$replacement    = stripslashes(html_entity_decode('$1'));
$this->template = preg_replace($pattern, $replacement, $this->template);
allerdings funktioniert das aucht nicht. in der fehlermeldung kann man immernoch sehen, dass backslashes vorhanden sind. wieso behandeln die funktionen $1 nicht? kann man innerhalb preg_replace keine anderen funktionen schreiben oder was?
 
Der Code an sich funktioniert, nur macht er logischerweise nicht das was du erwartest, weil im Template eine Ausgabe mittels echo erfolgt, echo hat jedoch keinen Rückgabewert und daher wird der Text nur ausgegeben und ersetzt nicht den PHP-Block im Template.

Die Funktionen behandeln $1 und nicht das, was in preg_replace() getrackt wurde, damit letzteres passiert, müßte der ganze Ausdruck als String an $replacement zugewiesen werden:

PHP:
$replacement = 'stripslashes(html_entity_decode("$1"));';

Aber auch das wird nichts bringen, weil der Ausdruck zu

PHP:
stripslashes(html_entity_decode("echo \"hier steht ein beliebiger text\""));

evaluiert, das ergebnis ist das Literal

Code:
echo "hier steht ein beliebiger text"

greetings, Keita
 
Zurück
Oben