zur Startseite

Druckausgabe von https://privat.albicker.org
Iveco Daily 4x4, Hunde und multithematisches Blog - Bernhard Albicker

Hugo und PHP? (Teil 2)

veröffentlicht am 14.03.2019 mit 798 Worten - Lesezeit: 4 Minute(n)

Eine Crux mit statischen Webseiten ist … sie sind statisch. Und genau daraus ergeben sich ja auch die entscheidenden Vorteile dieses Webseitentyps.

So hatte ich den ersten Artikel zum Thema PHP in Hugo begonnen.

Die eingebaute Lösung in Hugo

PHP-Quelltext im Hauptteil der Seite

Wie im ersten Artikel möchte ich auch hier zunächst von der einfachen Variante einer Verarbeitung von Nutzereingaben in ein Webformular ausgehen: - Benutzereingaben in ein Webformular - Prüfung auf dem Webserver auf - Vollständigkeit - korrekte Eingaben - Rückmeldung an den Benutzer bei Fehlern, dabei Speicherung der bereits korrekten Eingaben - Rückmeldung an den Benutzer bei erfolgreichem Abschluß der Aktion - das Ganze optisch eingebettet in das Design der Webseite - wartungsarm, d. h. Template-Änderungen (Design, Navigationselemente) sollen automatisch auch auf die interaktiven Seiten übernommen werden.

Voraussetzungen

  1. der PHP-Code sowie das Formular muß in ein normales Markdown-Dokument eingetragen werden, das im content -Verzeichnis liegt. Dadurch wird es von Hugo in ein Template übernommen (also optisch und strukturell in die Webseite eingebettet)
  2. nach dem Übertragen auf den Server muß das Script auch ausgeführt werden können

Lösung unter Zuhilfenahme von ‘Shortcodes’

Hugo übersetzt beim Rendern (Exportieren) einer Webseite den in Markdown geschriebenen Inhalt in HTML:

  1. reines Markdown wird übersetzt
  2. HTML wird “durchgereicht”
  3. HTML innerhalb Markdown: Das Markdown wird übersetzt, das darin eingebettete HTML wird übernommen
  4. ABER: Markdown (oder etwas beliebig anderes) innerhalb HTML: wird “durchgereicht”

Ein normales Seitendokument sieht so aus:

+++
title         = "Ein Blog mit Hugo erstellen - Teil 2"
date         = "2015-12-28T22:25:17+01:00"
categories     = ["Webseiten"]
tags         = ["Hugo", "Tutorial"]

+++

und hier steht dann der Inhalt der Seite

Würde man jetzt im Seiteninhalt einfach Programmcode notieren, dann bestünde die Gefahr, daß Hugo versucht, daraus HTML zu erstellen und damit den Code zu verstümmeln.

Deshalb setzte ich den kompletten Seiteninhalt in einen Container, aber im Gegensatz zu der im ersten Artikel beschriebenen Methode, die quasi einen “Dreckeffekt” nutzt, sieht die offizielle Lösung so aus:

+++
title         = "Kontaktformular"
date         = "2015-12-28T22:25:17+01:00"
+++

{{< php >}}
 
    <?php
        require_once("../php/phpmailer/class.phpmailer.php");
        require_once("../php/phpmailer/class.smtp.php");
            
        //Programmablauf
        if ($_POST['Submit']) 
        {
            // Formularverarbeitung
            *** einiger Programmcode ***
             //mail-Übermittlung
                // Rückgabe auf den Benutzerbildschirm
                formDisp();
                formMail();
         }
    ?>

{{< /php >}}

<form action="<?php echo $PHP_SELF; ?>" method="POST" accept-charset="UTF-8">
    <fieldset><i>Ansprechpartner/-in</i><br>
    <label>Name:</label>  <input name="Name" value="" size="25" maxlength="80" type="Text"><br>
    <label>e-mail:</label>    <input name="eMail" value="" size="25" maxlength="80" type="Text"><br>
    </fieldset>
    <p>Ihre Mitteilungen oder Wünsche:</p>
    <textarea name="Mitteilung" cols="35" rows="5" wrap="virtual"></textarea>
    <input name="Submit" value="Abschicken" type="Submit">
</form>

Der Container wird hier aus den Elementen {{< php >}} und {{< /php >}} gebildet. Damit Hugo nun weiß, was damit zu tun ist, muß der ‘Shortcode’, also eine Art ‘Code-Abkürzung’ im Template-Verzeichnis definiert werden.

Dazu wird im Theme-Ordner eine Datei layouts/shortcodes/php.html angelegt. Deren Inhalt besteht aus

{{ .Inner | safeHTML }}

was bewirkt, daß alles innerhalb der obigen Container-Begrenzungen unverändert “durchgereicht” wird.

Korrekte Verlinkung der Datei

Die fertige Datei wird als Markdown-Dokument im contentVerzeichnis abgelegt, z. B. als kontakt.md.
Diese Datei wird mit Hilfe der Seitenvariable .Url im Kopf der Markdown-Datei (Frontmatter) als php-Datei mit Pfad und Name definiert mittels einer zusätzlichen Zeile mit der Angabe url = "{Pfad/Dateiname}".

+++
title        = "Kontaktformular"
date         = "2015-12-28T22:25:17+01:00"
url          = "/kontakt/formular.php"
+++

>>>Seiteninhalt<<<

So läßt sich die Datei kontakt.md zum Beispiel als http://www.domain.tld/kontakt/formular.php ausgeben. Alle internen Links in den von Hugo erstellten Menüs verweisen dann automatisch auf das richtige Ziel.

PHP-Code im Header einer Seite

Manchmal ist es nötig, PHP-Code in den Header einer HTML-Seite so einzubauen, daß er ausgeführt wird, bevor irgendetwas von der restlichen Seite ausgegeben oder ausgeführt wird. Wenn dieser PHP-Code auf allen Seiten gleich sein soll/darf, dann könnte das so aussehen im Template des gewählten Themes:

{{ "<?php echo \"Quelltext vor dem Doctype html\" ?>" | safeHTML }}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">

Wenn dieser PHP-Code aber nur auf wenigen Seiten gebraucht wird oder auch noch auf manchen Seiten unterschiedlich sein soll, dann ist ein anderes Vorgehen nötig:

Hierfür lege ich im Ordner static den Unterordner php an. Den benötigten Code trage ich dann dort in eine Datei filename.php ein.

Im Markdownfile trage ich im Header die zusätzliche Seitenvariable phpfile ein:

+++
phpfile      = "/static/php/filename.php"
title        = "Kontaktformular"
date         = "2015-12-28T22:25:17+01:00"
url          = "/kontakt/formular.php"
+++

>>>Seiteninhalt<<<

Wichtig ist hier der komplette Pfad im lokalen Verzeichnis, d. h. /static muß enthalten sein.
Im Template des Themes werden dann an der benötigten Stelle die folgenden ersten drei Codezeilen platziert:

{{ with .Params.phpfile }}
  {{- . | readFile | safeHTML -}}
{{ end }}

<!doctype html>
(...)

Das with in der ersten Zeile bewirkt, daß der Codeblock nur dann ausgeführt wird, wenn im Markdown-File der jeweiligen Seite im Dateikopf tatsächlich ein Eintrag namens phpfile vorhanden ist.

Zusammenfassung

Um auf einer durch einen statischen Webseitengenerator, hier: Hugo, erstellten Webseite wenige interaktive Einzelseiten unterzubringen, bieten sich verschiedene kombinierbare Lösungsansätze an, je nachdem, ob der PHP-Quelltext seiner Natur nach im head oder body der fertigen Seite erscheinen soll.