PHP - alles in einen großen PHP Befehl packen?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du packst den ganzen Code in einen PHP Variable und Echost diese dann aus. Fertig.


Maddoc66  28.01.2022, 11:01

also in etwas so

<? php

$myContent = "lalalala"; // hier kommt dein Code von oben rein

echo $myContent;

0
Maddoc66  28.01.2022, 11:11
@Maddoc66

deine Variablen musst du dann natürlich ganz normal in den String einfügen.

href="index.php?page=home&amp;lang=<?php echo $langKey; ?>">

würde dann zu

"href="index.php?page=home&amp;lang=".$langKey

   

1
Federschwinge 
Fragesteller
 28.01.2022, 12:10
@Maddoc66

Ich versteh das schon, aber machts das nicht an sich einfach nur unheimlich komplizierter?

0
Federschwinge 
Fragesteller
 28.01.2022, 12:11
@Federschwinge

Komplizierter vielleicht das falsche Wort, aber es erzeugt ja mehr unnötigen Code als das

1
Maddoc66  28.01.2022, 12:19
@Federschwinge

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.

0
Maddoc66  28.01.2022, 12:22
@Maddoc66

aus

<li><a class="navtext <?php echo ($page == 'home.php') ? "active":"" ?>"

würde

$mycontent .= '<li><a class="navtext"'. ($page == 'home.php') ? "active":"";

es bleibt also in etwa gleich.

2
Federschwinge 
Fragesteller
 31.01.2022, 11:03
@Maddoc66

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&amp;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)

0
Maddoc66  31.01.2022, 11:52
@Federschwinge

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.

0

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() ?>&amp;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.

https://twig.symfony.com/doc/3.x/

Woher ich das weiß:Berufserfahrung – Web Developer bei einem mittelständischen Portalbetreiber

Federschwinge 
Fragesteller
 28.01.2022, 11:13

Danke aber sowas nützt mir nicht viel weil ich es nicht installieren darf :)

1
LeBonyt  28.01.2022, 11:15
@Federschwinge

Sorry wusste ich nicht. Twig ist kein Programm, was man installiert, sondern eine Bibliothek/Framework.

0
Federschwinge 
Fragesteller
 28.01.2022, 11:59
@LeBonyt

Ja das hatte ich gesehen, aber da stehts ja auch dass es installiert wird

0
LeBonyt  28.01.2022, 12:52
@Federschwinge

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.

0

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' : '' ?>"
Woher ich das weiß:Berufserfahrung – Entwickle Webseiten seit über 25 Jahren.