borisbaer: PHP in HTML

Hallo zusammen,

ich bin dazu übergegangen, PHP für sich wiederholende Elemente meiner Webseite zu verwenden, um flexibler bezüglich zukünftiger Änderungen zu sein. In Ermangelung eines besseren Wortes nenne ich diese Elemente einmal PHP-Strings.

Als Beispiel habe ich auf diesem Screenshot markiert, welche Elemente auf dieser Seite durch PHP eingefügt werden.

Nun kommen da recht viele PHP-Passagen im HTML-Code zusammen, weshalb ich nachfragen möchte, ob diese Methode irgendwelche Nachteile hat, von denen ich nichts weiß.

Je nachdem, ob es sich um reinen HTML-Code handelt oder das einzubindende Element selbst noch PHP-Code enthält, verwende ich entweder die readfile- oder include-Funktion.

Beispiele:

<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/common/strings/bestiarium/questbezug.html"; readfile($path); ?>
<?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/pages/inventar/materialien/alchemie/giftloesungsmittel/fett.php"; include($path); ?>

Da die Webseite eine Art Wiki sein soll, ist sie auf viel content ausgelegt. Sobald der jedoch da sein sollte, möchte ich eine Möglichkeit haben, etwaige Änderungen (zum Beispiel eine Namensänderung einer sich wiederholenden Überschrift) dynamisch für alle Seiten durchführen zu können.

Ich wäre froh und dankbar, eure Meinung dazu zu hören!

Boris

  1. Hallo borisbaer,

    Nun kommen da recht viele PHP-Passagen im HTML-Code zusammen, weshalb ich nachfragen möchte, ob diese Methode irgendwelche Nachteile hat, von denen ich nichts weiß.

    Das Generieren der Seiten dauert minimal länger. Bei einer nicht allzu stark besuchten Seite ist das aber zu verschmerzen, bzw. du könntest mit Caching entgegensteuern.

    Grundsätzlich ist es ein guter Ansatz, häufig benutzte Inhalte zentral zu verwalten, das erleichtert – je nach Umsetzung – die Wartbarkeit. Wie fein man das zerteilen kann, ohne dass es dann wieder unübersichtlich wird, ist dann Erfahrungssache. Für einzelne Überschriften würde ich diese allerdings in eine Datei packen und nur diese einlesen, dann müssen zum Generieren einer Seite nicht x Dateien geöffnet werden. Hier ist vielleicht auch das neue Tutorial im Wiki zur Datenspeicherung für dich interessant.
    Als Bonus könntest du dann später die Website relativ leicht auch in anderen Sprachen anbieten.

    <?php $path = $_SERVER['DOCUMENT_ROOT']; $path .= "/common/strings/bestiarium/questbezug.html"; readfile($path); ?>
    

    Ansonsten würde ich persönlich das kürzer schreiben:

    <?php readfile($_SERVER['DOCUMENT_ROOT'].'/common/strings/bestiarium/questbezug.html'); ?>
    

    Ich meine auch, dass es mal Ärger mit $_SERVER['DOCUMENT_ROOT'] gab, weil das sich von Server zu Server unterscheiden kann. Persönlich würde ich eher __DIR__ benutzen, zumal das auch dann funktioniert, wenn du PHP ohne Webserver, beispielsweise auf der Kommandozeile benutzt.

    Gruß
    Julius

  2. Hallo borisbaer,

    was steht denn in /common/strings/bestiarium/questbezug.html drin? Nur das Wort "Questbezug"? Und was passiert, wenn Du den Inhalt von questbezug.html änderst in "Vorkommen in Abenteuer" oder sowas? Die Datei heißt dann immer noch "Questbezug.html" und irgendwann kommst Du durcheinander.

    Eine solche Textauslagerung ergibt Sinn, wenn Du z.B. Mehrsprachigkeit anstrebst. Tust Du das?

    Für Mehrsprachigkeit geht man eigentlich so vor, dass man sich mit define eine Menge von Symbolen erstellt, die für Begriffe auf der Seit stehen.

    define("L_QUESTREF", "QUESTREF");
    

    Und es gibt einige Include-Dateien, die diesen Symbolen Texte zuordnen, und zwar über ein assoziatives Array:

    $language = ARRAY(
       L_QUESTREF => "Questbezug"
    );
    

    Auf der eigentlichen Seite steht dann

    <?php
    // hier $lang festlegen, z.B. durch Userpräferenz
    
    require "languages.inc";
    require "language_$lang.inc";
    ?>
    
    <h1><?= $language[L_QUESTREF] ?>
    

    Das ist jetzt eine primitive Möglichkeit und denkt lange nicht alle Eventualitäten ab.

    Wenn es Dir darum NICHT geht, solltest Du eher auf Templates umstellen. Du möchtest für viele Spielobjekte eine Beschreibung und einen Questbezug anzeigen? Dann baue eine entsprechende Variable auf und include den Baustein, der das anzeigt. Man kann sowas eigentlich sehr schön objektorientiert machen, aber da weiß ich nicht wie weit Dich das überfordert.

    $TDATA = ARRAY(
       "TITEL" => "Weberin Ulfaduug",
       "BESCHREIBUNG" => "Weberin Ulfaduug ist eine " 
              . "<a href='/foo/bar/spinnendaedra.php'>Spinnendeadra</a>, "
              . "die sich im " 
              . "<a href='/baz/muh/spiralstrang.php'>Spiralstrang</a> "
              . "- einem Teil von...",
       "QUESTREF" => ARRAY(
          ARRAY("HREF"=>"/foo/bar/darkveilphp",
                "NAME"=>"Durch einen dunklen Schleier")
       )
    );
    include "person_description.php";
    

    In person_description.php setzt Du die Existenz von $TDATA (für Template Data) voraus und baust das HTML dafür auf. Eine ordentliche Strukturierung von TDATA ist Voraussetzung, dass das funktioniert, das setzt etwas Nachdenken voraus und eine einheitliche Struktur der Seiten.

    Wenn Du dann das Wort "Questbezug" ändern willst, änderst Du nur das Template.

    Es gibt auch fertige Template-Systeme.

    Rolf

    --
    sumpsi - posui - obstruxi