PHP - alles in einen großen PHP Befehl packen?
Heya!
Einmal noch ne "kleine" Frage zu PHP.
Ich soll meine Nav so umschreiben, dass es komplett in einem großen PHP "Container" ist und nicht html kommt, php, dann wieder html, wieder php
Habs bisschen mittels echo probiert aber anscheinend ist das nicht komplett zielführend wie ich das dachte
Der Code:
<ul class="nav">
<li><a class="navtext <?php echo ($page == 'home.php') ? "active":"" ?>"
href="index.php?page=home&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_HOME']; ?>
</a></li>
<li><a class="navtext <?php echo ($page == 'ueberuns.php') ? "active":"" ?>"
href="index.php?page=ueberuns&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_ABOUT_US']; ?>
</a></li>
<li><a class="navtext <?php echo ($page == 'karriere.php') ? "active":"" ?>"
href="index.php?page=karriere&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_CARRER']; ?>
</a></li>
<li><a class="navtext <?php echo ($page == 'blog.php') ? "active":"" ?>"
href="index.php?page=blog&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_BLOG']; ?>
</a></li>
<li><a class="navtext <?php echo ($page == 'kontakt.php') ? "active":"" ?>"
href="index.php?page=kontakt&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_CONTACT']; ?>
</a></li>
<li><a class="navtext <?php echo ($page == 'team.php') ? "active":"" ?>"
href="index.php?page=team&lang=<?php echo $langKey; ?>">
<?php echo $lang['MENU_TEAM']; ?>
</a></li>
</ul>
4 Antworten
Du packst den ganzen Code in einen PHP Variable und Echost diese dann aus. Fertig.
Ich versteh das schon, aber machts das nicht an sich einfach nur unheimlich komplizierter?
Komplizierter vielleicht das falsche Wort, aber es erzeugt ja mehr unnötigen Code als das
ich denke die Größe des Codes ändert sich nicht großartig, allerdings ist die Wartbarkeit besser als bei PHTML Dateien, zumindest empfinde ich das so.
Sorry das es so spät kommt, ich war ja im Wochenende.
hab das erste nun mal für sich genommen und es zu testen und ganz funkt es nicht, hab ich da irgendwo nochn Denkfehler drin
<?php
$myContent = '<ul class="nav">
<li><a class="navtext.($page == 'home.php') ? "active":"" "
"href=index.php?page=home&lang=".$langKey. "
$lang['MENU_HOME'] </a></li>';
echo $myContent;
?>
Fehler ist in der zweiten Reihe mit li a class und so, syntax error, unexpected identifier (T_String)
du musst, bevor du eine Variable in deinen String einfügst, den String beenden und danach wieder neu eröffnen. Zwar gibt es auch eine andere Möglichkeit welche ich aber aus gründen der Lesbarkeit nicht empfehle.
die Syntax ist
$myStringe = 'ich bin ein string'.$eineVariable.'hier geht der string weiter';
<li><a class="navtext'.($page == 'home.php') ? "active":"".' "
die Zeile müsste so aussehen. Des weiteren hast du hinter der eingefügten Variable hier auch den punkt vergessen.
Von einer HTML-Ausgabe via echo/print würde ich deutlich abraten. Auf diese Weise würde man HTML und PHP nicht mehr klar trennen.
Der HTML-Code würde nur noch in String-Literalen eingepfercht werden, die vom Code Editor auch nicht mehr wie HTML-Code interpretiert werden. Folglich gäbe für diese Abschnitte kein sinnvolles Syntax Highlighting und hinzu kommt evt. noch das Maskierungsproblem von Anführungszeichen. Denke nur einmal an die Fälle, wo du mehr als zwei Typen an Anführungszeichen benötigst:
<div style="background-image: url('<?= $imagePath ?>')">
Kurzum baut man sich auf diese Weise mehr potenzielle Fehlerquellen, als nötig.
Was bei deinem Code allerdings Sinn machen würde, wäre eine Ausgabe des Menüs via Schleife.
Du bräuchtest eine Klasse, die ein Navigationsitem abbildet und ein Array, in dem die konkreten Objekte abgelegt werden.
Das könnte folgendermaßen aussehen:
class NavigationItem {
private readonly string $langKey;
private readonly string $pageKey;
public function __construct(string $pageKey, string $langKey) {
$this->langKey = $langKey;
$this->pageKey = $pageKey;
}
public function getLangKey(): string {
return $this->langKey;
}
public function getPageKey(): string {
return $this->pageKey;
}
public function isActive(string $page): bool {
return $page === $this->pageKey . ".php";
}
}
$navigationItems = array(
new NavigationItem("home", "MENU_HOME"),
new NavigationItem("ueberuns", "MENU_ABOUT_US"),
/* ... */
);
Beachte: Das Schlüsselwort readonly ist erst ab PHP 8.1 verfügbar und die Typisierungen seit Version 7.4.
Die Ausgabe würde so aussehen:
<ul class="nav">
<?php foreach ($navigationItems as $navigationItem): ?>
<li>
<a class="navtext <?= $navigationItem->isActive($page) ? "active" : "" ?>" href="index.php?page=<?= $navigationItem->getPageKey() ?>&lang=<?= $langKey ?>">
<?= $lang[$navigationItem->getLangKey()] ?>
</a>
</li>
<?php endforeach; ?>
</ul>
Ich bevorzuge an der Stelle Shorthands <?= ?> und die alternative Syntax foreach: ... endforeach, denn sie passt sich dem HTML-Code äußerlich mehr an.
Zurecht hast du die Mischung von Code und HTML beanstandet.
Du kannst den HTML Code als verketteter String einer Variable zuweisen und dann mit echo ausgeben.
Heute verwendet man sogenannte Template Systeme. Die bekanntesten sind wohl Smarty und Twig. Wir verwenden Twig.
Danke aber sowas nützt mir nicht viel weil ich es nicht installieren darf :)
Sorry wusste ich nicht. Twig ist kein Programm, was man installiert, sondern eine Bibliothek/Framework.
Ja das hatte ich gesehen, aber da stehts ja auch dass es installiert wird
Ja aber kann mit dem PHP Paketverwalter composer installiert werden. Muss man aber nicht. Wie gesagt das ist die professionelle Lösung. Mach das einfach so wie Maddoc. Wollte nur darauf hinweisen.
Deine Schreibweise ist vollkommen korrekt und es spricht nichts dagegen, PHP direkt in HTML zu packen. Das ist sogar die ursprüngliche Intention von PHP gewesen und damit wird der Code auch nicht unübersichtlicher, als wenn man sich das HTML in einem String bastelt und dann ausgibt.
Du kannst es sogar noch etwas verkürzt und übersichtlicher ohne echo schreiben:
<a class="navtext<?= ($page == 'home.php') ? ' active' : '' ?>"
also in etwas so
<? php
$myContent = "lalalala"; // hier kommt dein Code von oben rein
echo $myContent;